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