反汇编的gcc输出似乎执行"调用0"而不是"调用函数偏移",但工作正常

Mar*_*kus 5 assembly sparc disassembly

我只看了一下我从这个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);
}
Run Code Online (Sandbox Code Playgroud)

反汇编.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 
Run Code Online (Sandbox Code Playgroud)

我不明白为什么"呼叫"指令说:

  call  14 <main+0xc>
Run Code Online (Sandbox Code Playgroud)

为什么不是:

  call  0 <addition_func+0x0>
Run Code Online (Sandbox Code Playgroud)

该程序工作正常,但是,这个输出对我来说没有多大意义.有什么建议为什么这样处理?

谢谢

tc.*_*tc. 5

我假设您正在使用GCC,但其他编译器/汇编器应该具有相同的选项.

这不是装配输出; 这是拆卸.如果您想要输入汇编程序,请使用gcc -S.

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

14: 40 00 00 00     call  14 <main+0xc>
Run Code Online (Sandbox Code Playgroud)

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