能帮我把mips翻译成二进制吗?
我不懂如何翻译标签。任何人都可以帮我 假设我们有以下代码:能帮我把mips翻译成二进制吗?,mips,Mips,我不懂如何翻译标签。任何人都可以帮我 假设我们有以下代码: loop: add $t2,$t2,$t1 addi $t2,$t2,4 sw $t2,4($s0) bne $t2,20,loop jr $ra 如何翻译成二进制bne$t2,10,loop?不相等的分支具有语法bne rs,rt,label,其中前6位是操作码,后5位是rs,后5位是rt,其余是分支目标地址的标签: BTA=PC+4+imm*4 这是通过符号扩展立即数,乘以4,然后
loop:
add $t2,$t2,$t1
addi $t2,$t2,4
sw $t2,4($s0)
bne $t2,20,loop
jr $ra
如何翻译成二进制
bne$t2,10,loop
?不相等的分支具有语法bne rs,rt,label
,其中前6位是操作码,后5位是rs,后5位是rt,其余是分支目标地址的标签:
BTA=PC+4+imm*4
这是通过符号扩展立即数,乘以4,然后将其和4相加到程序计数器来计算的。有关解释,请参见此问题
bne
格式为立即(I型)。操作码为5(000101)。例如,该机器代码在字母表中每隔三个字符打印一次
00100100000100000000000000110000
00000000000100000010000000100001
00100100000000100000000000001011
00000000000000000000000000001100
00100010000100000000000000000011
00100100000010000000000001011101
00010110000010001111111111111010
00000000000000000000000000000000
00001000000100000000000000001000
00000000000000000000000000000000
它是10行(10条指令)。第7行是一个分支,其机器代码00010110000001000111111111111010
。前6个数字000101
是操作码5。然后是5+5位寄存器(在本例中,寄存器为$16和$8,其余为立即分支目标地址)
同样,您的程序
.text
loop:
add $t2,$t2,$t1
addi $t2,$t2,4
sw $t2,4($s0)
bne $t2,20,loop
jr $ra
将机器代码转换为7行:
00000001010010010101000000100000
00100001010010100000000000000100
10101110000010100000000000000100
00100000000000010000000000010100
00010100001010101111111111111011
00000011111000000000000000001000
实际的翻译是这样的
Address Code Basic Source
0x00400000 0x01495020 add $10,$10,$9 3 add $t2,$t2,$t1
0x00400004 0x214a0004 addi $10,$10,0x00000004 addi $t2,$t2,4
0x00400008 0xae0a0004 sw $10,0x00000004($16)5 sw $t2,4($s0)
0x0040000c 0x20010014 addi $1,$0,0x00000014 6 bne $t2,20,loop
0x00400010 0x142afffb bne $1,$10,0xfffffffb
0x00400014 0x03e00008 jr $31 7 jr $ra
…其中倒数第二行是bne
:000010000010101111111111111011
。前6位000101
是操作码,后5位(00001
)+5位(01010
)是寄存器,其余(111111111011
)是分支目标地址的立即值(十六进制111111011
=FFFB
)
有关更多详细信息,请参阅。一些需要注意的事项
分支偏移量总是从分支+4(即PC+4)的地址计算出来,因此它是相对于jr
指令的地址的
由于mips指令必须与字[四字节边界]对齐,因此指令地址的最右边两位将[必须始终]为零
mips体系结构利用了这一点,将分支偏移量编码为字偏移量(即字节偏移量右移2)。这将分支指令16位即时编码的范围扩展到18位
下面是清单:
00: loop:
00: add $t2,$t2,$t1
04: addi $t2,$t2,4
08: sw $t2,4($s0)
0C: bne $t2,20,loop
10: jr $ra
jr
地址是0x10
,因此循环的字节偏移量将是-0x10,编码偏移量将是-0x04或0xFFFC,bne
将是xxxxFFFC
但是…这有一个问题。这个特殊的bne
使用一个立即数作为第二个参数。这使得bne
成为一个伪操作,而不是一个简单的bne
指令
因此,实际顺序变成:
00: loop:
00: add $t2,$t2,$t1
04: addi $t2,$t2,4
08: sw $t2,4($s0)
0C: addi $at,$zero,20
10: bne $at,$t2,loop
14: jr $ra
请注意,bne
变为两个指令序列:addi
和bne
jr
地址现在是0x14
,因此循环的字节偏移量将是-0x14,编码偏移量将是-0x05或0xFFFB,bne
将是xxxxFFFB
bne
汇编程序格式为:
bne s,t,label
bne
编码为:
0001 01ss ssst tttt iiii iiii iiii iiii
因此,s
寄存器是$at
或$1
-->00001
t
寄存器是$t2
或$10
-->01010
因此,现在我们有:
0001 01ss ssst tttt iiii iiii iiii iiii
00 0010 1010
0001 0100 0010 1010 iiii iiii iiii iiii
在十六进制中,这是
142Ayyyy
。我们已经知道yyyy
是FFFB
,所以最后的十六进制值是:142affb
这是一个叫做汇编程序的工作,它接受汇编代码并将其转换为机器字节码。通常情况下,你不需要手工完成这项工作。如果你是手工完成的,你需要c求出“bne”和“loop:”之间的字节数,并将其替换为“loop”参数。因此,如果它运行的是32位指令,“loop:”中的值在bne$t2,10中,循环应该是-12。就像在4字节的på行和3行中一样。现在查找MIPS指令的信息。我猜二进制应该是:0001 01ss sss0 1010 1111 1111 1111 0110。我不确定这一点。@Rapsefar不,值应该是-16,因为要跳转的行是从一开始计数的跳转指令后的第行。还要注意,操作码中实际存储的是-4,因为操作码中的值将乘以4来计算跳转距离。