Linux下的汇编语言之系统调用

运维 系统运维
汇编语言是基本的语言之一,他的明显优势是速度快,可以直接对硬件进行操作。Linux下如何使用汇编语言,语法格式有哪些?需要使用哪些开发工具?本文将会为大家详细道来。

      作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 Linux 的启动部分。由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,***限度地发挥硬件的性能。

第三课时:Linux 系统调用

  即便是最简单的汇编程序,也难免要用到诸如输入、输出以及退出等操作,而要进行这些操作则需要调用操作系统所提供的服务,也就是系统调用。除非你的程序只完成加减乘除等数学运算,否则将很难避免使用系统调用,事实上除了系统调用不同之外,各种操作系统的汇编编程往往都是很类似的。

  在 Linux 平台下有两种方式来使用系统调用:利用封装后的 C 库(libc)或者通过汇编直接调用。其中通过汇编语言来直接调用系统调用,是***效地使用 Linux 内核服务的方法,因为最终生成的程序不需要与任何库进行链接,而是直接和内核通信。

  和 DOS 一样,Linux 下的系统调用也是通过中断(int 0x80)来实现的。在执行 int 80 指令时,寄存器 eax 中存放的是系统调用的功能号,而传给系统调用的参数则必须按顺序放到寄存器 ebx,ecx,edx,esi,edi 中,当系统调用完成之后,返回值可以在寄存器 eax 中获得。

  所有的系统调用功能号都可以在文件 /usr/include/bits/syscall.h 中找到,为了便于使用,它们是用 SYS_ 这样的宏来定义的,如 SYS_write、SYS_exit 等。例如,经常用到的 write 函数是如下定义的:

  ssize_t write(int fd, const void *buf, size_t count);

  该函数的功能最终是通过 SYS_write 这一系统调用来实现的。根据上面的约定,参数 fb、buf 和 count 分别存在寄存器 ebx、ecx 和 edx 中,而系统调用号 SYS_write 则放在寄存器 eax 中,当 int 0x80 指令执行完毕后,返回值可以从寄存器 eax 中获得。

  或许你已经发现,在进行系统调用时至多只有 5 个寄存器能够用来保存参数,难道所有系统调用的参数个数都不超过 5 吗?当然不是,例如 mmap 函数就有 6 个参数,这些参数***都需要传递给系统调用 SYS_mmap:

  void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);

  当一个系统调用所需的参数个数大于 5 时,执行int 0x80 指令时仍需将系统调用功能号保存在寄存器 eax 中,所不同的只是全部参数应该依次放在一块连续的内存区域里,同时在寄存器 ebx 中保存指向该内存区域的指针。系统调用完成之后,返回值仍将保存在寄存器 eax 中。

  由于只是需要一块连续的内存区域来保存系统调用的参数,因此完全可以像普通的函数调用一样使用栈(stack)来传递系统调用所需的参数。但要注意一点,Linux 采用的是 C 语言的调用模式,这就意味着所有参数必须以相反的顺序进栈,即***一个参数先入栈,而***个参数则***入栈。如果采用栈来传递系统调用所需的参数,在执行int 0x80 指令时还应该将栈指针的当前值复制到寄存器 ebx中。

【编辑推荐】

  1. 2.3 用汇编语言编写程序
  2. 术语汇编 基本CSS滤镜概述
  3. 琢石成器—Windows环境下32位汇编语言程序设计
  4. 3.1.3 as86汇编语言程序的编译和链接
  5. 3.1.2 as86汇编语言程序
  6. 3.1.1 as86汇编语言语法
  7. 3.2.6 as汇编命令

 

责任编辑:zhaolei 来源: 网络转载
相关推荐

2011-01-14 14:22:50

Linux汇编语言

2011-01-14 14:08:17

Linux汇编语言

2011-01-14 14:39:32

Linux汇编语言

2011-01-14 13:44:45

Linux汇编语言

2018-01-11 14:58:40

2021-03-25 13:05:56

网络安全寄存器汇编语言

2012-02-09 09:00:54

汇编语言

2011-01-04 17:08:10

汇编语言

2021-06-11 10:02:39

语言编程开发

2010-11-09 09:51:52

汇编语言

2022-10-31 14:02:24

汇编语言神经网络

2023-11-23 08:25:40

开发人员SmaliAndroid

2011-07-21 09:59:26

JavaScript

2017-01-12 22:36:30

2009-06-14 21:54:37

动态语言Java脚本API

2023-06-01 16:27:34

汇编语言函数

2022-04-22 15:06:59

C++PythonJava

2012-02-13 10:03:31

编程开发

2012-08-13 14:13:46

2010-06-04 17:56:22

Linux 常用工具
点赞
收藏

51CTO技术栈公众号