【问题标题】:Why doesn't jr instruction (MIPS) do what I expect it to do in my code?为什么 jr 指令 (MIPS) 没有按照我的预期在我的代码中执行?
【发布时间】: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


【解决方案1】:

您好留下答案,因为我还不能发表评论。看起来您找到了一种解决方案。不确定您是否可以在此特定练习中从内存中添加变量,但是可以,立即数据限制为 16 位。我通常做的是在 .data 中声明一个变量,例如 0x100000 来表示地址,然后将其加载到寄存器中以访问该 mem 地址。我倾向于将其用作置换,但我不明白为什么它也不能作为您的问题的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 2020-11-10
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2022-07-06
    相关资源
    最近更新 更多