【问题标题】:How does the assembly TEST instruction work with these jump instructions?汇编 TEST 指令如何与这些跳转指令一起工作?
【发布时间】:2013-01-30 02:38:26
【问题描述】:

使用 AT&T 汇编语法,我试图了解 testl 如何在汇编代码中使用。具体来说:

testl  %edx, %edx
jle    .L3

我知道testl 会按位对相同值的and 设置条件标志,但是如果不比较两个值,我如何解释“小于或等于时跳转”?

【问题讨论】:

标签: assembly x86 conditional-statements


【解决方案1】:

这是来自英特尔的官方文档的摘录:

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 bitedx AND edx(或等效地,edx 本身)和OF 始终为0,这意味着SF ≠ OF 仅在以下情况下为真SF ≠ 0)。

IOW,只有当edx 被解释为有符号整数时≤0 时才会执行跳转,或者等价地,当edx 被解释为无符号整数时为0 或大于或等于0x80000000 时才会执行跳转。

【讨论】:

  • +1,关于有符号整数的好消息。这比检查0 or >= 0x80000000 更有意义!
  • IOW,在有符号整数的情况下,跳转指令总是将测试值(testl)与0进行比较。谢谢!
  • 没有其他东西可以有效地比较。如果您使用cmp edx, 5sub edx, 5,您将看到edx-5 vs 0 而不仅仅是edx vs 0。
【解决方案2】:

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

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

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

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

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

因此它将跳转到00x80000000 - 0xffffffffedx 值。

这很可能是为了确保该数字是自然数0x00000001 - 0x7fffffff,跳转到某种错误处理例程,并且有效的自然数将在没有跳转的情况下继续,例如:

loop_for_number:
    call   get_number_into_edx
    testl  %edx, %edx
    jle    loop_for_number

    ; carry on here knowing that edx >= 1

有关各种跳转及其使用的标志的描述,请参阅here

【讨论】:

    【解决方案3】:

    在 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,所以如果edx0 或在0x80000000 ... 0xffffffff 之间,你的代码中jle 会跳转。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 2014-05-19
      相关资源
      最近更新 更多