用汇编语言解释标志如何在条件跳转中工作

时间:2019-06-12 17:20:56

标签: assembly x86 conditional-statements eflags

我是汇编语言的新手,正在阅读Assembly Language Programming By Ytha Yu, Charles Marut

无论如何,我在Chapter 6中,我无法弄清楚处理器用于进行条件跳转的标志的情况。我知道这些标志的基本作用,例如,我知道如果在最后一条指令中发生或未发生任何溢出,则溢出标志会置位或复位。但是我无法弄清楚它们是如何在跳跃条件下发挥作用的。

Signed Conditional Jumps Unsigned Conditional Jumps

  

如果有人帮助我了解标志寄存器的使用以实现条件跳转,那将真的很有帮助。

1 个答案:

答案 0 :(得分:3)

总体思路是:有一些操作可以设置或清除各个标志-算术,按位,比较。然后,您可以根据这些操作的结果随意执行条件跳转。

让我们考虑最基本的情况-如果一个变量大于另一个变量则跳转。假设变量位于通用寄存器中,并且代码为32位,则代码为:

cmp eax, ebx
ja AOverB

现在,这是怎么做的? CMP行计算值EAX-EBX,不将其存储在任何地方,而是设置标志。具体而言,如果减法的结果为零(即EAX-EBX=0,即EAX=EBX),则置零标志,否则将其清零。如果EAX<EBX设置进​​位标志(即减去它们将需要借位)。因此,JA命令执行以下操作:如果未设置零标志且未设置进位标志(即EAX=EBXEAX<EBX都没有)。通过明显的数学运算,如果未设置这些标志,则表示EAX>EBX

有帮助吗?您了解进位和借位的概念,以及它们的相对相对溢位吗?