我想问如何将机器代码读取为汇编代码。我只做过像这样的转换
001000 00001 00000 0000000000000100 -- addi $r0, $r1, 0x0004
或者像这样的R型指令
000000 00000 00001 00010 00000 100000 -- add $r2, $r0, $r1.
但现在我遇到了一些类似这样的说明
001000 10001 10000 0000000000000101 -- addi $s0, $s1, 5
和
001000 10011 01000 1111111111110100 -- addi $t0, $s3, –12.
我知道对于addi指令来说它是
addi target_reg, source_reg, imm
并且我假设他们在这里写$t和$s因为它是目标和源reg,但我不明白为什么它们的红色与我给出的示例不同第一的。
例如,如果我将 lw 指令的机器代码写成红色,我会将其写为
addi $t16, $s17, 5
和
addi $t8, $s19, -12.
有人可以帮助我理解这种转换这些代码片段的方式有什么问题吗?在我的第一个示例中它没有错。
首先,MIPS 不使用 $rX 寄存器号。
寄存器有两种命名方案:
原始编码编号,从 $0 到 $31。
友好名称,使用单个字母字符后跟单个数字。这些友好的名称帮助我们根据用途和调用约定选择注册。
字母字符(大部分)是 v、a、t、s
提示:切勿在同一程序中混合原始编码数字和友好的寄存器名称 - 非常混乱。所以,只要坚持使用友好的寄存器名称即可。
姓名 | 数字 | 使用 | 跨界保存 |
---|---|---|---|
$零 | 0 美元 | 常数值0 | 不适用 |
$在 | 1 美元 | 临时汇编器 | 没有 |
$v0-$v1 | $2-$3 | 函数结果 | 没有 |
$a0-$a3 | $4-$7 | 函数参数 | 没有 |
$t0-$t7 | $8-$15 | 临时工 | 没有 |
$s0-$s7 | $16-$23 | 已保存的临时文件 | 是的 |
$t8-$t9 | $24-$25 | 临时工 | 没有 |
$sp | 29 美元 | 堆栈指针 | 是的 |
$ra | 31 美元 | 退货地址 | 没有 |
欲了解更多信息,请参阅:
https://inst.eecs.berkeley.edu/~cs61c/resources/MIPS_Green_Sheet.pdf
并研究 MIPS 调用约定。
对于 I-Type 指令,机器代码与汇编语言中的
rs
和 rt
是相反的。 R 型指令也是如此。
请参阅基本指令格式表,以及核心指令集的操作(Verilog 中)列。前者显示各种格式的机器代码字段,而后者显示每个单独的指令如何使用这些字段。