汇编TEST指令如何与这些跳转指令一起使用?

时间:2013-01-30 02:38:26

标签: assembly x86 conditional-statements

使用AT& T汇编语法,我试图了解汇编代码中testl的使用方式。具体做法是:

testl  %edx, %edx
jle    .L3

我知道testl执行相同值的按位and来设置条件标志,但如果不比较两个值,我怎么能解释'如果小于或等于'则跳转?

3 个答案:

答案 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程序集中,几乎所有条件跳转都基于标志(jcxzjecxzlooploopne / loopnz除外。这意味着重要的是标志所具有的值。

jlejng同义。跳转条件为ZF = 1 or SF <> OF。您可以查看Intel x86 JUMP quick reference

test会设置除AF link以外的所有标记,因此到目前为止一切都很好。

根据this link逻辑运算始终为零OF。这意味着您的跳转几乎为ZF = 1 or SF = 1,因此如果jleedx或范围为0,则代码0x80000000会跳转... {{1 }}

答案 2 :(得分:2)

具有相同参数的

TESTL(如edxedx)根据该参数本身的值设置标志(因为x AND x与x相同)。因此,我们可以完全忘记AND,因为它已被丢弃 - 我们需要关注的是edx中的值。

对于TESTL,仅当值为零时,零标志ZF才设置为1。 TESTL也强制溢出标志OF为0,并且只有在设置了高位时才设置符号标志SF

如果JLE设置为1或ZF,则

SF <> OF会跳转。

因此,如果出现以下情况,将执行跳转:

  • edx为零;或
  • edx设置了高位。

因此,它会跳过edx0的{​​{1}}值。

最有可能的是检查以确保数字是自然数0x80000000 - 0xffffffff,跳转将是某种错误处理例程,并且有效的自然数将在没有跳转的情况下继续,例如:

0x00000001 - 0x7fffffff

有关各种跳转及其使用的标记的说明,请参阅here