能帮我把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来计算跳转距离。