Assembly 为什么';t jr指令(MIPS)在我的代码中做我期望它做的事情吗?

Assembly 为什么';t jr指令(MIPS)在我的代码中做我期望它做的事情吗?,assembly,mips,instructions,machine-code,Assembly,Mips,Instructions,Machine Code,这是我的MIPS汇编代码: # Assembly Description Address main: addi $2, $0, 5 # intialize $2 = 5 00 addi $3, $0, 12 # intialize $3 = 12 04

这是我的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       
#组件描述地址
main:addi$2、$0、5#初始化$2=500
加上$3、$0、12#初始化$3=12 04
加上$7、$3、-9#初始化$7=3 08
addi$8,$0,44#应初始$8=44 0c
或$4、$7、$2#$4=(3或5)=710
和$5、$3、$4#$5=(12和7)=414
加上$5、$5、$4#$5=4+7=11 18
beq$5,$7,结束不应该被拿走
slt$4,$3,$4#$4=12<7=0 20
贝基4美元,0美元左右,不应该是24美元
addi$5、$0、0不应该被拿走28
大约:slt$4,$7,$2#$4=3<5=1 2c
加上$7、$4、$5#$7=1+11=12 30
低于$7、$7、$2#$7=12–5=7 34
srl$7,$7,2#$7=7>>2=138
jr$8#跳到[8]=443C
addi$2、$0、1不应该被拿走40
sw$7,68($3)#[80]=144
lw$280($0)#$2=[80]=148
j端应取4c
加上$2,$0,1,不应该发生在50
结束:sw$284($0)#write mem[84]=154
在我添加jr$8和addi$2$0,1指令之前,它运行良好,地址3c和40处的指令也是如此。我不知道为什么它会导致程序失败。我认为jr指令将进入$8寄存器中的地址,我在第4条指令中指定为44,在这里初始化$8。其想法是jr指令将跳转到地址44,然后sw指令将在地址44执行,因此jr后面的addi指令将被省略

为什么它不做我想让它做的事?我在MIPS mars中运行它,当一步一步地运行时,它似乎永远不会到达指令sw。。。相反,它去登记号码14


有人能解释一下我对jr指令的误解吗?

嗨,请留下一个答案,因为我还不能发表评论。看来你找到了一个解决办法。不确定是否可以在这个特定练习中从内存添加变量,但可以,即时数据限制为16位。我通常要做的是在.data(例如0x100000)中声明一个变量来表示地址,然后将其加载到寄存器中以访问该mem地址。我倾向于用它来代替,但我不明白为什么它不能解决你的问题

确保实际加载地址为零,因为通常情况并非如此。只需使用标签,而不是硬编码
44
。谷歌搜索表明基址通常是
0x400000
@Jester在使用jr指令的同时,有没有办法使用标签?我想我明白了。它显示在MIPS中的该sw指令处的地址实际上是00400044。但这难道不意味着我根本不能使用addi,因为它仅限于16位吗?我被期望只使用可见的指令,但也需要一个jr指令。你真的只允许这些指令吗?甚至没有一个
SLL
?无论如何,在添加
0x44
@Jester之前,您可以先加载
0x4000
,然后使用两条
ADD
指令模拟
SLL
,以获得
0x400000
,尽管这可能是解决方案。我现在就试试看。@Jester谢谢你的帮助,我已经做了addi,然后做了许多添加,最后addi提醒我需要什么,并测试了它,以确保它工作正常!