ich bringe es nicht...



  • so irgendwie schaffe ich nicht diesen code hier...

    CSEG segment
    org 100h
    
    Begin:
    
       mov ah,9
       mov dx,offset Message
       int 21h
    
       int 20h
    
    Message db 'Hello, world!$'
    
    CSEG ends
    end Begin
    

    mit hilfe von masm 's qeditor zu assemblen ohne fehler -( dabei kommt folgendes raus...

    Microsoft (R) Macro Assembler Version 6.14.8444
    Copyright (C) Microsoft Corp 1981-1997. All rights reserved.

    Assembling: C:\masm32\project\00C\hello.asm
    C:\masm32\project\00C\hello.asm(15) : warning A4023: with /coff switch, leading
    underscore required for start address : Begin
    Microsoft (R) Incremental Linker Version 5.12.8078
    Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

    hello.obj : fatal error LNK1190: invalid fixup found, type 0x0001
    _
    Link error
    Drücken Sie eine beliebige Taste . . .

    kommt halt dabei raus wenn ich auf Project -> Assembly&Link gehe -(

    könnte mir jemand vll sagen wie man mit masm etwas assembliert und danach auch richtig linkt? so ne art mini einführung ?



  • Microsoft (R) Macro Assembler Version 6.14.8444
    Copyright (C) Microsoft Corp 1981-1997. All rights reserved.

    Assembling: C:\masm32\project\00C\hello.asm
    C:\masm32\project\00C\hello.asm(15) : warning A4023: with /coff switch, leading
    underscore required for start address : Begin
    Microsoft (R) Incremental Linker Version 5.12.8078
    Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

    hello.obj : fatal error LNK1190: invalid fixup found, type 0x0001
    _
    Link error
    Drücken Sie eine beliebige Taste . . .

    Also ich kenn mich mit Assembler nicht wirklich gut aus, aber der Meldung zufolge würde ich sagen, dass der einen Punkt vor Begin erwartet:

    .Begin:
    


  • Link error

    16-bit Programm mit einem 32-bit Linker zu linken geht nicht so gut 😉
    allerdings wurde schon hier:
    http://board.codingcrew.de/viewtopic.php?t=190&highlight=
    darauf eingeganen.
    Deshalb bleibt auch:
    http://board.codingcrew.de/viewtopic.php?t=219
    unbeantwortet.
    Auch hier im Forum gab es die Frage schon häufiger (seltsamer weise findet die Suchfunktion die nicht<- keine ironie)
    http://c-plusplus.net/forum/viewtopic-var-t-is-108963-and-highlight-is-masm.html



  • @freaked

    sobald ich heute zuhause bin werde ich es ausprobieren!

    @CDW

    ich danke dir vielmals für die links!



  • also wenn ich da nen punkt vor Begin mache dann kommt folgendes...

    Microsoft (R) Macro Assembler Version 6.14.8444
    Copyright (C) Microsoft Corp 1981-1997. All rights reserved.

    Assembling: C:\masm32\project\00C\hello.asm
    C:\masm32\project\00C\hello.asm(4) : error A2008: syntax error : .
    C:\masm32\project\00C\hello.asm(15) : error A2006: undefined symbol : Begin
    _
    Assembly Error
    Drücken Sie eine beliebige Taste . . .

    CSEG segment
    org 100h
    
    .Begin:
    
    	mov ah,9
    	mov dx,offset Message
    	int 21h
    
    	int 20h
    
    Message db 'Hello, world!$'
    
    CSEG ends
    end .Begin
    

    das mit dem linker 16 BIT, klappt auch irgendwie nicht, ich habs probiert und zwar, bin mal ins masm ordner bin rein und habe den eigentlichen LINK.EXE kurz umbennant ins LINKx.EXE und habe darein den anderen 16 BIT linker reingeladen mit dem namen LINK.EXE logisch denke ich mal, weil dann assembliert ja der QEDITOR damit, naja aber bekomme trotzdem fehler z. B. bei dem s. o. code kommt dabei sowas raus...

    Microsoft (R) Macro Assembler Version 6.14.8444
    Copyright (C) Microsoft Corp 1981-1997. All rights reserved.

    Assembling: C:\masm32\project\00C\hello.asm
    C:\masm32\project\00C\hello.asm(4) : error A2008: syntax error : .
    C:\masm32\project\00C\hello.asm(15) : error A2006: undefined symbol : Begin
    _
    Assembly Error
    Drücken Sie eine beliebige Taste . . .

    und wenn ich den code schreibe ohne den punkt(.) vor dem Begin dann kommt folgendes raus...

    Microsoft (R) Macro Assembler Version 6.14.8444
    Copyright (C) Microsoft Corp 1981-1997. All rights reserved.

    Assembling: C:\masm32\project\00C\hello.asm
    C:\masm32\project\00C\hello.asm(15) : warning A4023: with /coff switch, leading
    underscore required for start address : Begin

    Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994
    Copyright (C) Microsoft Corp 1984-1993. All rights reserved.

    LINK : warning L4017: /SUBSYSTEM : unrecognized option name; option ignored
    LINK : warning L4017: /OPT : unrecognized option name; option ignored
    Run File [c:hello.exe]:

    habe irgendwie kein plan was ich jetzt machen soll...



  • Moin raycon,

    das MASM-Paket ist auf die Entwicklung von Win32-Anwendungen zugeschnitten. Die von Dir angesprochenen Menüeinträge zum Assemblieren etc. rufen Skripte auf, die Win32-Anwendungen erzeugen.

    Für DOS-Anwendungen musst Du den Assembler und den 16-Bit-Linker von Hand aufrufen.

    Normalerweise lauten die Aufrufe:

    ml /c DeinProgramm.asm
    link16 DeinProgramm.obj;

    Du kannst aber auch ein Skript erstellen, um das zu automatisieren oder Makefiles nutzen.

    Ein Beispiel für ein Übersetzungsskript findest du unter dem Link:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-38987-and-highlight-is-gedicht.html

    Das drittletzte Posting enthält ein Beispiel. Das Skript verwendet den Linker alink. Setze hier den Namen des Linkers ein, den Du verwendest.

    Ciao...



  • moin moin Kal El,

    nunja, ich habe jetzt folgendes gemacht mir den 16BIT linker in meine bin rein, bzw war ja schon vorher drin, in meinem project ordner sprich in dem ordner wo sourcecode drin ist, die batch datei gemacht, eben die was unter deinem link war bzw etwas modifiziert und zwar...

    @echo off
    
    if exist %1.obj del %1.obj
    if exist %1.exe del %1.exe
    
    \masm32\bin\ml /c %1.asm
    if errorlevel 1 goto asmerror
    
    \masm32\bin\link16 %1.obj
    if errorlevel 1 goto linkererror
    
    dir %1.*
    goto ende
    
    :linkererror
    echo _
    echo FEHLER: Linker
    goto ende
    
    :asmerror
    echo _
    echo FEHLER: Assembler
    goto ende
    
    :ende
    
    pause
    

    aus alink habe ich link16 gemacht! nunja habe jetzt fogendes gemacht, aus den Eingabeaufforderungen...

    C:\masm32\project\00C>dir
    Volume in Laufwerk C: hat keine Bezeichnung.
    Volumeseriennummer: 141D-7126

    Verzeichnis von C:\masm32\project\00C

    14.07.2005 22:50 <DIR> .
    14.07.2005 22:50 <DIR> ..
    14.07.2005 22:43 344 doexe.bat
    14.07.2005 13:53 148 hello.asm
    2 Datei(en) 492 Bytes
    2 Verzeichnis(se), 77.954.351.104 Bytes frei

    C:\masm32\project\00C>doexe.bat hello
    Microsoft (R) Macro Assembler Version 6.14.8444
    Copyright (C) Microsoft Corp 1981-1997. All rights reserved.

    Assembling: hello.asm

    Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994
    Copyright (C) Microsoft Corp 1984-1993. All rights reserved.

    Run File [hello.exe]:
    List File [nul.map]:
    Libraries [.lib]:
    Definitions File [nul.def]:
    LINK : warning L4021: no stack segment
    Volume in Laufwerk C: hat keine Bezeichnung.
    Volumeseriennummer: 141D-7126

    Verzeichnis von C:\masm32\project\00C

    14.07.2005 13:53 148 hello.asm
    14.07.2005 22:51 791 hello.exe
    14.07.2005 22:51 83 hello.obj
    3 Datei(en) 1.022 Bytes
    0 Verzeichnis(se), 77.954.342.912 Bytes frei
    Drücken Sie eine beliebige Taste . . .

    C:\masm32\project\00C>hello.exe

    C:\masm32\project\00C>

    naja, 2 probleme gibt es jetzt nur noch, die eine ist mit der Warnung und das andere ist es, wo bleibt die konsolen ausgabe? 😃 aber ich glaube das, das 2 problem mit dem ersten zusammenhängt...

    danke noch mal!

    //edit

    übrigens, wollte gerade diesen code hier ausprobieren...

    .model tiny                 ;nur ein kleines Programm
     .code                       ;hier steht der code
     org 100h                    ;wir basteln ne COM Datei
    
     START:                      ;Label zum verzieren
    
     mov ah, 0h                  ;wir ändern den Bildschirmmodus
     mov al, 12h
     int 10h
    
     lea si, HelloWorld          ;si zeigt auf unseren String
     mov cx, lenght              ;cx = Stringlänge
    
     LoopIt:
      push cx                    ;cx speichern
      lodsb                      ;Buchstaben des Strings in al lesen
    
      mov ah, 2h                 ;Cursor setzen
      mov bh, 0h                 ;auf Page 0
      mov dh, 2h                 ;Zeile
      mov dl, byte ptr XXX       ;XXX ist die Spalte
      int 10h
      inc byte ptr XXX           ;Farbe erhöhen
    
      mov ah, 09h                ;Farbiger Charakter ausgeben
      mov bh, 0h                 ;Page 0
      mov bl, byte ptr XXX       ;Farbe
      mov cx, 1h                 ;schreibe ihn einmal..
      int 10h  
    
     pop cx                      ;cx laden
     loop LoopIt                 ;wiederholen, bis der komplette 
                                 ;String geschrieben ist
    
     mov ah, 2h                 ;Cursor setzen
     mov bh, 0h                 ;auf Page 0
     mov dh, 3h                 ;Zeile
     mov dl, 3h                 ;Spalte
     int 10h
    
      mov ah,1h                  ;auf Tastatureingabe warten
      int 21h
    
      mov ah, 4Ch
      INT 21h                    ;Beende !
    
     HelloWorld db 'Hello World !!'   ;Unser String..
     lenght equ $ - offset HelloWorld
     xxx db 0h
    
     END START                   ;hier ist das ganze zuende..
    

    dabei bekamm ich ähnlichen oder selben fehler wie beim dem hello code, und zwar diesen hier...

    LINK : warning L4021: no stack segment

    irgendwie verstehe ich die warnung nicht...



  • Hm, kannst du Englisch 😕

    Die Ausgabe sagt doch alles. No stack segment -> kein Segment für einen Stack. Du benutzt push und pop um Daten auf den Stack zu schieben und wieder zu lesen, hast aber keinen Stack definiert. Wo soll das Programm die Daten jetzt hinschieben?



  • Die Meldung kannst Du getrost ignorieren - zumindest solange model TINY verwendet wird (und die besagt dass man eigentlich eine COM haben möchte). Denn da beginnt der Stack bei 0ffffh und wächst nach oben - der Applikation entgegen. Bei dem kleineren Code sollte es keine Probleme geben, da er keinen Stack verwendet. Die Warnung verschwindet auch wenn man den Linker richtig aufruft (siehe unten).

    Um eine Ausgabe auch zu sehen: dein Programm von Kommandozeile aus aufrufen 😉 (zumindest das kleine). Oder eben eine Lesefunktion einbauen, so dass das Programm nach der Ausgabe nicht eben geschlossen wird.
    Imho sind beide Queltexte für COM dateien (oder wozu sonst soll das org 100 da sein? *mich mit 16-bit assembly nicht so auskenn* )
    um auch eine COM zu bekommen.
    Hab jedenfalls Deinen ersten Code assembliert (den ohne Punkt ;)):

    CSEG segment
    org 100h
    
    Begin:
    
        mov ah,9
        mov dx,offset Message
        int 21h
    
        int 20h
    
    Message db 'Hello, world!$'
    
    CSEG ends
    end [b]Begin[/b]
    

    ml /AT /c test.asm
    AT steht dafür dass man hier COM haben will, /c verhindert den linker aufruf
    linken:
    link /TINIY test.obj
    und voila, eine coole 23 byte große COM kommt raus.
    ist man zu faul diese aus der Konsole aufzurufen, muss man nur nach der int 21h noch

    mov ah,1
    int 21h
    

    einfügen.
    möchtest Du stattdessen Exen erstellen: lass eben AT und Tiny weg.
    zum zweiten code:
    mit denselben aufrufen klappts bei mir auch - und die Ausgabe sieht man dann auf jedenfall 😉
    Viel Spass noch mit der DOSe



  • Moin CDW,

    CDW schrieb:

    Denn da[im Modell Tiny] beginnt der Stack bei 0ffffh und wächst nach oben - der Applikation entgegen.

    Das ist aber ein böser Fehler. Der Stack beginnt nicht (in Worten: nicht) bei Adresse 0x0000 und wächst dann nach oben, weder bei COM noch bei EXE. Per definitionem wächst ein Stack immer von hohen zu niedrigen Adressen.

    Wenn Du ein COM-Programm startest, so ist das Register SP mit dem Wert 0xfffe belegt. Pusht Du nun einen (Word-)Wert auf den Stack, so zeigt SP dann auf Adresse 0xfffc, d.h. der Stackpointer wurde um 2 erniedrigt. Der Stack wächst der Anwendung tatsächlich entgegen, aber eben nicht von "unten" sondern von oben, von der höheren Adresse her.

    Ciao...



  • Der Stack beginnt nicht (in Worten: nicht) bei Adresse 0x0000

    hab ich ja niemals behauptet 😉

    CDW schrieb:
    Denn da beginnt der Stack bei 0ffffh

    (der Stackpointer müsste natürlich auf 0fffeh zeigen, damit man die Bytes auf 0fffe und 0ffff adressiert)

    aber eben nicht von "unten" sondern von oben, von der höheren Adresse her

    sorry, da habe ich mich wohl missverständlich ausgedrückt, ich gehe von einem solchen "bildlichen" Speichermodell aus:

    0000
    0100h <-Anwendung
    0130h <-Anwendung
    ...
    fffeh <-Stackanfang (wert im SP) 
    ffffh
    

    also wächst er bei mir von unten nach oben, der Applikation entgegen 😉

    dieses Modell hatte ich damals in der Schule und auch in diversen Debuggern (wie Olly), daran bin ich so gewonnt dass ich nicht bedacht habe dass man es auch anders sehen kann.



  • Moin CDW,

    da habe ich mich wohl verlesen. Sehr merkwürdig...

    Allerdings sollte man mit solchen Bildern des Speicheraufbaus nicht arbeiten, weil sie eben nicht eindeutig sind. Eindeutig ist die Angabe der Adressen.

    Ciao...



  • danke euch, es klappt, bekomme zwar keine exen die dann auch funktionieren, aber ich übe erstmal für DOS und das COM ist ja für DOS -) ach naja, die Warnung ist trotzdem noch da, kann man das irgendwie lösen?



  • Moin raycon,

    die Warnung, dass kein Stacksegment vorhanden ist, erzeugt der Linker, weil Du ihm nicht mitgeteilt hast, dass Du ein TINY-Programm erstellen möchtest. Die korrekten Kommandozeilenparameter lauten:

    ml /AT /c DeinProgramm.asm
    link16 /TINY DeinProgramm.obj,DeinProgramm.com;

    Warum kannst Du keine EXE erzeugen? Hier mal ein Beispiel:

    DATA SEGMENT WORD
    
    MsgText   db 'Tach auch...$'
    
    DATA ENDS
    
    STACK SEGMENT STACK
    
        dw 512 dup(0)
    
    STACK ENDS
    
    CODE SEGMENT WORD
    
    assume CS:CODE,DS:DATA,SS:STACK
    
    start:    mov   ax, SEG DATA
              mov   ds, ax
    
              mov   ah, 09h
              mov   dx, offset MsgText
              int   021h
    
              mov   ax, 04c00h
              int   021h
    
    CODE ENDS
    
    end start
    

    Übersetzen mit:

    ml /c Beispiel.asm
    link16 Beispiel.obj;

    Ciao...



  • Kal El schrieb:

    Moin raycon,

    die Warnung, dass kein Stacksegment vorhanden ist, erzeugt der Linker, weil Du ihm nicht mitgeteilt hast, dass Du ein TINY-Programm erstellen möchtest. Die korrekten Kommandozeilenparameter lauten:

    ml /AT /c DeinProgramm.asm
    link16 /TINY DeinProgramm.obj,DeinProgramm.com;

    Warum kannst Du keine EXE erzeugen? Hier mal ein Beispiel:

    DATA SEGMENT WORD
    
    MsgText   db 'Tach auch...$'
    
    DATA ENDS
    
    STACK SEGMENT STACK
    
        dw 512 dup(0)
        
    STACK ENDS
    
    CODE SEGMENT WORD
    
    assume CS:CODE,DS:DATA,SS:STACK
    
    start:    mov   ax, SEG DATA
              mov   ds, ax
              
              mov   ah, 09h
              mov   dx, offset MsgText
              int   021h
              
              mov   ax, 04c00h
              int   021h
              
    CODE ENDS
    
    end start
    

    Übersetzen mit:

    ml /c Beispiel.asm
    link16 Beispiel.obj;

    Ciao...

    Alles Schrott!

    Ein TINY-Speichermodel mit einem Code und Daten Segment????? 👍
    Bei einem TINY-Speichermodel (*.com Datei) gibt es kein Code/Datensegment!!!
    Daten + Code + Stack liegen alle in einem Segment der max. 64kb groß sein kann 😃 😃 😃
    Oder irre ich mich? 👍

    Dein Beispiel kann man nicht als tiny weder assemblieren noch linken!!!!!!!!



  • Ja, du irrst dich. Was willst du denn sonst machen? Absolute Adressen angeben? Der Linker macht das schon richtig.

    Ich hab das Beispiel zwar nicht ausprobiert, aber es schaut ganz vernünftig aus.



  • Hallo "Keine Ahnung",

    Du machst Deinem Namen wirklich alle Ehre. Aber mir ist es in diesem Thread ja auch schon passiert, dass ich ein Posting nicht richtig gelesen habe.

    Schau Dir mein Posting, das Du so nett zitiert und kommentiert hast, doch nochmal genau an.

    Raycon hatte in seinem Posting davor angegeben, dass er keine EXE erzeugen könne. Das Beispiel, das ich in dem, von Dir als Schrott bezeichneten, Posting angegeben hatte, sollte die Erstellung einer EXE-Anwendung zeigen. Dazu ist das Lesen des Satzes vor dem Listing recht aufschlussreich. Soweit ich nun informiert bin, nutzen unter DOS EXE-Programme die Speichermodelle SMALL, MEDIUM, COMPACT, HUGE oder LARGE. Jedoch nur Programme mit der Endung .COM benutzen das Speichermodell TINY. Das Listing macht irgendwie den EIndruck, als ob es das SMALL-Speichermodell verwendet.

    Wenn Du Dir weiterhin die Kommandos zum Übersetzen des Listings anschaust(am Ende des Postings), wirst Du erkennen, dass ich keine Angaben zur Erzeugung des Speichermodells TINY gemacht habe.

    Des Weiteren läßt ein scharfer Blick auf das Listing erkennen, dass nirgens ein org 100h auftaucht. Das müsste jedoch vorhanden sein, weil es sonst Fehlermeldungen hagelte, wenn ich ein TINY-Programme erstellen wollte und dabei die vollständige Segmentkontrolle verwende.

    Um mit Dieter Nuhrs Worten zu sprechen: Wenn man keine Ahnung hat(oder so heißt), einfach mal die Fresse halten. :p

    Vorzügliche Grüße



  • Stimmt, das hab ich jetzt auch übersehen. Naja, ist auch schon etwas länger her, dass ich DOS-Programme mit Assembler gebaut habe 😉



  • Ja schon gut Leute, ich habs wirklich übersehen, sorry :p

    Ich dachte aus dem Beispielcode sollte eine *.com Datei werden 🙄



  • Wenn Du ein COM-Programm startest, so ist das Register SP mit dem Wert 0xfffe belegt

    Deswegen kann man die Warning allerdings ignorieren. Da beim COM Programm
    nur ein Segment (64KByte) benutzt wird, liegt der Stack Pointer bei
    0xfffe doch ganz gut.

    Warum eigentlich 0xfffe und nicht 0xffff(ok 0x0000), hat das Betriebssystem da schon
    einige Bytes vom Stack benutzt?


Anmelden zum Antworten