装配CMP结果根据使用的寄存器而不同?

时间:2013-05-09 14:17:24

标签: assembly x86-16 cmp

我一直致力于我的装配项目,并遇到了一个我无法理解的事实。

我有一个名为“lent”的单词数组,里面填充了一些数字。当我打印0索引下的内容时,它显示ASCII 0(NULL)。但是,当我使用CMP检查值是否为0时,我遇到了一些麻烦。这是一些代码:

mov di,offset lent
mov cx,0d
cmp ds:[di],cx

它返回不相等,好像[di]不包含零。 但是:

mov di,offset lent
mov cl,0d
cmp ds:[di],cl

返回平等,让我感到困惑。我需要第一个案例在我的代码中工作。 如果这是一个蹩脚的问题,我很抱歉,但我无法在互联网上找到合适的答案。提前致谢

3 个答案:

答案 0 :(得分:2)

第二种情况是将一个字节与一个字节进行比较。该字节匹配(ZF = 1)。

但是,第一种情况实际上是将两个字节与两个字节进行比较。两个字节中只有一个匹配。因此,您得到ZF = 0。

答案 1 :(得分:2)

Sparky的回答是正确的。 为避免混淆和检测错误,请尝试使用大小前缀,如

mov di, offset lent
mov cl, 0d
cmp byte ptr [di], cl

如果您尝试使用单词ptr前缀,例如

cmp word ptr [di], cl

使用debug.exe,它会显示错误信息。

答案 2 :(得分:0)

mov ds:[di]到一个寄存器并查看它

mov di,offset lent

mov cx,0d

cmp ds:[di],cx

变为:

mov di,offset lent

mov cx,0d

mov ax,[di]

cmp al,cl

cmp ax,cx

cmp啊,ch

看看并调试它有点像