我正在按照本教程关于装配.
根据教程(我也在本地尝试,并得到类似的结果),以下源代码:
Run Code Online (Sandbox Code Playgroud)int natural_generator() { int a = 1; static int b = -1; b += 1; /* (1, 2) */ return a + b; }
编译到这些汇编指令:
Run Code Online (Sandbox Code Playgroud)$ 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) …
我在反汇编程序(浮点逻辑c ++)中找到了以下汇编代码。
842: movss 0x21a(%rip),%xmm0
Run Code Online (Sandbox Code Playgroud)
我知道,当进程rip将一直为842且此0x21a(%rip)将为const。使用该寄存器似乎有些奇怪。
我想知道使用rip相对地址代替其他寻址有什么好处。