ASM:如何在以下代码段中影响al寄存器

时间:2014-06-29 14:52:52

标签: c++ windows assembly masm

正在读一本关于微处理器的书。在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之前没有用过......

2 个答案:

答案 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'手写非常相似,特别是写得不好的时候:

enter image description herehttp://en.wikipedia.org/wiki/File:Cursive.svg

抄写员混淆了这些字母(或者不知道印刷品的不同形式和手写的#39; a')并写了mov dl, [bx]。正确是mov al, [bx]