Lau*_*nce 2 assembly mips machine-language labels addressing
这都是相关的,我尽我所能将它们拼合起来,所以请耐心等待。
我对如何正确处理标签感到非常困惑。例如,在下面的代码位中,“ 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:
Run Code Online (Sandbox Code Playgroud)
当我向上移动loopend时,“ bne”变为“ 00010101001001011111111111111111”,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
Run Code Online (Sandbox Code Playgroud)
因此,据我了解,在代码的第一位loopend
是在八条指令之后,因此它的地址是4 * 8 = 32 = 0x00000020。在代码的第二位中,loopend
是在两条指令之后,因此其地址为4 * 2或0x00000008。
但是,我不明白的是标签地址。如果我错了,请纠正我:标签地址取决于标签相对于调用它的指令的位置。因此,在代码的第一位中,loopend
比代码晚两行,bne
因此您不要翻转符号,其地址是“ 0000000000000001”。在第二个loopend
之前,bne
因此您翻转符号,其地址变为“ 1111111111111011”。
我知道您将地址左移2位,但是我仍然很困惑。您是否仅在结尾没有两个0的情况下才向左移动,例如第二个loopend
?
我最紧迫的问题是:0000000000000001的地址在哪里loopend
,甚至来自第一个bne机器语言翻译中?我以为标签的地址loopend
是0000000000100000。
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 |
|_____________|_____________________________________________________________|
Run Code Online (Sandbox Code Playgroud)
对于第一个bne,偏移量为1,所以1 << 2 = 4,因此您将程序计数器增加了四个字节。由于字长为32位,因此pc将增加一条指令
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 |
|_____________|_____________________________________________________________|
Run Code Online (Sandbox Code Playgroud)
对于第二个bne,偏移量为b1111111111111011,符号扩展了-5,所以-5 << 2 = -20,因此您将程序计数器增加-20个字节或将其减少20个字节。由于字长为32位,因此pc递减了5条指令
.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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10870 次 |
最近记录: |