Branch on not equal 的语法为 bne rs,rt,label,其中前 6 位是操作码,接下来的 5 位是 rs,接下来的 5 位是 rt,其余的是分支目标地址的标签:
BTA = PC + 4 + imm * 4
这是通过符号扩展立即数,乘以 4 并将其和 4 添加到程序计数器来计算的。有关解释,请参阅此问题
How to Calculate Jump Target Address and Branch Target Address?
bne 格式是立即数(I 型)。操作码是 5 (000101)。例如,此机器代码打印字母表中的每三个字符。
00100100000100000000000000110000
00000000000100000010000000100001
00100100000000100000000000001011
00000000000000000000000000001100
00100010000100000000000000000011
00100100000010000000000001011101
00010110000010001111111111111010
00000000000000000000000000000000
00001000000100000000000000001000
00000000000000000000000000000000
它是 10 行(10 条指令)。第 7 行是一个分支,它的机器代码为 00010110000010001111111111111010。前 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 : 00010100001010101111111111111011 。前 6 位 000101 是操作码,接下来的 5 (00001) + 5 (01010) 位是寄存器,其余 (1111111111111011) 是分支目标地址的立即值(十六进制1111111111111011=FFFB。
有关详细信息,请参阅MIPS manual。