将两个字节移动到寄存器的最低部分
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 到相同的机器代码(这很重要),只是不同的编写方式。
写入 ESI 会零扩展到完整的 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
做一个不依赖于旧值的正常零扩展加载,而不是与旧值合并。
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 到相同的机器代码(这很重要),只是不同的编写方式。
写入 ESI 会零扩展到完整的 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
做一个不依赖于旧值的正常零扩展加载,而不是与旧值合并。