我在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个订单的其他代码是什么?
谢谢!
答案 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位补码为1111111111101100
。 lw
具有 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
(十二月)