Textausgabe unter Windows
-
Hallo,
ich beschäftige mich gerade mit den Grundlagen von Assembler. Die Beispiele in meinem Lehrbuch laufen alle unter MS-DOS. Das Problem ist jedoch, dass ich nur einen PC mit Windows 7 habe, und darauf laufen die alten DOS-Programme leider nicht mehr.
Darum möchte ich jetzt das folgende Windows-Programm als "Grundrahmen" verwenden. Auf diese Weise kann ich zumindest mit den Grundbefehlen von Assembler (mov, add, ...) arbeiten.
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ include \masm32\include\masm32rt.inc ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ comment * ----------------------------------------------------- Build this console app with "MAKEIT.BAT" on the PROJECT menu. ----------------------------------------------------- * .data? value dd ? .data item dd 0 zahl db 5, 0 .code start: ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ call main inkey exit ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ main proc cls mov al, 100 mul zahl ; print zahl print "Hello World",13,10 ret main endp ; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ end start
Der Code funktioniert auch, nur wenn ich versuche mit print eine Zahl auszugeben, Beispiel:
print zahl
, dann läuft das Programm nicht mehr.
Könnt ihr mir sagen wie es richtig funktioniert ?
Vielen Dank für eure Hilfe,
MfG arenas
-
Guck Dir mal die Hilfedatei*
\masm32\help\hlhelp.chm
*an Dort steht, dass das Makroprint
nur Strings ausgibt. Wenn der String in einer Variable ist, dann mussprint
ein Pointer übergeben werden:... zahl db "5", 0 ; Null-terminierter String ... print ADDR zahl ...
Das wird aber nicht das sein, was Du wolltest. Du könntest nun
zahl
mithilfe eines anderen Makros zu einem String umformen:... zahl dd 5 ; "dd" = "data dword", von str$ erwartet ... print str$(zahl) ...
oder Du nimmst ein anderes Makro (wenn Dir C leichter von der Hand geht):
... zahl dd 5 ; "dd" = "data dword", von printf erwartet ... printf ("%d\n",zahl) ...
viele grüße
ralph
-
Ich habe es jetzt mit dem printf gemacht und es funktioniert super. Danke für deine Antwort.
Jetzt habe ich aber noch eine Frage. Und zwar erwartet printf ja ein Doppelwort (dd), doch wie kann ich mit printf eine Byte-Variable (db) ausgeben ?
Also wie kann ich zum Beispiel folgende Variable ausgeben:
zahl db 5
Vielen Dank,
MfG arenas
-
Es gibt die Möglichkeit, ein Byte in ein 32-bit-Register zu laden:
... zahl db 5 ... movzx eax, BYTE PTR zahl printf ("%d\n",eax) ...
Wenn Du es mit Vorzeichen haben willst, dann muss das Vorzeichen "erweitert" werden:
... zahl db -5 ... movsx eax, BYTE PTR zahl printf ("%d\n",eax) ...