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

8fsztsew  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(88)

嘿,我想知道LOOPELOOPZ指令是否应该通过地址大小前缀进行符号扩展。
在英特尔的手册上写着:
使用RCX、ECX或CX寄存器作为计数器(取决于地址大小是64位、32位还是16位)执行循环操作。注意,LOOP指令忽略雷克斯.W;但是64位地址大小可以使用67 H前缀来覆盖。

操作

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

因此,我基本上只是询问程序集的有效性,即根据操作模式(位数)如何编写程序集。

irtuqstp

irtuqstp1#

立即数是分支目标DESTination,如果采取分支,则到分支的距离的pc相对编码。正值表示指令流中的向前分支,负值表示向后分支。
分支条件是指定寄存器是否为零;该寄存器(cx的某个版本)不是符号扩展的-它只是与零进行比较。
分支目标立即数的符号扩展具有确定分支是向前还是向后的效果。分支目标立即数的大小不由大小前缀确定-大小前缀确定在与零的比较中使用的寄存器宽度。

相关问题