在我的汇编语言类中,我们的第一个任务是编写一个程序,在DOS中打印出一个简单的以美元结尾的字符串。它看起来像这样:
BITS 32
global _main
section .data
msg db "Hello, world!", 13, 10, ’$’
section .text
_main:
mov ah, 9
mov edx, msg
int 21h
ret
据我所知,$符号用于终止像C中的null那样的刺痛。但是如果我想在字符串中放入一个美元符号,我该怎么办(就像我要打印出来的那样“花费30美元” )?这似乎是一个简单的问题,但我的教授不知道答案,我似乎没有使用谷歌搜索找到它。
答案 0 :(得分:8)
您无法使用DOS的0x09
服务来显示$
个符号,您需要使用0x02
。请参阅here。
答案 1 :(得分:3)
或者使用未记录的INT 29h(AL中的打印字符)使您自己的print_string打印以NULL结尾的字符串。
; 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
(假设您使用的是NASM)
答案 2 :(得分:2)
我更喜欢使用write
服务(AH=0x40
):
AH=0x40
BX
是文件句柄;使用值1与服务AH=9
CX
是要写入的字节数;数据不是“终止”的(NUL也不是$
的终止),因此可以写入所有值(从0到255)DS:DX
指向要写入的数据(在您的情况下为字符串)AH=9
一样;如果您使用32位DOS扩展名:EDX
,当然)该服务实际上旨在将数据写入文件;但是,也可以通过将BX
设置为1来将“字符串”写入“输出”。
答案 3 :(得分:0)
庵。您可以编写将为转义$
考虑的程序集,例如\$
?
但是,您的\
也会成为特殊符号,您需要使用\\
来打印\
答案 4 :(得分:0)
一种方法是找到打印单个字符的调用。你可以打印任何角色。打破字符串并打印“它的成本”,然后打印“$”,最后打印“30”。更多的工作,但它完成了工作。
答案 5 :(得分:0)
您可以使用INT 21H的 02服务代替 09服务。
以下是样本。
mov dl, '$'
mov ah,02
int 21h
答案 6 :(得分:-3)
尝试'$$','\ 044'(八进制)或'\ x24'(十六进制)