【发布时间】:2019-11-28 14:38:24
【问题描述】:
这是我的 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 mars 中运行它,一步一步进行时它似乎永远不会到达指令 sw ......相反,它进入了 14 号寄存器......?
有人能解释一下我对 jr 指令的误解吗?
【问题讨论】:
-
确保实际加载地址为零,因为通常情况并非如此。只需使用标签而不是硬编码
44。稍微谷歌搜索表明基地址通常是0x400000。 -
@Jester 有没有办法在使用 jr 指令的同时使用标签?我想我明白它可能是什么。它表明在 MIPS 中该 sw 指令的地址实际上是 00400044。但这是否意味着我根本不能使用 addi,因为它仅限于 16 位?我应该只使用可见的指令,但也需要一个 jr 指令..
-
你真的只允许那些指令吗?甚至没有
SLL?无论如何,然后您可以先加载0x4000,然后使用一对ADD指令模拟SLL以获取0x400000,然后再添加0x44。 -
@Jester 好的,尽管这可能是解决方案。我现在就试试。
-
@Jester 感谢您的帮助,我已经完成了 addi,然后进行了许多添加,最后添加了提醒我需要的内容并对其进行了测试以查看它是否有效!
标签: assembly mips instructions machine-code