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 : CODEKann 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.htmlMit 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: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, DOSBoxmasm
-
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?