这是我的MIPS汇编代码:
# Assembly Description Address
main: addi $2, $0, 5 # intialize $2 = 5 00
addi $3, $0, 12 # intialize $3 = 12 04
addi $7, $3, -9 # intialize $7 = 3 08
addi $8, $0, 44 # should init $8 = 44 0c
or $4, $7, $2 # $4 = (3 OR 5) = 7 10
and $5, $3, $4 # $5 = (12 AND 7) = 4 14
add $5, $5, $4 # $5 = 4 + 7 = 11 18
beq $5, $7, end # shouldn’t be taken 1c
slt $4, $3, $4 # $4 = 12 < 7 = 0 20
beq $4, $0, around # shouldn’t be taken 24
addi $5, $0, 0 # shouldn’t be taken 28
around: slt $4, $7, $2 # $4 = 3 < 5 = 1 2c
add $7, $4, $5 # $7 = 1 + 11 = 12 30
sub $7, $7, $2 # $7 = 12 – 5 = 7 34
srl $7, $7, 2 # $7 = 7>>2 = 1 38
jr $8 # jump to [8] = 44 3c
addi $2, $0, 1 # shouldn’t be taken 40
sw $7, 68($3) # [80] = 1 44
lw $2, 80($0) # $2 = [80] = 1 48
j end # should be taken 4c
addi $2, $0, 1 # shouldn’t happen 50
end: sw $2, 84($0) # write mem[84] = 1 54 它工作得很好,直到我添加了jr $8和addi $2,$0,1指令,所以地址为3c和40的指令。我不知道为什么它会导致程序失败。我认为jr指令将转到$8寄存器内部的地址,我在第4条指令中将该地址指定为44,在此初始化$8。我的想法是jr指令将使其跳转到地址44,然后执行sw指令,因此将省略紧接jr之后的addi指令。
为什么它不能做我想让它做的事?我在MIPS火星上运行它,当一步一步地进行时,它似乎永远不会到达指令sw……取而代之的是14号寄存器...?
有人能解释一下我对jr指令的误解吗?
发布于 2019-11-30 22:31:38
嗨,留下一个答案,因为我还不能评论。看起来你找到了一个解决方案。不确定在本练习中是否可以从内存中添加变量,但是可以,即时数据限制为16位。我通常做的是在.data中声明一个变量,比如0x100000来表示地址,然后将它加载到一个寄存器中以访问该内存地址。我倾向于使用它作为置换,但我不明白为什么它不能作为您的问题的解决方案。
https://stackoverflow.com/questions/59091253
复制相似问题