7

我刚刚看了一下从这个 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>

该程序运行良好,但是,这个输出对我来说没有太大意义。有什么建议为什么要以这种方式处理?

谢谢

4

2 回答 2

8

我假设您使用的是 GCC,但其他编译器/汇编器应该有等效的选项。

那不是汇编输出;这是拆卸。如果您想要汇编器的输入,请使用gcc -S.

值得注意的数字不是 14——该指令是对相对地址0 的调用:

14: 40 00 00 00     call  14 <main+0xc>

如果您要反汇编使用 编译的目标文件-ffunction-sections,则该指令只是一个由链接器修复的占位符。链接器将用实际偏移量填充到addition_func; 如果您转储重定位表,您可能会看到这一点。

于 2010-07-21T15:11:36.683 回答
2

长话短说,它是目标文件中未填充的相对调用,等待由链接器填充到实际符号的适当偏移量。在那之前,相对偏移量为 0,如 x86,这意味着它相对调用自身(恰好是代码段内的绝对地址 0x14,它与 main 的偏移量为 0xc)。SPARC 相对调用似乎是相对于当前指令的开始而不是像 x86 那样的结束。

于 2021-02-26T03:23:19.077 回答