我是汇编语言的新手,我正在阅读Assembly Language Programming By Ytha Yu, Charles Marut
无论如何,我在Chapter 6
里面,我无法弄清楚处理器用来进行条件跳转的标志的情况。我知道标志的基本作用,例如,我知道如果在最后一条指令中发生或没有溢出,溢出标志会设置或重置。但我无法弄清楚它们是如何适应跳跃的条件的。
如果有人帮助我了解使用标志寄存器来实现条件跳转,那将非常有帮助。
我是汇编语言的新手,我正在阅读Assembly Language Programming By Ytha Yu, Charles Marut
无论如何,我在Chapter 6
里面,我无法弄清楚处理器用来进行条件跳转的标志的情况。我知道标志的基本作用,例如,我知道如果在最后一条指令中发生或没有溢出,溢出标志会设置或重置。但我无法弄清楚它们是如何适应跳跃的条件的。
如果有人帮助我了解使用标志寄存器来实现条件跳转,那将非常有帮助。
总体思路是:有一些操作可以设置或清除单个标志 - 算术、按位、比较。然后,您可以根据这些操作的结果自由地执行条件跳转。
让我们考虑最基本的情况 - 如果一个变量大于另一个变量,则跳转。假设变量在通用寄存器中,并且代码是 32 位的,这将是:
cmp eax, ebx
ja AOverB
现在,那有什么作用?CMP 行计算 value EAX-EBX
,不将其存储在任何地方,而是设置标志。具体来说,如果减法的结果为零(即EAX-EBX=0
ie EAX=EBX
),则设置零标志,否则清零。如果EAX<EBX
(即减去它们需要借位),则设置进位标志。因此 JA 命令执行:如果未设置 Zero 标志且未设置进位标志(即既没有EAX=EBX
也没有EAX<EBX
),则跳转。通过明显的数学计算,如果没有设置这些标志,则意味着EAX>EBX
.
那有帮助吗?你了解进位和借位的概念,以及它们的近亲溢出吗?