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

conditional jump and flag bit in assembly

我正在学习汇编语言。我知道 CMP R1 R2 操作根据 R1-R2 的结果设置标志位(进位、溢出、零、符号等)。 并且我理解在CMP之后是JA、JBE等条件跳转指令JXs。如果标志位条件匹配,JX指令使IP跳转到指定地址。

我一直不明白的是我附上的图片"Tested Conditions"。

CMP R1 R2

JAE 某处

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

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

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

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

那么 "tested conditions" 有什么问题吗?

这个减法

R1-R2 = 0111-0110 

在逻辑上这样实现

     1
  0111
+ 1001
========

完成数学运算

 11111
  0111
+ 1001
========
  0001

so carry out (unsigned overflow) is a 1, signed overflow is a 0 作为进位和进位到msbit的匹配也可以从操作数的msbits和结果来判断。如果操作数的 msbits 彼此匹配但结果的 msbits 与 msbits 不匹配则有符号溢出。

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

下一个问题是这个架构是将进位标志反转为减法,使其成为借位还是直接穿过?

无论如何,你有四个基本标志,进位、有符号溢出、负数和零。通过良好的文档,您可以获得该条件的标志列表。如果你想要一个大于或小于或其他什么,你有点知道,这个小铅笔和纸测试,以及在处理器上做它并转储标志以查看该架构是否反转进位,同时阅读查看文档以查看是否所有标志都被相关测试指令触及,然后查看各种测试条件以查看哪些符合您的结果。