无效的程序计数器值:0。

5
我目前正在使用MIPS处理器下的汇编语言。我现在使用MARS模拟器,但不知何故,每次运行后都会出现以下错误信息:

Go: running try.s

Error in : invalid program counter value: 0

Go: execution terminated with errors.

我无论使用什么代码,都会收到此错误消息。想知道这是否是MARS模拟器中的错误或者是我忽略了什么。

看起来MARS在文件末尾调用jr $31时会重置一些寄存器(如$ra)。我目前正在文件末尾使用断点,但难道没有其他方法吗? - Krewie
从MARS主页上:请将MARS的问题和评论发送给Pete Sanderson博士(PSanderson@otterbein.edu)或Ken Vollmar博士(KenVollmar@missouristate.edu)。这可能是您针对此类特定问题的最佳选择。如果无法解决,请提供更多信息,例如失败的源代码(最简单的情况)以及您正在执行的操作。 - JUST MY correct OPINION
我刚刚下载了MARS(3.8),并尝试了其中一个提供的示例文件(Fibonacci.asm)。我在任何时候都没有看到这个错误。你是怎么做到出现这个错误的? - JUST MY correct OPINION
3个回答

10

你可能会在程序最后使用jr $ra (返回调用者)来结束程序。然而,在MARS中执行的代码没有调用者 - 它在启动时就被执行了,并且没有函数可供返回,因此$ra的内容为零。

在MARS上正确结束程序的方法是使用"exit"系统调用:

    li $v0, 10
    syscall

注意:如果您想将整数作为退出的一部分返回,请参阅此答案 - Senseful

6

我是MIPS的新手,最近遇到了这个问题。

以下是我的代码:

    .data

    .text

swap:
    # do stuff
    jr  $ra

main:
    # do stuff
    jal swap
    li  $v0,10
    syscall

我通过将其更改为以下内容来解决了这个问题:

    .data

    .text
main:
    # do stuff
    jal swap
    li  $v0,10
    syscall

swap:
    # do stuff
    jr  $ra

注意我把main移动到了swap之前。我错误地认为main是一个保留标签,并且它会自动跳转到main。但显然情况并非如此,因为它在调用main中的jal swap之前就已经执行了jr $ra指令。无论如何,希望这可以帮到你。

4
我知道这个问题很古老,但对于像我一样绝望地在谷歌上搜索答案的人:
尝试使用上述系统调用而不是返回操作,并将主函数放在所有其他标签之前。此外,在“设置”菜单下有一个“将程序计数器初始化为全局“main”(如果已定义)”的选项;确保已选中。我不知道启用它是否允许您在其他标签之后放置主标签,因为我还没有尝试过。我所描述的就是我所做的以使它起作用,没有别的了。祝你好运!

无法工作。在我的情况下,我仍然得到相同的错误。 - Spencer H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接