将两个字节移动到寄存器的最低部分

Moving two bytes into the lowest portion of a register

Assuming that the register %rdi contains 8 bytes that constitute a valid address, write the x86-64 instruction to dereference this address and move two bytes into the lowest portion of %rsi.

我的回答是movq 2(%rdi), %rsi,但不正确。

我不太明白"moving two bytes"部分怎么表达。我希望有人能为我解释一下。非常感谢

移动 2 个字节 = word 操作数大小。 movw (%rdi), %si.

或者让 assembler 从寄存器 mov (%rdi), %si 中推断操作数的大小。那些 assemble 到相同的机器代码(这很重要),只是不同的编写方式。

写入 E​​SI 会零扩展到完整的 RSI,但写入低字节 (SIL) 或字 (SI) 会使高字节保持不变。 (即将一些字节合并到 RSI 中。)造成这种差异的原因是 386 和 AMD64 架构师在使用更宽的 regs 扩展 x86 时做出了不同的选择。 Why do x86-64 instructions on 32-bit registers zero the upper part of the full 64-bit register?

这项作业的目的似乎是确保您了解部分寄存器如何别名到 RSI。

在现实生活中,通常你会想movzwl (%rdi), %esi做一个不依赖于旧值的正常零扩展加载,而不是与旧值合并。