汇编指令操作数

时间:2018-01-07 01:47:49

标签: assembly x86 att

40中的movq 40(%rdi), %rax是什么意思?

我看到值(在gcc自动生成的其他指令中)总是8的正数倍(即8,16,24,32 ......)

它也始终被()

包围

我也知道()表示地址。

但是示例中的40是什么意思? 当我尝试更改它时,它甚至允许8的非倍数(例如,2,3,7,-3,-28)并编译好。

通过将40更改为其他内容来获取某些示例值:

movq    $1, (%rdi)
movq    0(%rdi), %rax

%rax: 2


movq    $1, (%rdi)
movq    1(%rdi), %rax

%rax: 72057594037927937


movq    $1, (%rdi)
movq    2(%rdi), %rax

%rax: 281474976710657


movq    $1, (%rdi)
movq    8(%rdi), %rax

%rax: 2


movq    $1, (%rdi)
movq    16(%rdi), %rax

%rax: 4


movq    $1, (%rdi)
movq    24(%rdi), %rax

%rax: 140730710821713


movq    $1, (%rdi)
movq    32(%rdi), %rax

%rax: 2761649059213359105

1 个答案:

答案 0 :(得分:1)

AT& T语法中的

40(%rdi)在NASM语法中为[rdi + 40]。它是一个内存操作数,其有效地址为40 + RDI。 0(%rdi)(%rdi)相同:没有置换。请参阅Referencing the contents of a memory location. (x86 addressing modes)

您的第一个示例将8字节1存储到(%rdi),然后从同一地址重新加载。但是你声称你得到2,所以你在那里做错了。

您的另一个示例是存储然后从部分重叠的位置加载,例如rdi+2或不重叠,如rdi+16。在后一种情况下,加载结果完全不依赖于商店。