【发布时间】:2020-10-18 18:41:59
【问题描述】:
我刚开始使用 Mips,所以这听起来很简单,但是:
当我在 without li $v0,10 指令的情况下编写上面的代码时,我收到一条错误消息:内存地址超出范围
当我添加它时,它没有任何警告。
这是什么意思?
.text
.globl main
main:
li $t1,27
li $t2,2
mulou $t3,$t1,$t2
li $v0,10
syscall
【问题讨论】:
我刚开始使用 Mips,所以这听起来很简单,但是:
当我在 without li $v0,10 指令的情况下编写上面的代码时,我收到一条错误消息:内存地址超出范围
当我添加它时,它没有任何警告。
这是什么意思?
.text
.globl main
main:
li $t1,27
li $t2,2
mulou $t3,$t1,$t2
li $v0,10
syscall
【问题讨论】:
li 本身只是将立即数加载到寄存器中。在这种特殊情况下,syscall 另一端的服务例程会查看$v0 中的值以判断请求的功能。 10 是 exit 的代码(参见 list of system calls supported by spim)。如果您不设置$v0,那么将根据$v0 恰好包含的值执行一些随机函数。很可能它不会是exit,所以 cpu 会尝试继续执行内存中代码之后的任何内容,这迟早会崩溃。
【讨论】:
switch ($v0) { case 10: do_exit(); }
$v0 来满足您的任何需求。这是一个通用寄存器。根据环境,可能有其他退出方式,例如jal exit 甚至只是返回 jr $ra。
li 退出。 syscall 调用操作系统,然后查看$v0。您可以将10 加载到$v0 中,除非您继续执行syscall,否则不会发生任何特别的事情(所以你的过程,在我看来很顽皮,会扼杀它)。