代码之家  ›  专栏  ›  技术社区  ›  Jorayen

x86 loope/z指令应根据地址大小前缀进行符号扩展

  •  1
  • Jorayen  · 技术社区  · 3 年前

    嘿,我想知道 LOOPE LOOPZ 指令应通过地址大小前缀进行符号扩展。

    在英特尔手册中写道:

    使用RCX、ECX或CX寄存器作为执行循环操作 计数器(取决于地址大小是64位、32位还是16位 位)。请注意,LOOP指令会忽略REX。W但是64位 可以使用67H前缀来覆盖地址大小。

    活动

    IF (AddressSize = 32)
        THEN Count is ECX;
    ELSE IF (AddressSize = 64)
        Count is RCX;
    ELSE Count is CX;
    FI;
    

    现在我明白了我们用来计数的寄存器将取决于地址大小前缀,但没有提到所写程序集的有效性,看到反汇编程序的输出,如objdump和其他程序为当前字节流产生的结果 67 e1 d2 以下输出

    0:  67 e1 d2                addr32 loope 0xffffffffffffffd5
    

    我认为它应该将immediate扩展到计数器的大小,所以它应该看起来像这样:

    0:  67 e1 d2                addr32 loope 0xffffffd5
    

    所以我基本上只是问程序集的有效性,以及它应该如何根据操作模式(bitness)来编写。

    1 回复  |  直到 3 年前
        1
  •  4
  •   Erik Eidt    3 年前

    直属是分支目标 DEST 信息 ,到分支的距离的pc相对编码,应该取该分支。正值表示指令流中的正向分支,负值表示反向分支。

    分支条件是指定寄存器是否为零;那个寄存器(的某个版本 cx )不是符号扩展的,它只是与零进行比较。

    分支目标立即数的符号扩展具有确定分支是向前还是向后的效果。分支目标立即数的大小不是由大小前缀决定的,大小前缀决定在与零的比较中使用的寄存器宽度。

    推荐文章