gpt4 book ai didi

assembly - 反汇编的 gcc 输出似乎执行 "call 0"而不是 "call function-offset",但工作正常

转载 作者:行者123 更新时间:2023-12-04 15:04:38 24 4
gpt4 key购买 nike

我刚刚看了一下从这个 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,例如 x86,这意味着它是 relatively calling itself (恰好是代码段中的绝对地址 0x14,它是从 main 偏移 0xc)。 SPARC 相对调用似乎是相对于当前指令的开始而不是像 x86 那样的结束。

关于assembly - 反汇编的 gcc 输出似乎执行 "call 0"而不是 "call function-offset",但工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3300722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com