这一切都是相关的,我尽可能在逻辑上将它们拼凑在一起,所以请耐心等待。
我对如何正确处理标签感到困惑。例如,在下面的代码中,“bne”转换为“00010101001001010000000000000001”,loopend的标签地址为0x00000020(32)
.text
la $a0, opOne
lw $a0, 0($a0)
la $a1, opTwo
lw $a1, 0($a1)
add $t0, $zero, $a0
addi $t1, $zero, 1
bne $t1, $a1, loopend
addi $t1, $t1, 1
loopend:
当我向上移动时,“bne”变为“00010101001001011111111111111011”,并且loopend的地址变为0x00000008(8)
.text
la $a0, opOne
lw $a0, 0($a0)
loopend:
la $a1, opTwo
lw $a1, 0($a1)
add $t0, $zero, $a0
addi $t1, $zero, 1
bne $t1, $a1, loopend
addi $t1, $t1, 1
根据我的理解,在代码的第一位,loopend
是在八条指令之后,因此它的地址是4 * 8 = 32 = 0x00000020。在第二位代码中,loopend
在两条指令之后,因此其地址为4 * 2或0x00000008。
然而,我不明白的是标签地址。如果我错了,请纠正我:标签地址取决于标签相对于调用它的指令的位置。因此,在代码的第一位,loopend
比bne
晚两行,因此您不要翻转符号,其地址为“0000000000000001”。在loopend
之前的第二个bne
,所以你翻转标志,其地址变为“1111111111111011”。
我知道你将地址转移到左边2位,但我仍然很困惑。如果最后没有两个0,你只会向左移动,比如第二个{{1}}?
我最紧迫的问题是:0000000000000001,loopend
的地址,甚至来自第一个机器语言翻译?我认为标签loopend
的地址是0000000000100000。
答案 0 :(得分:5)
BNE -- Branch on not equal
___________________________________________________________________________
|Description: | Branches if the two registers are not equal |
|_____________|_____________________________________________________________|
|Operation: | if $s != $t advance_pc (offset << 2)); else advance_pc (4); |
|_____________|_____________________________________________________________|
|Syntax: | bne $s, $t, offset |
|_____________|_____________________________________________________________|
|Encoding: | 0001 01ss ssst tttt iiii iiii iiii iiii |
|_____________|_____________________________________________________________|
对于第一个,偏移是1,所以1 <&lt;&lt;&lt; 2 = 4所以你将程序计数器增加4个字节。由于字长为32位,因此pc增加一条指令
.text
la $a0, opOne
lw $a0, 0($a0)
la $a1, opTwo
lw $a1, 0($a1)
add $t0, $zero, $a0
addi $t1, $zero, 1
bne $t1, $a1, loopend
addi $t1, $t1, 1 # increment by 1 insruction
loopend: # to here (well the next instruction)
对于第二个偏移,偏移是b1111111111111011,符号扩展为-5,因此-5&lt;&lt; 2 = -20所以你将程序计数器递增-20字节或递减20字节。由于字大小为32位,因此pc减少了5条指令
.text
la $a0, opOne
lw $a0, 0($a0)
loopend: #
la $a1, opTwo # 5 to here
lw $a1, 0($a1) # 4 ^
add $t0, $zero, $a0 # 3 |
addi $t1, $zero, 1 # 2 |
bne $t1, $a1, loopend # 1 |
addi $t1, $t1, 1 # decrement by 5 instructions