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

本文详细介绍了Linux系统调用的基本概念、使用方法及输入输出值的处理方式,并对比了直接使用系统调用与通过C库函数进行调用的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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库在可以在程序间利用共享库,减少内存需求

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值