我对编程很陌生,我想知道lw(两次)和bne在这个问题上究竟做了什么?我很抱歉这个问题有任何错误,因为我不得不把它翻译成英文。
这里开始提问:
部分数据存储器包含以下值:
地址值
100-1
104-2
108-4
112-8
116-16
鉴于下面的代码,执行此代码后寄存器r1的值是多少?
addi r2,r0,104
lw r1,-4(r2)
addi r3,r0,116
label: addi r2,r2,4
lw r4,-4(r2)
add r4,r4,r4
add r1,r4,r1
bne r2,r3,label
答案 0 :(得分:0)
正如迈克尔所说,阅读说明书并在每行后面放置评论将有助于您理解代码。
addi r2,r0,104 ;r2 = 0d104
lw r1,-4(r2) ;r1 = (0d100)
addi r3,r0,116 ;r3 = 0d116
label:addi r2,r2,4 ;r2 += 4
lw r4,-4(r2) ;r4 = (r2-4)
add r4,r4,r4 ;r4 *= 2
add r1,r4,r1 ;r1 += r4
bne r2,r3,label ;if(r2 ≠ r3), branch to label
nop
LW 表示加载Word 。它将一个字加载到指定地址的寄存器中。
BNE 表示不等于分支。它执行跟随它的指令没有延迟(这就是为什么我在你的代码后添加了一个nop),并且如果作为参数提交的两个寄存器不相等,则转移到指定的地址。
所以会发生的是r1的初始化值为(0d100),即1.然后r3设置为0d116。
r2递增4,r4等于(0d104)处的值,乘以2,然后加到r1。然后循环直到r2 = 0d116,这意味着永远不会读取0d116处的值。
r1 = 1 + 2×2 + 4×2 + 8×2 = 29