Dollar-terminierten Strings
Frage
In meiner Assemblersprache Klasse, unsere erste Aufgabe war es, ein Programm zu schreiben, einen einfachen Dollar-terminierten String in DOS zu drucken. Es sah so etwas wie folgt aus:
BITS 32
global _main
section .data
msg db "Hello, world!", 13, 10, ’$’
section .text
_main:
mov ah, 9
mov edx, msg
int 21h
ret
Wie ich es verstehe, dient das $ -Zeichen den Stachel zu beenden, wie null in C tut Aber was mache ich, wenn ich ein Dollar-Zeichen in der Zeichenfolge setzen wollen (wie ich will auszudrucken „es kostet $ 30“ )? Dies scheint eine einfache Frage, aber mein Professor wußte die Antwort nicht und ich scheine nicht, es zu finden eine Google-Suche.
Lösung
Sie können nicht von DOS 0x09
Service $
Zeichen angezeigt werden, müssen Sie 0x02
verwenden. Siehe hier .
Andere Tipps
oder eigenes print_string macht einen NULL-terminierten String mit dem undokumentierten INT 29h (Druckzeichen in AL) zu drucken.
; ds:si = address of string to print
print_string:
lodsb ; load next character from ds:si
or al, al ; test for NULL-character
jz .end_of_string ; end of string encountered, return.
int 29h ; print character in AL on screen
jmp print_string ; print next character
.end_of_string:
ret ; return to callers cs:ip
(Angenommen, Sie NASM verwenden)
Um. Sie könnten Montage schreiben, die für entgangenen $
berücksichtigt würden, zum Beispiel \$
?
Aber dann wird Ihr \
ein spezielles Symbol zu, und Sie müssen \\
verwenden, um eine \
zu Drucken
Eine Möglichkeit ist, den Anruf zu finden, die ein einzelnes Zeichen druckt. Sie können damit beliebige Zeichen drucken. Brechen Sie die Zeichenfolge und Druck „kostet“, dann die ‚$‘ und schließlich „30“. Mehr Arbeit, aber es wird die Arbeit erledigt.
Sie können 02 Service von INT 21H anstelle von 09 Service .
Hier ist die Probe.
mov dl, '$'
mov ah,02
int 21h
Versuchen '$$', '\ 044' (Oktal) oder '\ x24' (hex)