【发布时间】:2016-05-18 00:15:17
【问题描述】:
我想连接一个 C 编译器。
- 使用 MIPS 将值传递给函数的约定是什么?
- 是否有编码约定或类似 RFC 的文档?
【问题讨论】:
-
你做过研究吗?例如,您是否至少检查过wikipedia?
标签: assembly mips calling-convention abi mips32
我想连接一个 C 编译器。
【问题讨论】:
标签: assembly mips calling-convention abi mips32
没有正确的方法,使用汇编语言可以为所欲为。
但是,例如,如果您尝试与 C 编译器链接,那么为什么不尝试使用您拥有的编译器呢?它显然可以创建与由同一编译器生成的其他对象链接的对象。
extern unsigned int more_fun ( unsigned int a, unsigned int b );
unsigned int fun ( unsigned int a, unsigned int b )
{
unsigned int c;
c = more_fun(a,b+7);
return(c+a+5);
}
这是我的产品(带有某些标志),对象未链接...
00000000 <fun>:
0: 27bdffe8 addiu sp,sp,-24
4: 24a50007 addiu a1,a1,7
8: afbf0014 sw ra,20(sp)
c: afb00010 sw s0,16(sp)
10: 0c000000 jal 0 <fun>
14: 00808025 move s0,a0
18: 8fbf0014 lw ra,20(sp)
1c: 26100005 addiu s0,s0,5
20: 02021021 addu v0,s0,v0
24: 8fb00010 lw s0,16(sp)
28: 03e00008 jr ra
2c: 27bd0018 addiu sp,sp,24
我认为这说明了它,并为您提供了一种方法来解决更复杂的参数或返回值。我更喜欢编译和反汇编来编译成汇编。更容易阅读和实际看到产生了什么。 YMMV。
【讨论】:
-S 输出中的“噪音”。最简单的通常是使用安装了 MIPS 和 MIPS64 gcc5.4 的 Godbolt。例如godbolt.org/g/JrbUQD。不幸的是,它通常对汇编程序指令和 cmets 的过滤似乎在 32 位输出上做得不好,并且函数调用正在将函数地址加载到寄存器中,而不是使用直接的 jal。我想有一个我不知道的代码模型选项?无论如何,另请参阅stackoverflow.com/questions/38552116/…。
$31 这样的编号寄存器而不是 ra。