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
答案 0 :(得分:1)
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
。在后一种情况下,加载结果完全不依赖于商店。