使用AT& T汇编语法,我试图了解汇编代码中testl
的使用方式。具体做法是:
testl %edx, %edx
jle .L3
我知道testl
执行相同值的按位and
来设置条件标志,但如果不比较两个值,我怎么能解释'如果小于或等于'则跳转?
答案 0 :(得分:9)
以下是英特尔测试官方文档的摘录:
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时才执行跳转,并且因为ZF
设置为1 AND
的结果为0)或edx
的最重要位为1(因为SF = most significant bit
edx AND edx
(或等同于edx
本身)OF
始终为0,这意味着SF ≠ OF
仅在SF ≠ 0
}时才为真。
IOW,仅当edx
在解释为有符号整数时≤0时才会执行跳转,或等效地,当edx
在被解释为无符号时为{0}或大于或等于0x80000000时整数。
答案 1 :(得分:2)
在x86程序集中,几乎所有条件跳转都基于标志(jcxz
,jecxz
,loop
和loopne
/ loopnz
除外。这意味着重要的是标志所具有的值。
jle
与jng
同义。跳转条件为ZF = 1 or SF <> OF
。您可以查看Intel x86 JUMP quick reference。
test
会设置除AF
link以外的所有标记,因此到目前为止一切都很好。
根据this link逻辑运算始终为零OF
。这意味着您的跳转几乎为ZF = 1 or SF = 1
,因此如果jle
为edx
或范围为0
,则代码0x80000000
会跳转... {{1 }}
答案 2 :(得分:2)
TESTL
(如edx
和edx
)根据该参数本身的值设置标志(因为x AND x与x相同)。因此,我们可以完全忘记AND
,因为它已被丢弃 - 我们需要关注的是edx
中的值。
对于TESTL
,仅当值为零时,零标志ZF
才设置为1。 TESTL
也强制溢出标志OF
为0,并且只有在设置了高位时才设置符号标志SF
。
JLE
设置为1或ZF
,则 SF <> OF
会跳转。
因此,如果出现以下情况,将执行跳转:
edx
为零;或edx
设置了高位。因此,它会跳过edx
或0
的{{1}}值。
最有可能的是检查以确保数字是自然数0x80000000 - 0xffffffff
,跳转将是某种错误处理例程,并且有效的自然数将在没有跳转的情况下继续,例如:
0x00000001 - 0x7fffffff
有关各种跳转及其使用的标记的说明,请参阅here。