【问题标题】:MIPS bad address/ ExceptionMIPS 错误地址/异常
【发布时间】:2023-03-10 22:21:01
【问题描述】:

代码是用于计算数字的阶乘的递归块。我在 PC 上遇到异常(文本中的地址错误)。我正在查看跟踪但不确定问题出在哪里,除了我的 PC 显示垃圾值这一事实。我在下面附上代码。

.data
    prompt: .asciiz "Enter the n"
.text
    main:
        #User I/O
        li $v0, 4
        la $a0, prompt
        syscall
        li $v0, 5
        syscall
        add $a0, $v0, $zero
        jal fact
        j finish
    fact:
        addi $sp, $sp, -8  #adding two elements (reserve space), since stacks start from higher mem address
        sw $ra, 0($sp)
        sw $a0, 4($sp)

        slti $t0, $a0, 1
        beq $t0, $zero, loop

        addi $sp, $sp, 8
        addi $v0, $zero, 1

        jr $ra

    loop:
        addi $a0, $a0, -1
        jal fact    #stores address of the lw instruction and goes to label-->fact

    lw $a0, 0($sp)
    lw $ra, 4($sp)
    addi $sp, $sp, 8 #deleting 2 elements

    mul $v0, $v0, $a0
    jr $ra #until main ra, recursively go through fact(n)=fact(n-1)*n

    finish:

使用的模拟器:QtSpim

感谢任何帮助。谢谢!我还附上了 PC 和寄存器值以防万一。 Register values at the time of the error

【问题讨论】:

  • 当你用冒泡排序尝试删除了你的另一个问题时,当我试图写一个为了我自己的乐趣时,我把它贴在这里,对不起:pastebin.com/bHFPdgbr
  • 对不起,想重写整个代码。感谢您的贡献,这里是 GitHub 存储库的链接,如果我发布了 MIPS 基础的代码,如果您喜欢它(PR),我可以在那里添加您的代码。链接:github.com/rahulkrishnan98/…
  • 如果您认为值得,请随意将其包含在您的 git 中(我没有指定许可证,但是通过将其发布在 SO 上,它当然可以被视为 PD 或 copyleft 代码段(我应该在那个 pastebin 中提到这一点)。但尤其要尝试了解它的作用/方式,如果您对此有任何疑问,请随时在这里问我(使用@Ped7g 通知我)。GL。:)

标签: assembly mips qtspim


【解决方案1】:

使用您的调试器单步了解lw $ra, 4($sp) 时出了什么问题,以及您实际 加载并使用jr $ra 跳转到的内容。该指令只是跳转到 $ra 中的任何地址,并且最有可能将 PC 设置为虚假的。

看起来您将 $ra 保存到 0($sp),但从 4($sp) 恢复它,因此您正在交换 arg 和返回地址。

此外,您的main 根本不会在输入时保存其$ra,因此您将无法从主目录返回。您在保存$ra 之前运行jal,所以唯一的保存/恢复在fact 内(其定义与main 混合在一起?不要那样做。不要跳过另一个函数的定义,只需将代码从 main 返回或在 main 的底部进行退出系统调用。)

当你j finish 时你可能会崩溃,这会从你的程序末尾掉到非指令中。

【讨论】:

  • 感谢您发现这一点。使用调试器单步执行有助于验证我确实混淆了返回地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多