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

Linux下的匯編語(yǔ)言之系統(tǒng)調(diào)用

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

      作為最基本的編程語(yǔ)言之一,匯編語(yǔ)言雖然應(yīng)用的范圍不算很廣,但重要性卻勿庸置疑,因?yàn)樗軌蛲瓿稍S多其它語(yǔ)言所無(wú)法完成的功能。就拿 Linux 內(nèi)核來(lái)講,雖然絕大部分代碼是用 C 語(yǔ)言編寫(xiě)的,但仍然不可避免地在某些關(guān)鍵地方使用了匯編代碼,其中主要是在 Linux 的啟動(dòng)部分。由于這部分代碼與硬件的關(guān)系非常密切,即使是 C 語(yǔ)言也會(huì)有些力不從心,而匯編語(yǔ)言則能夠很好揚(yáng)長(zhǎng)避短,***限度地發(fā)揮硬件的性能。

第三課時(shí):Linux 系統(tǒng)調(diào)用

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

  在 Linux 平臺(tái)下有兩種方式來(lái)使用系統(tǒng)調(diào)用:利用封裝后的 C 庫(kù)(libc)或者通過(guò)匯編直接調(diào)用。其中通過(guò)匯編語(yǔ)言來(lái)直接調(diào)用系統(tǒng)調(diào)用,是***效地使用 Linux 內(nèi)核服務(wù)的方法,因?yàn)樽罱K生成的程序不需要與任何庫(kù)進(jìn)行鏈接,而是直接和內(nèi)核通信。

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

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

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

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

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

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

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

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

【編輯推薦】

  1. 2.3 用匯編語(yǔ)言編寫(xiě)程序
  2. 術(shù)語(yǔ)匯編 基本CSS濾鏡概述
  3. 琢石成器—Windows環(huán)境下32位匯編語(yǔ)言程序設(shè)計(jì)
  4. 3.1.3 as86匯編語(yǔ)言程序的編譯和鏈接
  5. 3.1.2 as86匯編語(yǔ)言程序
  6. 3.1.1 as86匯編語(yǔ)言語(yǔ)法
  7. 3.2.6 as匯編命令

 

責(zé)任編輯:zhaolei 來(lái)源: 網(wǎng)絡(luò)轉(zhuǎn)載
相關(guān)推薦

2011-01-14 14:22:50

Linux匯編語(yǔ)言

2011-01-14 14:08:17

Linux匯編語(yǔ)言

2011-01-14 14:39:32

Linux匯編語(yǔ)言

2011-01-14 13:44:45

Linux匯編語(yǔ)言

2018-01-11 14:58:40

2021-03-25 13:05:56

網(wǎng)絡(luò)安全寄存器匯編語(yǔ)言

2012-02-09 09:00:54

匯編語(yǔ)言

2021-06-11 10:02:39

語(yǔ)言編程開(kāi)發(fā)

2011-01-04 17:08:10

匯編語(yǔ)言

2010-11-09 09:51:52

匯編語(yǔ)言

2022-10-31 14:02:24

匯編語(yǔ)言神經(jīng)網(wǎng)絡(luò)

2023-11-23 08:25:40

開(kāi)發(fā)人員SmaliAndroid

2011-07-21 09:59:26

JavaScript

2017-01-12 22:36:30

2023-06-01 16:27:34

匯編語(yǔ)言函數(shù)

2009-06-14 21:54:37

動(dòng)態(tài)語(yǔ)言Java腳本API

2022-04-22 15:06:59

C++PythonJava

2012-02-13 10:03:31

編程開(kāi)發(fā)

2012-08-13 14:13:46

2010-06-13 15:35:01

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)