实验四:使用库函数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
运行结果:
![](http://images2015.cnblogs.com/blog/745838/201603/745838-20160320183757318-50349474.png)
下面是嵌入汇编代码:
/* 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; }
运行结果:
![](http://images2015.cnblogs.com/blog/745838/201603/745838-20160320184006521-949607845.png)
总结:
1.应用程序、封装例程、系统调用处理程序及系统调用服务例程之间的关系。如图:
![](http://images2015.cnblogs.com/blog/745838/201603/745838-20160320184253334-950567979.png)
系统调用的参数传递:
函数调用——压栈
用户态到内核态——寄存器传递。
每个参数长度不能超过32位,个数不能超过6个。
超过的话?
使某个寄存器中存储指针,指向内存,内存中存储参数。
20135108 李泽源
相关文章推荐
- Qt5.3.1 ubuntu14.0464bit QSqlDatabase: QMYSQL driver not loaded的解决方案 real solution
- 内存空间分几部分:代码段、数据段,栈,堆 (收集整理)
- javaweb 路径问题
- delphi实现js的获取时间,兼容各系统。
- 初探HashMap的工作原理
- PHP中的12个魔术方法
- Some essential tips for algorithm design(一些重要的算法设计技术)
- 链表反转 C++
- C# 重载运算符
- Spring源码之创建AOP代理(补)
- Maven+Spring 4+Spring MVC(二)
- C++ 标准库——<ctime>
- 【C++】智能指针的作用,模拟实现auto_ptr,scoped_ptr,shared_ptr,scoped_array,shared_array
- RDD动态转换成DataFrame
- PHP共享内存实现的消息队列
- 2016年第七届蓝桥杯省赛(C/C++ A组)
- C++上机实验1-1
- C++向量容器vector的使用
- 20145101《Java程序设计》第三周学习总结
- Java - Collection