简单的MIPS指令和编译器

时间:2010-07-19 22:21:45

标签: c++ compiler-construction assembly mips

编译器(例如gcc)是否通常生成将一些空的内存元素加载到寄存器中的指令?就像... lw at,0(sp)其中memory [sp + 0] = 0.这基本上只是将0放入$ at($ R1。)我问,因为我正在查看可执行文件的十六进制转储(可执行文件)是编译c ++文件的结果)并且我手动验证它,如果我从objdump状态入口点开始,我会遇到执行此操作的指令。如果它只是一个常见的编译器操作,我不确定是否应该将此视为错误。将寄存器归零是一种糟糕的方式。 ADDU $ at,$ 0,$ 0会更好。或SLL $ at,$ 0,$ 0 ..

入口点是400890.最后jal的跳转目标是一个空的内存位置(告诉我一些可能是错误的......)请注意,我之前的例子是故意仲裁的。

为了清楚起见,-32636 + gp是一个空的内存位置。如果您想要证明,我可以发布内存内容。)。

00400890 <__start>:
  400890:   03e00021    move    zero,ra
  400894:   04110001    bal 40089c <__start+0xc>
  400898:   00000000    nop
  40089c:   3c1c0fc0    lui gp,0xfc0
  4008a0:   279c7864    addiu   gp,gp,30820
  4008a4:   039fe021    addu    gp,gp,ra
  4008a8:   0000f821    move    ra,zero
  4008ac:   8f848034    lw  a0,-32716(gp)
  4008b0:   8fa50000    lw  a1,0(sp)
  4008b4:   27a60004    addiu   a2,sp,4
  4008b8:   2401fff8    li  at,-8
  4008bc:   03a1e824    and sp,sp,at
  4008c0:   27bdffe0    addiu   sp,sp,-32
  4008c4:   8f878054    lw  a3,-32684(gp)
  4008c8:   8f888084    lw  t0,-32636(gp)<------ this instruction
  4008cc:   00000000    nop
  4008d0:   afa80010    sw  t0,16(sp)
  4008d4:   afa20014    sw  v0,20(sp)
  4008d8:   afbd0018    sw  sp,24(sp)
  4008dc:   8f998068    lw  t9,-32664(gp)
  4008e0:   00000000    nop
  4008e4:   0320f809    jalr    t9
  4008e8:   00000000    nop

Jal目标是4010c0。

4010c0: 8f998010    lw  t9,-32752(gp)
  4010c4:   03e07821    move    t7,ra
  4010c8:   0320f809    jalr    t9

2 个答案:

答案 0 :(得分:0)

也许它是在跳转声明后放置的?如果是这样,那么该语句在跳转发生之前运行,并且可以是无操作指令(nop)。除此之外,它可能只是较低优化设置的编译器。另一种可能性是编译器保留CPU标志字段。在我不相信的负载的情况下,使用标志移动和添加播放。

答案 1 :(得分:0)

这看起来像CRT代码。我认为这段代码正在将操作系统传递的一些参数加载到$ a0和$ a1寄存器中。可能在堆栈上传递了一些较大的结构,代码正在加载该结构以纠正堆栈位置。 此代码可能不是由C编译器生成的,而是在汇编中手动编码。