2016-05-18 72 views
-3

我想与C编译器链接。 我的问题是 - 使用MIPS传递值以正常工作的正确方法是什么? 我应该加载一切到$ a0 ... 3或$ v0..1?MIPS-我如何获得与C编译器的链接?

+1

你做了什么研究吗?你有没有例如检查[维基百科](https://en.wikipedia.org/wiki/Calling_convention#MIPS)至少? – Jester

回答

2

没有正确的方法,用汇编语言你可以做任何你想做的事情。

但是,如果您试图与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 

我认为拼出来,并为您提供一种方式来弄清楚更复杂参数或返回值。我更喜欢编译和反汇编以汇编到汇编。阅读起来更容易,实际上看到的是什么。因人而异。

+0

您可以通过几种方式摆脱正常gcc'-S'输出中的“噪音”。最简单的是使用Godbolt,它安装了MIPS和MIPS64 gcc5.4。例如https://godbolt.org/g/JrbUQD。不幸的是,它对汇编程序指令和注释的通常过滤似乎在32位输出上表现不佳,函数调用将函数地址加载到寄存器中,而不是使用直接jal。我想有一个我不知道的代码模型选项?无论如何,请参阅http://stackoverflow.com/questions/38552116/how-to-remove-noise-from-gcc-clang-assembly-output。 –

+0

虽然汇编+反汇编对于MIPS来说可能仍然更好,因为gcc输出使用编号寄存器如'$ 31'而不是'ra'。 –

+0

我建立了我自己的binutils,并从s0,a0,ra(ewww)更改为使用简单补丁注册数字......我认为arm binutils现在需要相同的补丁。 –