考虑 x64 Intel 程序集中的以下变量引用,该变量a
在该.data
部分中声明:
mov eax, dword ptr [rip + _a]
我很难理解这个变量引用是如何工作的。既然a
是对应于变量运行时地址的符号(带重定位),那么如何才能[rip + _a]
解引用正确的内存位置a
呢?实际上,rip
保存了当前指令的地址,它是一个很大的正整数,所以加法会导致不正确的地址a
?
相反,如果我使用 x86 语法(非常直观):
mov eax, dword ptr [_a]
,我收到以下错误:64 位模式不支持 32 位绝对寻址。
有什么解释吗?
1 int a = 5;
2
3 int main() {
4 int b = a;
5 return b;
6 }
编译gcc -S -masm=intel abs_ref.c -o abs_ref
::
1 .section __TEXT,__text,regular,pure_instructions
2 .build_version macos, 10, 14
3 .intel_syntax noprefix
4 .globl _main ## -- Begin function main
5 .p2align 4, 0x90
6 _main: ## @main
7 .cfi_startproc
8 ## %bb.0:
9 push rbp
10 .cfi_def_cfa_offset 16
11 .cfi_offset rbp, -16
12 mov rbp, rsp
13 .cfi_def_cfa_register rbp
14 mov dword ptr [rbp - 4], 0
15 mov eax, dword ptr [rip + _a]
16 mov dword ptr [rbp - 8], eax
17 mov eax, dword ptr [rbp - 8]
18 pop rbp
19 ret
20 .cfi_endproc
21 ## -- End function
22 .section __DATA,__data
23 .globl _a ## @a
24 .p2align 2
25 _a:
26 .long 5 ## 0x5
27
28
29 .subsections_via_symbols