汇编中的条件跳转和标志位
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 标志。
下一个问题是这个架构是将进位标志反转为减法,使其成为借位还是直接穿过?
无论如何,你有四个基本标志,进位、有符号溢出、负数和零。通过良好的文档,您可以获得该条件的标志列表。如果你想要一个大于或小于或其他什么,你有点知道,这个小铅笔和纸测试,以及在处理器上做它并转储标志以查看该架构是否反转进位,同时阅读查看文档以查看是否所有标志都被相关测试指令触及,然后查看各种测试条件以查看哪些符合您的结果。
我正在学习汇编语言。我知道 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 标志。
下一个问题是这个架构是将进位标志反转为减法,使其成为借位还是直接穿过?
无论如何,你有四个基本标志,进位、有符号溢出、负数和零。通过良好的文档,您可以获得该条件的标志列表。如果你想要一个大于或小于或其他什么,你有点知道,这个小铅笔和纸测试,以及在处理器上做它并转储标志以查看该架构是否反转进位,同时阅读查看文档以查看是否所有标志都被相关测试指令触及,然后查看各种测试条件以查看哪些符合您的结果。