【问题标题】:How to convert MIPS instructions to machine code?如何将 MIPS 指令转换为机器码?
【发布时间】:2014-06-27 21:46:04
【问题描述】:

我坚持将下面的 MIPS 指令转换为机器代码

  sb $t3, 40($s2)
  beq $s0, $s1, Lab1
  j Lab1

  jr $s0

到目前为止,我已经

101000  10010       01011       101000
000100  10000       10001       0x00400000

我该怎么走?由于 0x00400000 是地址而不是值,我不认为我将它翻译成二进制。等等……我真的找不到从这里继续下去的例子。

【问题讨论】:

    标签: assembly mips machine-code instruction-set


    【解决方案1】:

    编码取决于指令类型。

    对于像beq 这样的相对分支,立即数是偏移量,因此您需要指定当前指令与分支目标之间的距离。例如,要跳过接下来的 3 条指令,您需要 beq $s0, $s1, +3 编码为

    opcode      $s0      $s1                     +3
    000100    10000    10001    0000 0000 0000 0011
    

    对于绝对跳转你需要确保目标和当前指令的高6位相同。立即地址是目标的低 26 位移位 2。j 指令的格式是0000 10ii iiii iiii iiii iiii iiii iiii,所以j 0x00400000 将被编码为

    0000 1000 0001 0000 0000 0000 0000 0000
    

    您可以在this question 中阅读有关编码的更多信息以及此处的课程:

    指令编码也可以here

    但是为什么你同时使用条件分支并跳到彼此旁边的Lab1?这是没用的,因为最终它会什么都不做就跳起来

    【讨论】:

    • 由教授指定。他可能是为了让学生知道它的作用。
    【解决方案2】:

    MIPS 指令中的立即数直接编码为其二进制表示。

    【讨论】:

    • 当 0x00400000 表示为 010000000000000000000000(24 位)而在 I 型中它应该是 16 时,我该怎么做?怎么压缩?
    • 如果0x00400000代表Lab1的地址,那么你需要编码你想跳过的指令的数量,我相信就是address of target instruction - address of branch instruction - 1,但我可能错了关于那个。但是,如果0x00400000已经代表了那个跳转,那就不可能了,你的代码需要调整
    • 实际上,经过反思,我意识到如果0x00400000 是偏移量,则可以进行汇编,但它需要添加额外的指令才能跳转到通常允许的 16 位之外
    【解决方案3】:

    啊,通过查看MIPS: Calculating BEQ into Hexadecimal Machine Code 和 Lưu 的回答,我想我现在有了一个更好的主意。

      beq $s0, $s1, Lab1
    =>000100 10000 10001 0x00400000
    =>0001 0010 0001 0001 (0x004000040 + 1 away instruction)
    =>0001 0010 0001 0001 0000 0000 0000 0101
    =12110001
      j Lab1
    =>0000 1000 0001 0000 0000 0000 0000 0000
    =08100000
      jr $s0
    =>0000 0000 0000 0000 0000 0000 0000 1000
    =02000008
    

    所以这就是我得到的。如果有任何错误请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      相关资源
      最近更新 更多