编译器(例如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
答案 0 :(得分:0)
也许它是在跳转声明后放置的?如果是这样,那么该语句在跳转发生之前运行,并且可以是无操作指令(nop)。除此之外,它可能只是较低优化设置的编译器。另一种可能性是编译器保留CPU标志字段。在我不相信的负载的情况下,使用标志移动和添加播放。
答案 1 :(得分:0)
这看起来像CRT代码。我认为这段代码正在将操作系统传递的一些参数加载到$ a0和$ a1寄存器中。可能在堆栈上传递了一些较大的结构,代码正在加载该结构以纠正堆栈位置。 此代码可能不是由C编译器生成的,而是在汇编中手动编码。