mips - MIPS架构系统调用指令

当您跳出像 MARS 或 SPIM 这样的系统调用有些人为的模拟器环境时,这一点变得更加明显。在真正的 MIPS 机器上,您将使用它来转移控制内核来调用特定功能。

例如,这是一个用于 Linux 机器的 MIPS 32 位汇编中的基本 hello world 程序(我 95% 确定这是在 mipsel 安装上,这对这个问题并不重要)

# CS341L Fall 2008

# Lab Exercise #1

# Matthew J. Barrick

#include

#include

.data

hello: .asciz "Hello World\n"

length: .word 12

.text

.globl main

.ent main

main:

li a0, 1

la a1, hello

lw a2, length

li v0, SYS_write

syscall

move v0, zero

jr ra

.end main

这与 C 代码非常接近(如果您在遵循 MIPS 程序集时遇到问题)。

#include

int main(int argc, char** argv) {

char* hello = "Hello World\n";

write(STDOUT_FILENO,hello, 12);

return 0;

}

首先请注意,包含头文件是为了给寄存器提供符号名称(asm/regdef.h)和一个头文件,它将为系统调用(sys/syscall.h)提取符号名称,因此我们不必引用系统调用按编号。这里进行系统调用的约定与调用函数几乎相同,加载带有参数的#寄存器,然后我们将我们想要的系统调用加载到 $v0 并调用系统调用。SYS_write 对应于 linux/unix 的基本 write(2) 函数(1 是标准输出)。

ssize_t write(int fd, const void *buf, size_t count);

所以我们告诉内核使用长度字节写入文件句柄 1(stdout),字符串 hello。在 linux 上,您可以看到所有可用的不同系统调用的 syscalls(2),但它们几乎对应于内核提供的核心功能,以及 (g)libc 为 C/C++ 程序包装或构建的核心功能。

Linux(和大多数 unix-like 回到 4BSD 路线)有一个函数 syscall(2) ,它实际上是同一件事。

一旦你开始做更复杂的事情,你会发现自己将调用的系统调用包装成方便的函数,或者更好的是只调用相应的 libc 版本(令人惊讶地容易做到,但另一个讨论)。

Copyright © 2088 海豹复古游戏中心-经典怀旧服专题站 All Rights Reserved.
友情链接
Top