繁体   English   中英

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

[英]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汇编中,几乎所有条件跳转都基于标志( jcxzjecxzlooploopne / loopnz )。 这意味着重要的是标志所具有的值。

jle是同义jng 跳转条件是ZF = 1 or SF <> OF 您可能需要查看Intel x86 JUMP快速参考

test确实设置了除AF 链接之外的所有标志,所以到目前为止所有内容都很好

根据此链接,逻辑运算始终为零OF 这意味着你的跳转几乎是ZF = 1 or SF = 1 ,所以在你的代码中,如果edx0或者在0x80000000 ... 0xffffffff范围内, jle会跳转。

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

使用TESTL ,仅当值为零时,零标志ZF才设置为1。 TESTL还强制溢出标志OF为0,并且仅在高位置1时才设置符号标志SF

如果ZF设置为1或SF <> OF ,则JLE将跳转。

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

  • edx为零; 要么
  • edx位设置很高。

因此,它将跳转为edx00x80000000 - 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM