当前位置: 首页 >> 程序设计 >> 汇编语言学习笔记 使用Linux系统调用
 

汇编语言学习笔记 使用Linux系统调用

作者:      来源:http://blog.csdn.net/hjzhao     发表时间:2007-05-22     浏览次数:      字号:    

一、linux系统调用

系统调用定义在:/usr/include/asm/unistd.h

通常可以在man页的第二部分查看说明。

e.g.
$man 
2 exit

 二、使用系统调用

1、系统调用的格式

启动系统调用需要使用INT指令,Linux系统调用位于中断0x80。执行INT指令时,所有操作转移到内核中的系统调用处理程序,系统调用完成时,执行转移回INT指令后的下一条指令。

2、系统调用值

EAX寄存器用于保存系统调用值

e.g.
movl    $
1,%eax
int        0x80

3、系统调用输入值

系统调用期望的输入值顺序:

  • EBX          第一个参数
  • ECX         第二个参数
  • EDX         第三个参数
  • ESI           第四个参数
  • EDI          第五个参数

当输入参数超过6个时,EBX用于保存指向输入参数内存 位置的指针,输入参数按照堆栈顺序存放

4、系统调用返回值

系统调用返回值存放在EAX寄存器中,程序员负责检查EAX寄存器的值。

5、使用复杂数据类型

有时系统调用返回涉及C样式结构的复杂数据。在汇编语言程序中使用它们时,有时候难以决定如何处理返回的C结构,以及如何把它转换为汇编语言能够处理的数据类型。

必须在内存位置创建这个结构,以便值可以被函数返回。

.section .data
result:
uptime:
        .
int 0
load1:
        .
int 0
load5:
        .
int 0
.................
.................
movl $result,
%ebx
movl $
116,%eax
int     $0x80
.................
.................

系统调用system的系统调用值116被存放在EAX寄存器中,标签result的内存位置存储在EBX寄存器中作为输入值。执行INT指令之后,返回值被加载到这个内存位置中,各个内存标签可以用于引用每个单独的值

三、跟踪系统调用

使用strace程序

$strace ./systemcalltest
$strace 
-c ./systemcalltest

四、系统调用和C库

1、使用C库函数

C库函数包含在libc库中,使用c库函数时必须把libc连接到汇编程序中

$as -o cfunctest.o cfunctest.s
$ld 
-dynamic-linker /lib-/ld-linux.so.2 -lc -o  cfunctest cfunctest.o

2、系统调用和c库的比较

使用原始Linux系统调用的主要原因

  • 可以创建尽可能短的代码
  • 可以创建尽可能快的代码
  • 连接后的可执行文件独立于任何外部库

使用c库的主要原因

  • c库包含很多函数,模拟它们需要大量汇编代码
  • c库在操作系统间是可以移植的
  • c库在可以在程序间利用共享库,减少内存需求

责任编辑 webmaster

 
 
 
 
 
评论更多>>
 
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •