您的位置:首页 > 编程语言

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

2016-03-20 18:47 746 查看
/* getpid.c */
#include <unistd.h>
#include <stdio.h>

int main()
{
pid_t pid;
pid = getpid();
printf("pid = %d \n",pid);
return 0;
}


上面是使用函数库API

运行结果:



下面是嵌入汇编代码:

/* 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;
}


运行结果:



总结:

1.应用程序、封装例程、系统调用处理程序及系统调用服务例程之间的关系。如图:



系统调用的参数传递:

函数调用——压栈

用户态到内核态——寄存器传递。
每个参数长度不能超过32位,个数不能超过6个。
超过的话?
使某个寄存器中存储指针,指向内存,内存中存储参数。

20135108 李泽源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: