我试图了解如何解码 MIPS 二进制指令。
我使用 gcc 在 Debian MIPS 系统上用 C 语言编译了一个 hello world 程序,objdump 显示 .text 部分中的第一条指令是:
600: 03e00025 move zero,ra
我不明白它如何确定这是MOVE
指令。
03e00025
是00000011111000000000000000100101
二进制的。如果我理解正确,这里的前 6 位是操作码,在这种情况下全为 0,这意味着它是 R 型指令,所以我们必须查看最后 6 位,即100101
. 查看MIPS 指令集手册,它看起来应该是OR
指令。MOVE
我什至在那个手册里都找不到。
对此进行谷歌搜索,我发现程序集中显然有“伪”指令,并且应该move $t, $s
扩展为addiu $t, $s, 0
,但如果我查看手册ADDIU
有 opcode 001001
。我发现的另一个结果声称它转换为ADD
但最后六位ADD
应该是100000
,所以这也不适合。
我错过了什么?