我写了一个简单的程序然后编译并组装它。
tfc.cpp
int i = 0;
void f(int a)
{
i += a;
};
int main()
{
f(9);
return 0;
};
我通过运行
得到了tfc.o.$ g++ -c -O1 tfc.cpp
然后我使用 gobjdump ( objdump )来反汇编二进制文件。
$ gobjdump -d tfc.o
然后我得到了
0000000000000000 <__Z1fi>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 01 3d 00 00 00 00 add %edi,0x0(%rip) # a <__Z1fi+0xa>
a: 5d pop %rbp
b: c3 retq
c: 0f 1f 40 00 nopl 0x0(%rax)
0000000000000010 <_main>:
10: 55 push %rbp
11: 48 89 e5 mov %rsp,%rbp
14: bf 09 00 00 00 mov $0x9,%edi
19: e8 00 00 00 00 callq 1e <_main+0xe>
1e: 31 c0 xor %eax,%eax
20: 5d pop %rbp
21: c3 retq
奇怪的是,callq
指令后跟1e <_main+0xe>
。它不应该是<__Z1fi>
的地址吗?如果没有,main
函数如何调用f
函数?
修改 供参考:
$ g++ -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix
答案 0 :(得分:1)
它调用地址0,这是f函数的地址。
e8是x86中的调用指令,根据:
http://www.cs.cmu.edu/~fp/courses/15213-s07/misc/asm64-handout.pdf
调用使用相对于下一条指令的位移,在内存位置1e。这就变成了内存位置0.所以它实际上是callq 1e,它的调用地址为0。