装配 - 跳转到错误的功能

时间:2015-04-14 09:52:47

标签: assembly flags

我有这样的代码

MOV ax, a
MOV bl, x[si]
CBW
SUB ax, bx  
CMP ax, 0 
JE f2
JL f3

变量:

a DW 3
x DB -2

当子轴之后的代码工作时应该是5,因为3-(-2) = 5 > 0,但是它跳转到函数f3,当它应该继续使用f1时,它在这部分代码之后开始。有什么建议吗?如果x是2,它工作正常,代码不会跳转到任何地方,函数f1工作正常。

1 个答案:

答案 0 :(得分:1)

由于 x 数组包含有符号字节,您希望从AX寄存器中的字中减去这些字节,因此需要将带符号字节提升为带符号字。我们使用MOVSX指令来执行此操作。

许多汇编语言指令根据操作结果设置标志。 SUB就是其中之一,所以你不需要将AX与0进行比较就能有条件地跳跃。

MOV   ax, a
MOVSX bx, x[si]
SUB   ax, bx
JE    f2
JL    f3