偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Linux下的匯編語言之系統(tǒng)調用

運維 系統(tǒng)運維
匯編語言是基本的語言之一,他的明顯優(yōu)勢是速度快,可以直接對硬件進行操作。Linux下如何使用匯編語言,語法格式有哪些?需要使用哪些開發(fā)工具?本文將會為大家詳細道來。

      作為最基本的編程語言之一,匯編語言雖然應用的范圍不算很廣,但重要性卻勿庸置疑,因為它能夠完成許多其它語言所無法完成的功能。就拿 Linux 內核來講,雖然絕大部分代碼是用 C 語言編寫的,但仍然不可避免地在某些關鍵地方使用了匯編代碼,其中主要是在 Linux 的啟動部分。由于這部分代碼與硬件的關系非常密切,即使是 C 語言也會有些力不從心,而匯編語言則能夠很好揚長避短,***限度地發(fā)揮硬件的性能。

第三課時:Linux 系統(tǒng)調用

  即便是最簡單的匯編程序,也難免要用到諸如輸入、輸出以及退出等操作,而要進行這些操作則需要調用操作系統(tǒng)所提供的服務,也就是系統(tǒng)調用。除非你的程序只完成加減乘除等數學運算,否則將很難避免使用系統(tǒng)調用,事實上除了系統(tǒng)調用不同之外,各種操作系統(tǒng)的匯編編程往往都是很類似的。

  在 Linux 平臺下有兩種方式來使用系統(tǒng)調用:利用封裝后的 C 庫(libc)或者通過匯編直接調用。其中通過匯編語言來直接調用系統(tǒng)調用,是***效地使用 Linux 內核服務的方法,因為最終生成的程序不需要與任何庫進行鏈接,而是直接和內核通信。

  和 DOS 一樣,Linux 下的系統(tǒng)調用也是通過中斷(int 0x80)來實現(xiàn)的。在執(zhí)行 int 80 指令時,寄存器 eax 中存放的是系統(tǒng)調用的功能號,而傳給系統(tǒng)調用的參數則必須按順序放到寄存器 ebx,ecx,edx,esi,edi 中,當系統(tǒng)調用完成之后,返回值可以在寄存器 eax 中獲得。

  所有的系統(tǒng)調用功能號都可以在文件 /usr/include/bits/syscall.h 中找到,為了便于使用,它們是用 SYS_ 這樣的宏來定義的,如 SYS_write、SYS_exit 等。例如,經常用到的 write 函數是如下定義的:

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

  該函數的功能最終是通過 SYS_write 這一系統(tǒng)調用來實現(xiàn)的。根據上面的約定,參數 fb、buf 和 count 分別存在寄存器 ebx、ecx 和 edx 中,而系統(tǒng)調用號 SYS_write 則放在寄存器 eax 中,當 int 0x80 指令執(zhí)行完畢后,返回值可以從寄存器 eax 中獲得。

  或許你已經發(fā)現(xiàn),在進行系統(tǒng)調用時至多只有 5 個寄存器能夠用來保存參數,難道所有系統(tǒng)調用的參數個數都不超過 5 嗎?當然不是,例如 mmap 函數就有 6 個參數,這些參數***都需要傳遞給系統(tǒng)調用 SYS_mmap:

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

  當一個系統(tǒng)調用所需的參數個數大于 5 時,執(zhí)行int 0x80 指令時仍需將系統(tǒng)調用功能號保存在寄存器 eax 中,所不同的只是全部參數應該依次放在一塊連續(xù)的內存區(qū)域里,同時在寄存器 ebx 中保存指向該內存區(qū)域的指針。系統(tǒng)調用完成之后,返回值仍將保存在寄存器 eax 中。

  由于只是需要一塊連續(xù)的內存區(qū)域來保存系統(tǒng)調用的參數,因此完全可以像普通的函數調用一樣使用棧(stack)來傳遞系統(tǒng)調用所需的參數。但要注意一點,Linux 采用的是 C 語言的調用模式,這就意味著所有參數必須以相反的順序進棧,即***一個參數先入棧,而***個參數則***入棧。如果采用棧來傳遞系統(tǒng)調用所需的參數,在執(zhí)行int 0x80 指令時還應該將棧指針的當前值復制到寄存器 ebx中。

【編輯推薦】

  1. 2.3 用匯編語言編寫程序
  2. 術語匯編 基本CSS濾鏡概述
  3. 琢石成器—Windows環(huán)境下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

語言編程開發(fā)

2010-11-09 09:51:52

匯編語言

2022-10-31 14:02:24

匯編語言神經網絡

2023-11-23 08:25:40

開發(fā)人員SmaliAndroid

2011-07-21 09:59:26

JavaScript

2017-01-12 22:36:30

2009-06-14 21:54:37

動態(tài)語言Java腳本API

2023-06-01 16:27:34

匯編語言函數

2022-04-22 15:06:59

C++PythonJava

2012-02-13 10:03:31

編程開發(fā)

2012-08-13 14:13:46

2010-06-04 17:56:22

Linux 常用工具
點贊
收藏

51CTO技術棧公眾號