我只是看了一下我从这个 C 程序中得到的一个非常简单的 SPARC 汇编输出:
int addition_func(int a, int b)
{
return(a+b);
}
void main()
{
int a = 20;
int b = 19;
int res;
res = addition_func(a, b);
}
.text 节的反汇编:
00000000 <addition_func>:
0: 81 c3 e0 08 retl
4: 90 02 00 09 add %o0, %o1, %o0
00000008 <main>:
8: 90 10 20 14 mov 0x14, %o0
c: 92 10 20 13 mov 0x13, %o1
10: 82 13 c0 00 mov %o7, %g1
14: 40 00 00 00 call 14 <main+0xc>
18: 9e 10 40 00 mov %g1, %o7
1c: 01 00 00 00 nop
我不明白为什么“调用”指令说:
call 14 <main+0xc>
为什么不是:
call 0 <addition_func+0x0>
该程序运行良好,但是,此输出没有太大意义
对我来说。任何建议为什么以这种方式处理?
谢谢
最佳答案
我假设您使用的是 GCC,但其他编译器/汇编器应该有等效的选项。
那不是汇编输出;这是拆卸。如果您想要汇编器的输入,请使用 gcc -S
。
值得注意的数字不是 14——该指令是对相对地址 0 的调用:
14: 40 00 00 00 call 14 <main+0xc>
如果您正在反汇编使用
-ffunction-sections
编译的目标文件,那么该指令只是一个由链接器修复的占位符。链接器将用 addition_func
的实际偏移量填充它;如果您转储重定位表,您可能会看到这一点。关于assembly - 反汇编的 gcc 输出似乎执行 "call 0"而不是 "call function-offset",但工作正常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3300722/