假设寄存器
%rdi
包含8个字节,构成一个有效地址,编写x86-64指令以取消引用地址,并将两个字节移到%rsi
的最低部分。
我的答案是movq 2(%rdi), %rsi
,但这是不正确的。
我不太了解如何表达“移动两个字节”部分。我希望有人可以帮我解释一下。非常感谢
移动2个字节= word
操作数大小。 movw (%rdi), %si
。
或者只是让汇编程序从寄存器mov (%rdi), %si
推断操作数大小。这些汇编器使用相同的机器代码(这很重要),只是编写方式不同。
写入ESI会零扩展到整个RSI,但是写入低字节(SIL)或字(SI)会使高字节保持不变。 (即,将某些字节合并到RSI中。)造成这种差异的原因是,在使用更广泛的regs扩展x86时,386与AMD64架构师做出了不同的选择。 Why do x86-64 instructions on 32-bit registers zero the upper part of the full 64-bit register?
此分配的目的似乎是要确保您了解部分寄存器如何在RSI上别名。