装配基础 - movq

cs *_*ent 1 assembly x86-64

movq %rax,%rdx 

movq 13(%rax),%rdx 

movq 0x47(%rax,%rcx),%rdx 

rcx = 0000000000000030
rax = 0000000008048a37
Run Code Online (Sandbox Code Playgroud)

我想知道这三个流水线指令有什么区别。我知道第一个是将 8048a37 移动到 %rdx。在第二个中,我想我必须在 8048a37 上加上 13 才能得到 8048a4a,然后 8048a4a 指向的任何东西都会移动到 %rdx。在第三个中,我想我添加了 rax、rdx 和 47 来获得 8048aae,然后 8048aae 指向的任何内容都会移动到 %rdx。

ama*_*el2 5

这些汇编指令之间的区别在于您正在访问偏移量。让我们通过它们:)

movq %rax,%rdx 
Run Code Online (Sandbox Code Playgroud)

只需将 rax 寄存器(eax 位的 64 位寄存器)移动到 rdx 寄存器(edx 32 位的 64 位寄存器)

movq 13(%rax),%rdx 
Run Code Online (Sandbox Code Playgroud)

将偏移量为 13 的 rax 寄存器的地址移动到 rdx 寄存器

movq 0x47(%rax,%rcx),%rdx 
Run Code Online (Sandbox Code Playgroud)

将 0x47 + rax 寄存器 + rcx 寄存器的地址移动到 rdx 寄存器。

  • 加载有效地址指令(`lea`)将移动地址。问题中的描述是正确的。 (3认同)