我正在关注关于组装的本教程。
根据教程(我也在本地尝试过,得到了类似的结果),源代码如下:
int natural_generator() { int a = 1; static int b = -1; b += 1; /* (1, 2) */ return a + b; }
编译为这些汇编指令:
$ gdb static (gdb) break natural_generator (gdb) run (gdb) disassemble Dump of assembler code for function natural_generator: push %rbp mov %rsp,%rbp movl $0x1,-0x4(%rbp) mov 0x177(%rip),%eax # (1) add $0x1,%eax mov %eax,0x16c(%rip) # (2) mov -0x4(%rbp),%eax add 0x163(%rip),%eax # 0x100001018 <natural_generator.b> pop %rbp retq End of assembler dump.
(行号注释(1)
,由我添加。)(2)
(1, 2)
问题:为什么在编译后的代码中,静态变量的地址b
相对于指令指针(RIP)是不断变化的(见行(1)
和(2)
),从而生成更复杂的汇编代码,而不是相对于特定的部分可执行文件,这些变量存储在哪里?
根据提到的教程,有这样一个部分:
这是因为 for 的值
b
被硬编码在示例可执行文件的不同部分中,并且在启动进程时,操作系统的加载程序将其与所有机器代码一起加载到内存中。
(强调我的。)