Mips I型指令-关于机器转汇编代码的问题

问题描述 投票:0回答:1

我想问如何将机器代码读取为汇编代码。我只做过像这样的转换

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.

有人可以帮助我理解这种转换这些代码片段的方式有什么问题吗?在我的第一个示例中它没有错。

assembly
1个回答
0
投票

首先,MIPS 不使用 $rX 寄存器号。

寄存器有两种命名方案:

  1. 原始编码编号,从 $0 到 $31。

  2. 友好名称,使用单个字母字符后跟单个数字。这些友好的名称帮助我们根据用途和调用约定选择注册。

    • 字母字符(大部分)是 v、a、t、s

      • v代表value,意思是函数返回值
      • a 代表argument,这里的意思是函数调用的实际参数\
      • t 代表临时,意思是调用被破坏
      • s代表saved,意思是调用preserved

提示:切勿在同一程序中混合原始编码数字和友好的寄存器名称 - 非常混乱。所以,只要坚持使用友好的寄存器名称即可。

姓名 数字 使用 跨界保存
$零 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 中)列。前者显示各种格式的机器代码字段,而后者显示每个单独的指令如何使用这些字段。

© www.soinside.com 2019 - 2024. All rights reserved.