【问题标题】:What does li $v0,10 , in Mips?Mips 中的 li $v0,10 是什么?
【发布时间】: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

【问题讨论】:

    标签: assembly mips qtspim


    【解决方案1】:

    li 本身只是将立即数加载到寄存器中。在这种特殊情况下,syscall 另一端的服务例程会查看$v0 中的值以判断请求的功能。 10exit 的代码(参见 list of system calls supported by spim)。如果您不设置$v0,那么将根据$v0 恰好包含的值执行一些随机函数。很可能它不会是exit,所以 cpu 会尝试继续执行内存中代码之后的任何内容,这迟早会崩溃。

    【讨论】:

    • 所以在 HLL 术语中,10 代表“退出”?
    • 是的。您可以想象操作系统服务例程具有类似switch ($v0) { case 10: do_exit(); }
    • 我读到寄存器 v0、v1 存储结果。 v0 是否有可能用于退出程序以外的其他用途?怎么回事,不是所有的汇编程序都以这条指令结束(我在网上看到一些没有它的代码)。
    • 您可以使用$v0 来满足您的任何需求。这是一个通用寄存器。根据环境,可能有其他退出方式,例如jal exit 甚至只是返回 jr $ra
    • 如果不清楚,不是li 退出。 syscall 调用操作系统,然后查看$v0。您可以将10 加载到$v0 中,除非您继续执行syscall,否则不会发生任何特别的事情(所以你的过程,在我看来很顽皮,会扼杀它)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多