嘿,我想知道LOOPE
LOOPZ
指令是否应该通过地址大小前缀进行符号扩展。
在英特尔的手册上写着:
使用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
因此,我基本上只是询问程序集的有效性,即根据操作模式(位数)如何编写程序集。
1条答案
按热度按时间irtuqstp1#
立即数是分支目标DESTination,如果采取分支,则到分支的距离的pc相对编码。正值表示指令流中的向前分支,负值表示向后分支。
分支条件是指定寄存器是否为零;该寄存器(
cx
的某个版本)不是符号扩展的-它只是与零进行比较。分支目标立即数的符号扩展具有确定分支是向前还是向后的效果。分支目标立即数的大小不由大小前缀确定-大小前缀确定在与零的比较中使用的寄存器宽度。