实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(李鹏举)

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

攥写人:李鹏举  学号:20132201

( *原创作品转载请注明出处*)

( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 )

实验要求:

  1. 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl

  2. 参考视频中的方式使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用,推荐在实验楼Linux虚拟机环境下完成实验。

实验过程:

首先,选择使用的系统调用:我选择的是64号 getppid

网上找到关于该函数的使用与说明:getppid(取得父进程的进程识别码)

表头文件 #include<unistd.h>

定义函数 pid_t getppid(void);

函数说明 getppid()用来取得目前进程的 父进程识别码。

返回值 目前进程的父进程识别码。

#include<unistd.h>

main()

{

printf(“My parent ‘pid =%d\n”,getppid());

}

执行

My parent ‘pid =463

然后,进入实验楼,建立文件,利用上述例子编写c语言代码

保存,并用gcc编译  用./运行该文件,可以看到运行的结果:

运行成功,之后再修改文件,改为嵌入式汇编语句:

 实验总结:

首先附上完整的代码:

c语言代码:

#include<unistd.h>

main()

{

printf(“My parent ‘pid =%d\n”,getppid());

}

嵌入式汇编代码:

#include <unistd.h>
int main()
{
    int a=0;
     asm volatile(
          "mov $0,%%ebx\n\t"
          "mov $0x40,%%eax\n\t"
          "int $0x80\n\t"
          "mov %%eax,%0\n\t"
          :"=m"(a)
          );
     // a = getppid();
     printf("the number of pid is:%d",t);
}

通过这段汇编代码可以看出程序执行的过程,其中系统调用通过软中断向内核发出明确请求。起码我看出了int $0x80 为AT&T语法的中断指令,通过中断的调用,将把调用号装入eax寄存器实现,然后实现相应的值的个改变的过程。将数值由EAX给到a中。

不过我很怀疑自己是不是哪里做得有问题,汇编的结果和C语言出来的结果有所不同,不过操作系统有不确定性,并且两次打印输出的方式有所不同,因此可能影响了结果的输出,当然也有可能是我汇编语句写的哪里不对,我会向老师、同学查证之后再做修改、完善。

 

posted @ 2016-03-20 20:52  普普通通  阅读(444)  评论(0编辑  收藏  举报