我只看了一下我从这个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>
该程序工作正常,但是,这个输出没有多大意义 对我来说。有什么建议以这种方式处理吗?
由于
答案 0 :(得分:5)
我假设你正在使用GCC,但其他编译器/汇编器应该有相同的选项。
这不是装配输出;这是拆卸。如果要输入汇编程序,请使用gcc -S
。
值得注意的数字不是14 - 该指令是对相对地址的调用0:
14: 40 00 00 00 call 14 <main+0xc>
如果要反汇编使用-ffunction-sections
编译的目标文件,那么该指令只是一个由链接器修复的占位符。链接器将使用addition_func
的实际偏移量填充它;如果转储重定位表,可能会看到这一点。
答案 1 :(得分:2)
长话短说,它是一个目标文件中的未填充相对调用,等待链接器填充到实际符号的适当偏移量。在那之前,相对偏移量是 0,就像 x86 一样,这意味着它是 relatively calling itself(恰好是代码段中的绝对地址 0x14,它与 main 的偏移量为 0xc)。 SPARC 相对调用似乎是相对于当前指令的开始,而不是像 x86 那样的结束。