【问题标题】:Is there a coding convention to MIPS?MIPS 有编码约定吗?
【发布时间】:2016-05-18 00:15:17
【问题描述】:

我想连接一个 C 编译器。

  • 使用 MIPS 将值传递给函数的约定是什么?
  • 是否有编码约定或类似 RFC 的文档?

【问题讨论】:

  • 你做过研究吗?例如,您是否至少检查过wikipedia

标签: assembly mips calling-convention abi mips32


【解决方案1】:

没有正确的方法,使用汇编语言可以为所欲为。

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

【讨论】:

  • 您可以通过几种方式消除普通 gcc -S 输出中的“噪音”。最简单的通常是使用安装了 MIPS 和 MIPS64 gcc5.4 的 Godbolt。例如godbolt.org/g/JrbUQD。不幸的是,它通常对汇编程序指令和 cmets 的过滤似乎在 32 位输出上做得不好,并且函数调用正在将函数地址加载到寄存器中,而不是使用直接的 jal。我想有一个我不知道的代码模型选项?无论如何,另请参阅stackoverflow.com/questions/38552116/…
  • 虽然 assemble + disassemble 对于 MIPS 来说可能仍然更好,因为 gcc 输出使用像 $31 这样的编号寄存器而不是 ra
  • 我构建了自己的 binutils 并将其从 s0,a0,ra (ewww) 更改为使用简单补丁注册数字...我认为 arm binutils 现在需要相同的补丁。
猜你喜欢
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 2013-02-09
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 2014-08-16
相关资源
最近更新 更多