正在读一本关于微处理器的书。在C ++代码中看到这个片段使用ASM打印字符串。
str (char *string_adr[])
{
_asm
{
mov bx, string_adr
mov ah, 2
top:
mov dl, [bx]
inc bx
cmp al, 0
je bot
int 21h
jmp top
bot:
mov al, 20h
int 21h
}
}
现在我想知道cmp al, 0
如何工作,因为al
之前没有用过......
答案 0 :(得分:0)
您必须查看编译器生成的proc链接代码。例如,它可能决定不仅将参数放在堆栈上,而是将少数(一个?)放入寄存器中。但这似乎不是这里的情况:我的印象是,而不是两个引用al,dl实际上意味着 - 就是这种情况,结果是字符串(0)的结尾将被打印为空格字符在终止之前(int 21h看起来像MSDOS,函数2,它输出ASCII在dl中的char)。这是有道理的,因此我认为这是一个错误的例子。我甚至可以尝试提供一些猜测这个错字可能来自哪个:在该示例的早期版本中,使用了LODSB,这是一个自动递增的间接寄存器读取8086提供的 - 并且读取字节的目标是al 。因为不推荐使用LODSB。示例已更新,并且间接寄存器读取增量编码输出,这次直接读取到dl而不是al,因为那是DOS fn 02期望字符的地方 - 不幸的是错过了字符串结尾的测试,以及后来的负载使用空格字符的ASCII,并保持原来在该示例的先前版本中。
答案 1 :(得分:0)
我猜作者手工编写代码。字母' a'并且' d'手写非常相似,特别是写得不好的时候:
(http://en.wikipedia.org/wiki/File:Cursive.svg)
抄写员混淆了这些字母(或者不知道印刷品的不同形式和手写的#39; a')并写了mov dl, [bx]
。正确是mov al, [bx]
。