Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 解释在汇编语言中,标志如何在条件跳转中工作_Assembly_X86_Conditional Statements_Eflags - Fatal编程技术网

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

Assembly 解释在汇编语言中,标志如何在条件跳转中工作,assembly,x86,conditional-statements,eflags,Assembly,X86,Conditional Statements,Eflags,我是汇编语言新手,我正在阅读Ytha Yu,Charles Marut编写的汇编语言编程 无论如何,我在第6章中,我不知道处理器用于执行条件跳转的标志的情况。我知道这些标志的基本功能,例如,我知道如果在最后一条指令中发生或没有溢出,溢出标志将设置或重置。但我不知道他们是如何在跳跃的条件下发挥作用的 如果有人能帮助我理解如何使用标志寄存器来实现条件跳转,那将非常有帮助 总体思路是:有一些操作可以设置或清除单个标志——算术、位、比较。然后,您可以根据这些操作的结果自由执行条件跳转 如果一个变量大

我是汇编语言新手,我正在阅读Ytha Yu,Charles Marut编写的汇编语言编程

无论如何,我在
第6章
中,我不知道处理器用于执行条件跳转的标志的情况。我知道这些标志的基本功能,例如,我知道如果在最后一条指令中发生或没有溢出,溢出标志将设置或重置。但我不知道他们是如何在跳跃的条件下发挥作用的

如果有人能帮助我理解如何使用标志寄存器来实现条件跳转,那将非常有帮助


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

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

cmp eax, ebx
ja AOverB

现在,这有什么用?CMP行计算值
EAX-EBX
,不将其存储在任何位置,而是设置标志。具体而言,如果减法结果为零(即
EAX-EBX=0
,即
EAX=EBX
),则设置零标志,如果不是,则清除零标志。如果
eax设置进位标志,如果设置/未设置相应标志,则跳转。否则,请继续。@qwr我想知道这些标志为什么起作用,例如,我知道
JNE
需要
ZF0
,因为
CMP AX,如果
AX
BX
相等,BX
将为零。其他的呢?@klaus对于每个标志,条件都列在右边的列中。如果你想了解为什么旗帜在给定的情况下是这样设置的,我建议你在纸上尝试一些例子。的可能副本也有一个有用的答案,但这个问题是一个令人困惑的误解。