繁体   English   中英

“系统调用”指令如何在 mips 程序集上工作?

[英]How does the "syscall" instruction works on mips assembly?

例如,让我们有这个代码:

.data
    msg: .asciiz "Hello world!" #message to be shown


.text
    li $v0, 4 #instruction for string printing
    la $a0, msg #indication of where the string is
    syscall #make it print

“li”将调用指令准备打印,“la”将变量 msg go 写入寄存器“a0”,我知道 syscall 应该打印消息,但它究竟是如何做到的? 它怎么知道它必须打印哪个寄存器? 因为我没有在系统调用中的任何地方指出要打印的寄存器(例如在语言 c 中,它可能类似于 printf("%s",msg)),但它知道无论如何它必须打印 $a0 而我不知道如何以及为什么。

理论上, syscall指令只是将处理器的控制(指令执行流)转移到系统/内核异常处理程序。 该异常处理程序具有执行每个特定syscall的所有操作的软件,然后返回到用户代码 - 正是该软件知道查看$v0$a0 这就像一个子程序调用,但调用的是 kernel 代码而不是用户子程序。 硬件指令基本上“跳转”到那里,然后软件执行 rest。

更具体地说, syscall指令调用异常机制。 它捕获执行用户代码的 PC,然后更改为特权模式,设置异常原因,并将 PC 更改为 0x80000800,开始运行 kernel 异常处理程序。

我在理论上说,因为使用模拟器,它们的作用类似,但syscall可以作为直接在模拟器本身内的软件(而不是作为模拟异常处理程序)实现; 如果以这种方式实现,软件还知道每个特定的syscall ,哪些寄存器有哪些参数,以及运行操作后如何返回给用户代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM