汇编中的条件跳转和标志位

时间:2018-04-11 10:33:58

标签: assembly x86-16

我正在学习汇编语言。我知道CMP R1 R2操作根据R1-R2的结果设置标志位(Carry,Overflow,Zero,Sign等..)。 我知道条件跳转指令JX,例如JA,JBE在CMP之后。如果标志位条件匹配,则JX指令使IP跳转到指定地址。

我从未忘记的是我附上的图片中的“经过测试的条件”。

enter image description here

CMP R1 R2

JAE某处

如果R1大于或等于R2,上面的代码显然会跳转到某处。如果R1 = 0111且R2 = 0110,则JAE跳到某处。在这种情况下,

R1-R2 = 0111-0110 = 0111+1010 = 10001 = 0001 with carry bit set

请注意,我添加了2的补码0110而不是减去0110,因为微控制器以这种方式计算,因为我知道

但教科书说如果Carry标志为0,JAE会跳转。我的计算表明,如果R1大于R2,则C = 1。另一个例子表明,如果R1大于R2,则C = 1。标志没有问题。

那么“测试条件”有什么问题?

1 个答案:

答案 0 :(得分:-1)

此减法

R1-R2 = 0111-0110 

在逻辑

中实现如下
     1
  0111
+ 1001
========

完成数学

 11111
  0111
+ 1001
========
  0001
因此执行(无符号溢出)是1,有符号溢出是0作为进位并执行到msbit匹配也可以从操作数的msbits和结果中确定。如果操作数的msbits相互匹配,但结果的msbit与msbits不匹配,则签名溢出。

不为零,因此z标志为0,并且未设置msbit,因此不会设置n标志。

接下来的问题是这个架构反转是否会在减法中进位到进位标志,使其成为一个借位,还是直接将它直接穿过?

在任何情况下,你都有四个基本标志,进位,有符号溢出,负数和零。通过良好的文档,您可以获得条件的标志列表。如果你想要一个大于或小于或等于这个小小的铅笔和纸张测试,并且在处理器上执行它并倾倒标志以查看这个架构是否反转了执行,你也会知道你的脑袋。 docs查看所讨论的测试指令是否触及了所有标志,然后查看各种测试条件,看看哪些符合您的结果。