我目前正在 MIPS 处理器下使用汇编语言。我目前在 使用 MARS 模拟器,由于未知的原因,我每次运行后都会收到以下错误消息:
Go:运行 try.s
错误:无效的程序计数器值:0
Go:执行因错误而终止。
我收到此错误消息与我正在使用的代码无关,只是想知道这是否是一个错误 在火星模拟器中或者如果我缺少什么。
您可能会以
jr $ra
(返回呼叫者)结束程序。然而,MARS 执行的代码没有调用者 - 它在启动时执行,并且没有可返回的函数,因此 $ra
的内容为零。
在 MARS 上结束程序的正确方法是使用“exit”系统调用:
li $v0, 10
syscall
我是 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 中调用 jal swap 之前它已经命中了我的 jr $ra 指令。
无论如何,我希望这会有所帮助。
我知道这个问题很老了,但对于像我一样拼命谷歌搜索答案的人来说:尝试执行上述系统调用而不是返回,并尝试将主函数放在所有其他标签之前。此外,“设置”菜单下还有一个“将程序计数器初始化为全局“主”(如果已定义)”;确保已选中。我不知道启用该功能是否允许您将主标签放在其他标签之后,因为我还没有尝试过。我所描述的是我为使其发挥作用所做的事情,没有其他任何内容。祝你好运!
我在做大学作业时也犯了同样的错误。 在我的文件被教授提供的其他测试文件导入并且没有任何效果后,发生了错误。在检查设置菜单中的“将程序计数器初始化为全局主”选项后,我得到了修复。感谢杰西·维克多的回答。