[英]How does the assembly TEST instruction work with these jump instructions?
使用AT&T汇编语法,我试图理解如何在汇编代码中使用testl
。 特别:
testl %edx, %edx
jle .L3
我知道testl
按位and
相同的值设置条件标志,但如果不比较两个值,我如何解释'如果小于或等于'则跳转?
以下是英特尔测试官方文档的摘录:
Operation
TEMP ← SRC1 AND SRC2;
SF ← MSB(TEMP);
IF TEMP = 0
THEN ZF ← 1;
ELSE ZF ← 0;
FI:
PF ← BitwiseXNOR(TEMP[0:7]);
CF ← 0;
OF ← 0;
在jle上也一样:
Jump if less or equal (ZF=1 or SF≠OF)
因此,如果edx
为0,则执行跳转(因为edx AND edx = edx
,仅当edx
为0时为0,并且当AND
的结果为0时ZF
设置为1)或者edx
的最重要位为1(因为SF = most significant bit
edx AND edx
SF = most significant bit
(或等效地, edx
本身)和OF
始终为0,这意味着SF ≠ OF
仅在SF ≠ 0
时才为真)。
IOW,仅当edx
被解释为有符号整数时edx
时才执行跳转,或等效地,当edx
被解释为无符号整数时为0或更大或等于0x80000000时。
在x86汇编中,几乎所有条件跳转都基于标志( jcxz
, jecxz
, loop
和loopne
/ loopnz
)。 这意味着重要的是标志所具有的值。
jle
是同义jng
。 跳转条件是ZF = 1 or SF <> OF
。 您可能需要查看Intel x86 JUMP快速参考 。
test
确实设置了除AF
链接之外的所有标志,所以到目前为止所有内容都很好
根据此链接,逻辑运算始终为零OF
。 这意味着你的跳转几乎是ZF = 1 or SF = 1
,所以在你的代码中,如果edx
为0
或者在0x80000000
... 0xffffffff
范围内, jle
会跳转。
具有相同参数的TESTL
(如edx
和edx
)根据该参数本身的值设置标志(因为x AND x与x相同)。 所以我们可以完全忘记AND
,因为它被丢弃了 - 我们需要关注的是edx
的价值。
使用TESTL
,仅当值为零时,零标志ZF
才设置为1。 TESTL
还强制溢出标志OF
为0,并且仅在高位置1时才设置符号标志SF
。
如果ZF
设置为1或SF <> OF
,则JLE
将跳转。
因此,如果有以下情况,跳转将执行:
edx
为零; 要么 edx
位设置很高。 因此,它将跳转为edx
值0
或0x80000000 - 0xffffffff
。
很可能这是一个检查,以确保该数字是一个自然数0x00000001 - 0x7fffffff
,跳转将是某种错误处理例程,一个有效的自然数将继续没有跳转,如:
loop_for_number:
call get_number_into_edx
testl %edx, %edx
jle loop_for_number
; carry on here knowing that edx >= 1
有关各种跳转及其使用的标志的说明,请参见此处 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.