我使用交叉编译器mipsel-unknown-linux-gnu-gcc来编译一个hello-world C程序,并使用mipsel-unknown-linux-gnu-objdump对其进行反汇编,并获得以下内容:
00400d00 <__start>:
400d00: 03e00021 move zero,ra
400d04: 04110001 bal 400d0c <__start+0xc>
400d08: 00000000 nop
400d0c: 3c1c004b lui gp,0x4b
400d10: 279c2010 addiu gp,gp,8208
400d14: 0000f821 move ra,zero
400d18: 8f848018 lw a0,-32744(gp)
400d1c: 8fa50000 lw a1,0(sp)
400d20: 27a60004 addiu a2,sp,4
400d24: 2401fff8 li at,-8
400d28: 03a1e824 and sp,sp,at
400d2c: 27bdffe0 addiu sp,sp,-32
400d30: 8f87801c lw a3,-32740(gp)
400d34: 8f888020 lw t0,-32736(gp)
400d38: 00000000 nop
400d3c: afa80010 sw t0,16(sp)
400d40: afa20014 sw v0,20(sp)
400d44: afbd0018 sw sp,24(sp)
400d48: 8f998024 lw t9,-32732(gp)
400d4c: 00000000 nop
400d50: 04110097 bal 400fb0 <__libc_start_main>
400d54: 00000000 nop
第一条指令是0x03e00021,我把它翻译为操作码= 0,rs = 31,rt = 0,rd = 0,shamt = 0,功能= 33,所以它是addu $0, $31, $0
,写入寄存器$ 0,始终为零。为什么会有这么奇怪的指示?