在 MIPS 汇编中我们为什么要使用系统调用?为什么程序不按照自动给出的指令运行?
In MIPS Assembly why do we use syscall? Why doesn't the program operate on the instructions given automatically?
既然像'li $v0,4'这样的函数已经告诉程序打印一个字符串,为什么还需要系统调用?
syscall
允许您访问系统库。你指出的指令,li $v0,4
只是用来请求syscall
执行相关操作。
这是一种非常常见的编程模式。内核以最高特权级别运行,而不是允许直接访问物理设备,代理通过 syscall
、int 0x80
、sysenter
或用于您正在使用的体系结构和操作系统。这有助于系统整体更加稳定。
虽然您没有说明您的实际 platform/OS 是什么,但 MIPS 的一组标准系统调用示例可以是 found here。如果您查看它,您会发现它允许对您无法访问的设备进行许多操作:
- 打印整数
- 打印浮点数
- 打印双
- 打印字符串
- 读取整数
- 读取浮动
- 读双
- 读取字符串
- sbrk(内存分配)
- 退出
- 打印字符
- 读取字符
- 打开 - 文件、设备等
- 从文件描述符读取(之前用open打开)
- 写入文件描述符(之前用open打开)
- 关闭 - 文件、设备等
一个平台的系统库函数的数量可以根据设计者的需要而定。你会发现Windows、Linux、BSD、Solaris等都是如此
既然像'li $v0,4'这样的函数已经告诉程序打印一个字符串,为什么还需要系统调用?
syscall
允许您访问系统库。你指出的指令,li $v0,4
只是用来请求syscall
执行相关操作。
这是一种非常常见的编程模式。内核以最高特权级别运行,而不是允许直接访问物理设备,代理通过 syscall
、int 0x80
、sysenter
或用于您正在使用的体系结构和操作系统。这有助于系统整体更加稳定。
虽然您没有说明您的实际 platform/OS 是什么,但 MIPS 的一组标准系统调用示例可以是 found here。如果您查看它,您会发现它允许对您无法访问的设备进行许多操作:
- 打印整数
- 打印浮点数
- 打印双
- 打印字符串
- 读取整数
- 读取浮动
- 读双
- 读取字符串
- sbrk(内存分配)
- 退出
- 打印字符
- 读取字符
- 打开 - 文件、设备等
- 从文件描述符读取(之前用open打开)
- 写入文件描述符(之前用open打开)
- 关闭 - 文件、设备等
一个平台的系统库函数的数量可以根据设计者的需要而定。你会发现Windows、Linux、BSD、Solaris等都是如此