20135202闫佳歆--week4 两种方式使用同一个系统调用--实验及总结

时间:2022-10-29 18:23:19

实验四 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

在这里我选择的是第20号系统调用,getpid。

1.使用库函数API:

代码如下:

/* getpid.c */
#include <unistd.h>
#include <stdio.h> int main()
{
pid_t pid;
pid = getpid();
printf("pid = %d \n",pid);
return 0;
}

返回的是目前进程的进程识别码。运行结果如下:

20135202闫佳歆--week4 两种方式使用同一个系统调用--实验及总结

2.嵌入汇编:

代码如下:

/* getpid_asm.c */
#include <unistd.h>
#include <stdio.h> int main()
{
pid_t pid;
pid = getpid();
asm volatile(
"mov $0x14,%%eax\n\t" /* 将系统调用号20放入eax中。 */
"int $0x80\n\t" /* 中断向量号0x80,即128。int 128 执行系统调用。 */
"mov %%eax,%0\n\t" /* 返回值保存在eax中,将它赋值给pid */
: "=m" (pid)
);
printf("pid = %d \n",pid);
return 0;
}

汇编原理:

getpid系统调用是第20号,所以首先要将这个系统调用号放入eax寄存器中,然后使用int 128指令执行系统调用,这时就会执行eax中的第20号系统调用。返回值是保存在eax寄存器中,所以把它赋值给0号也就是pid。

运行结果:

20135202闫佳歆--week4 两种方式使用同一个系统调用--实验及总结

3.系统调用的工作机制学习总结

请走链接→week4学习笔记