MIPS - 创建订单的二进制字

时间:2011-03-27 13:54:25

标签: programming-languages assembly mips

我在MIPS语言中有以下代码:

lw $s5, -20($s6)

sub $t1, $s5, $t2

addi $t1, $t2, 50

我需要将每个订单转换为其代码:

一个。十进制 湾十六进制 C。二进制32位

第一个订单(lw ​​$ s5,-20($ s6))我做了:

一个。 35 | 22 | 21 | -20

湾23 | 16 | 15 | ç

3个问题:

1)我是对的吗? 2)32位二进制代码是什么? 3)其他2个订单的其他代码是什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

根据操作数和指令类型,有几种编码方案,但它们全部由32位组成,前六位指定操作码(add,lw等)。

  • 注册编码:这些指令仅在寄存器上运行。前六位为0,接下来有三个五位字段,分别指定第一和第二源寄存器和目标寄存器。最后还有其他六位指定函数(add,sub等)

  • 立即编码:这些指令有一个操作数,它是一个内存位置。在六位操作码之后,第一和第二寄存器有两个5位的字段,存储位置有16位的字段。

  • 跳转编码:它们由六位操作码和二十六位跳转目标组成

This article解释了这些指令编码,并列出了二进制中的所有操作码/函数编码。一旦确定了二进制形式,只需将其转换为十进制和十六进制。

示例: 假设我们想要lw $s5, -20($s6)的编码。这属于立即编码类别,其编码为ooooooss sssttttt iiiiiiii iiiiiiii,o为操作码,s为第一个寄存器,t为第二个寄存器,i为常量。查看表格,我们发现lw的操作码为100011。指定寄存器的编号就足够了,因此s是00101,t是00110。常数(-20)由2s补码表示。 20为10100时,其16位补码为1111111111101100lw具有 loadstore 语法,该模板为o $t, i ($s),因此寄存器在编码中交换。因此lw $s5, -20($s6)的指令编码是

ooooooss sssttttt iiiiiiii iiiiiiii
10001100 11000101 11111111 11101100

8C C5 FF EC(十六进制)和140 197 255 236(十二月)