【问题标题】:Runtime exception at 0x00400010: address out of range 0x000000000x00400010 处的运行时异常:地址超出范围 0x00000000
【发布时间】:2021-10-09 08:38:12
【问题描述】:

我的 MIPS 实现,遍历字符串: 我不断得到:

  • PC=0x10010010 发生异常
  • 文本读取地址错误:0x10010010

不知道为什么会这样,我尝试调试和单步执行。如果有人确切知道此代码中有什么问题,请回答。我正在继续尝试调试..

是的,这是整个代码,请随意在 QtSpim 中运行它。

    .data

   STR_str:
    .asciiz "Cow, Bird, Beer"

   .text

   loop_over_strings:

    addi    $sp, $sp, -4        
    sw  $ra, 0($sp) 
    sw  $a1, 8($sp)

     loop:
    
      sw $a0, 4($sp)        
      lb $t0, 0($a0)            
      beqz $t0, end_loop
    
    jalr $a1                
    
    lw $a0, 4($sp)
    lw $a1, 8($sp)
    addi $a0, $a0, 1        
    j loop  

   end_loop:
    lw  $ra, 0($sp)         
    addi    $sp, $sp, 4     

    jr  $ra


    .text
    .globl main

   main:
    addi    $sp, $sp, -4    # PUSH return address
    sw  $ra, 0($sp)
    
    la  $a0, STR_str
    la  $a1, ascii
    jal loop_over_strings
    
    lw  $ra, 0($sp) # POP return address
    addi    $sp, $sp, 4 
    
    jr  $ra

【问题讨论】:

  • 你有这个的 C 版本可以比较吗?我无法理解您可能想要做什么。
  • @ErikEidt,根据您的要求发布了 C 代码。谢谢。
  • 这段 C 代码并不是一回事。名字不一样,参数不一样,C版没有函数指针,为什么汇编版有? loop_over_strings 在汇编中有 2 个参数,但我在 C 中没有看到两个参数函数(也没有一个名为 loop_over_strings 的函数)。
  • @ErikEidt,那是因为,我编写了一个从 MIPS 中的 main 调用的函数来分离代码。也许,我也应该在 C 中做到这一点。基本上,我试图一个接一个地遍历所有字符,并打印字符和它的原始 ASCII 代码。我正在发送到 MIPS 中的子程序 ascii 函数。
  • 为了您自己的清晰性(以及我们的),使 C 代码与您尝试执行的操作完全匹配。我认为,工作 C(或伪)代码对于清晰和让您的算法正常工作至关重要,因此请在汇编中完全遵循它——不要在进行汇编时进行优化或更改。如果您想要优化或其他更改,请先在 C 中进行,确保它们有效,然后按字面翻译 C。工作算法与其汇编翻译的适当分离使汇编编程变得更加容易。

标签: assembly mips


【解决方案1】:

loop_over_strings 中,您分配了 4 个字节的堆栈空间,但它使用了 12 个字节,因此某些内容将被覆盖 — 被覆盖的内容可能是其他人的堆栈返回地址。

【讨论】:

    【解决方案2】:

    您已将部分代码放入.data 部分。它需要在.text 部分中。

    【讨论】:

    • 是的,但是,我解决了这个问题。 但是,我不断遇到问题。问题依然存在。如果你有QtSpim,你可以运行代码,看看有什么问题,我错过了什么。
    • 您已编辑问题,使标题不再与描述匹配。我回答了原来的问题。单独的问题应作为单独的问题处理。尽管您现在在标题中提到的问题应该很容易让您自己解决,因为您知道异常发生的确切说明。
    • 对不起。我没有改标题。我添加了.text,这样人们就不会感到困惑了。不,我不知道问题出在我的代码中,这就是我在这里发布的原因。你Michael没有理由在这附近表现不尊重
    • @JohnSmith editing history 似乎不同意您的说法,表明您将标题从“PC=0x1001000c 发生异常,文本中的错误地址:0x1001000f”更改为“运行时异常”在 0x00400010:地址超出范围 0x00000000"。
    • 同样的错误。在 MARS Mips Assembler Runtime Simulator 向我显示该错误后,我对其进行了更新,而之前的错误来自 QtSpim
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多