Erstes Assembler Programm



  • Hallo,
    ich bin momentan dabei mich mit Assembler zu beschäftigen, habe mir auch extra dafür ein Buch gekauft doch leider taucht schon das erste Problem bei meinem ersten Programm auf. Das folgende Beispiel habe ich 1:1 direkt aus dem Buch übernommen:

    DATEN   SEGMENT
    
    Meldung db "Assembler ist gar nicht so schwer."
            db "$"
    
    DATEN   ENDS
    
    CODE    SEGMENT
    
            ASSUME CS:CODE,DS:DATEN
    
    Anfang: mov ax,DATEN
    
            mov ds,ax
    
            mov dx,offset Meldung
    
            mov ah,9
    
            int 21h
            mov ah,4Ch
    
            int 21h
    
    CODE    ENDS
    
            END Anfang
    

    Doch ich bekomme bei diesem Code beim assemblieren schon diese Fehlermeldung:

    C:\Users\c0de\Assembler\asm1.asm(21) : error A2088: END directive required at end of file
    C:\Users\c0de\Assembler\asm1.asm(21) : fatal error A1010: unmatched block nesting : CODE

    Kann mir jemand weiterhelfen und mir erklären wo da der Fehler ist?
    Vielen Dank!



  • Wäre noch schön gewesen, Betriebsystem und Compiler zu wissen, um vernünftige Antwort zu schreiben.

    Das Hauptproblem ist die old-style-Masm-Syntax in dem Buch. Geschrieben ist das Beispiel für Masm 5 oder so und für 16bit Realmode, und wenn es das Backerbuch ist, das du hast, das ist auch nicht wirklich zum Erlernen, sondern eher zum Nachschlagen und Auswendiglernen.

    16bit und Realmode sind soweit in Ordnung, aber man darf bezweifeln, dass du mit einem alten 16bit masm-compiler compiliert hast. Wenn du ein 32bit-Windows hast, dann kannst du das Windows(bzw Dos)- Programm debug für den Programmaufbau benutzen, debug klärt dich weitgehend über Segmentierung und Adressierung auf. Eine schnelle Übersicht über Debugbefehle hier:
    http://www.lehrer.uni-karlsruhe.de/~za250/inf/debug/Einf_Debug.html

    Mit Debug würde dein Programm bzw, die Erstellung und Prüfung etwa so aussehen:

    C:\Users\gc>debug
    -r
    AX=0000 BX=0000 CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
    DS=1AD1 ES=1AD1 SS=1AD1 CS=1AD1 IP=0100 NV UP EI PL ZR NA PE NC
    1AD1:0100 C3                RET
    -a
    1AD1:0100 mov ah,09
    1AD1:0102 mov dx,109
    1AD1:0105 int 21
    1AD1:0107 int 20
    1AD1:0109
    -e109 "Assembler ist am Anfang oft gar nicht so schwer, wie es scheint$"
    -d
    1AD1:0100  B4 09 BA 09 01 CD 21 CD-20 41 73 73 65 6D 62 6C ......!. Assembl
    1AD1:0110  65 72 20 69 73 74 20 61-6D 20 41 6E 66 61 6E 67 er ist am Anfang
    1AD1:0120  20 6F 66 74 20 67 61 72-20 6E 69 63 68 74 20 73  oft gar nicht s
    1AD1:0130  6F 20 73 63 68 77 65 72-2C 20 77 69 65 20 65 73 o schwer, wie es
    1AD1:0140  20 73 63 68 65 69 6E 74-24 00 00 00 00 00 00 00  scheint$.......
    1AD1:0150  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
    1AD1:0160  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
    1AD1:0170  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
    -g
    DPMI entry hooked, new entry=13F1:2C2F
    Assembler ist am Anfang oft gar nicht so schwer, wie es scheint
    Program terminated normally (0000)
    -
    

    Du kannst aber eigentlich völlig auf die Segmentierung (inkl Stacksegment) verzichten, da du am Anfang kaum größere Programme schreiben wirst. Hier reicht das .com Format.
    Mit dem recht aktuellen Assembler fasm lassen sich .com-Progamme kinderleicht erstellen, man muß nur wissen, dass bzw. warum com-proggies erst ab Zeile 100 anfangen, und schon gehts los (der Hinweis org 100h reicht fasm, automatisch erstellt der Assembler das com-proggi (Später, wenn du richtige Windows programme erstellen willst, fällt die Segmentierung wie bei dem com-proggis flach):

    (mit fasmw)

    org 100h
    mov ah,09      
    mov dx,Meldung
    int 21h         ;Ausgabe
    int 20h         ;Programmende
    
    Meldung db "Assembler ist gar nicht so schwer",24h
    


  • Wäre noch schön gewesen, Betriebsystem und Compiler zu wissen, um vernünftige Antwort zu schreiben.

    Betriebssystem ist Windows Vista 64- Bit und Compiler ist MASM.
    Und das folgende Buch benutze ich:

    http://www.amazon.de/Assembler-Maschinennahes-Programmieren-Anfang-Windows-Programmierung/dp/3499612240/ref=sr_1_1?ie=UTF8&qid=1306135038&sr=8-1

    Also kann ich nicht so einfach jetzt die Codebeispiele assemblieren?



  • Nein, das Buch ist zwar aus gutem Grund für 16bit DOS-Assembler geschrieben, aber 64bit Windows unterstützt kein 16bit DOS mehr. D.h. dir bleibt nichts anderes übrig, auf einen Emulator zurückzugreifen (z.B. Dosbox) oder ein Dosbootdiskette oder(6.22 o.ä.) oder eben an einem anderen PC mit 32bit Windows zu lernen.



  • Lad dir TASM runter dann müsste es auch mit Vista 64Bit klappen. ( Geht zumindest bei meinem Windows 7 Pro 64Bit )

    TASM download:
    http://www.phatcode.net/downloads.php?id=280



  • ob nun Win64 oder nicht - das Problem schein einfach zu sein, das er eine masm Version (> 5.x?) benutzt die nicht standardmäßig von 16Bit DOS Code ausgeht -> schau dir mal die .MODEL-Direktive an. In dem zusammen hang empfiehlt sich auch der Wechsel zu jWasm (~99.999% masm Kompatibel) - mit dem kann man ebenfalls 16Bit Prog. erstellen:

    jwasm /mz DeinQuellcode.asm
    

    -> DeinQuellcode.exe
    Zum Ausführe brauchst du, wie schon gesagt, DOSBox

    masm



  • Kannst auch mal hier schauen: http://www.henkessoft.de/Assembler/Assembler.htm



  • Erhard Henkes schrieb:

    Kannst auch mal hier schauen: http://www.henkessoft.de/Assembler/Assembler.htm

    Das Buch, aus dem das Beispiel entnommen wurde, geht wesentlich weiter.

    Es wäre aktuell vielleicht sinnvoll, diese Art von Beispielen auf Unix-Konsole zu übertragen, da im 64bit Modus kein Virtual Mode verfügbar ist, der einfache Konsoledos-Programme unter 64bit Windows oder Linux erlaubt. D.h, der Zugriff auf erweiterter Register (MMX/SSE/AVX), der unter 32bit Virtuell gegeben ist, fällt erstmal flach. Und DosBox kann die sowieso nicht, ganz zu schweigen von
    sowas hier:
    http://geezer.osdevbrasil.net/osd/boot/vcpi.asm



  • nachtfeuer schrieb:

    da im 64bit Modus kein Virtual Mode verfügbar ist, der einfache Konsoledos-Programme unter 64bit Windows oder Linux erlaubt. D.h, der Zugriff auf erweiterter Register (MMX/SSE/AVX), der unter 32bit Virtuell gegeben ist, fällt erstmal flach

    Sowohl Windows als auch Linux (das du ganz offensichtlich nicht zu kennst scheinst) haben eine Konsole zur textbasierten Ein- und Ausgabe! Und die genannten Befehlserweiterungen werden ebenfalls unterstützt (zumindest mit einer einigermaßen aktuellen Version)



  • Darum ging es hier nicht.



  • nachtfeuer schrieb:

    Darum ging es hier nicht.

    worum den dann? Und was spricht den gegen DOSBox?


Anmelden zum Antworten