GCC內嵌彙編學習筆記

2021-10-13 23:28:01 字數 1288 閱讀 2580

本文主要對gcc內嵌彙編一文的簡要總結,試著用自己的話把gcc彙編的關鍵點描述出來,以驗證自己是否真正理解。本文將以《linux核心完全注釋 v3》中的乙個例子進行描述,這個例子我看的時候是非常的懵逼,直到看了gcc內嵌彙編一文。

gcc內嵌彙編的基本結構

__asm (

"彙編語句列表"

:輸出暫存器

:輸入暫存器

:會被修改的暫存器);

彙編語句列表

就是普通的一組彙編語句;

輸出暫存器

表示暫存器的資料賦值給乙個表示式作為輸出。

注:

(1) 出現在輸入暫存器或輸出暫存器括號中的內容稱為表示式, 如上例中__res,seg和*(addr)

(2) 在輸入暫存器或輸出暫存器中如果有多個表示式將用逗號隔開

(3)從輸出暫存器到輸入暫存器所出現的表示式將依次編號,如上例中__res被編號為0, seg被編號為1, *(addr)被編號為2,依次類推。

上例中輸出暫存器為:

「=a」 (__res) ,此處a代表將eax暫存器載入到表示式,也就是__res中,=表示輸出

輸入暫存器

表示表示式的值賦值給暫存器作為輸入。

上例中:

「0」 (seg), 「m」 (*(addr)), 此處的0表示與表示式0使用同樣的暫存器,而表示式0為__res它使用eax暫存器,所以seg也將使用eax暫存器,即seg會賦值給eax

會被修改的暫存器

是告訴編譯器這裡面出現的暫存器會被修改,請不要占用。

所以如上語句進行翻譯如下:

register

char __res;

//定義暫存器變數__res

push %fs //將fs暫存器入棧

mov %ax,

%fs //將eax的內容賦值給fs, 而通過輸入暫存器可知eax內容為seg,因此也就是將seg

//的內容賦值給%fs

movb %fs:%2

,%al // %2為表示式2即*(addr), 因此是將seg:*(addr)的1位元組內容放到al暫存器

pop %fs //恢復fs的值

綜上就是將從seg段偏移addr的地方取乙個位元組

gcc內嵌彙編

GCC內嵌彙編

gcc內嵌彙編 限制字元 限制字元有很多種,有些是與特定體系結構相關,此處僅列出常用的限定字元和i386中可能用到的一些常用的限定符。它們的作用是指示編譯器如何處理其後的c語言變數與指令運算元之間的關係,例如是將變數放在暫存器中還是放在記憶體中等,下表列出了常用的限定字母。b 將輸入變數放入ebx ...

GCC內嵌彙編語法

內嵌彙編語法如下 asm 彙編語句模板 輸出部分 輸入部分 破壞描述部分 共四個部分 彙編語句模板,輸出部分,輸入部分,破壞描述部分,各部分使用 格開,彙編語句模板必不可少,其他三部分可選,如果使用了後面的部分,而前面部分為空,也需要用 格開,相應部分內容為空。例如 asm volatile cli...

有關GCC內嵌彙編的總結

在gcc中共包括兩種方法嵌入彙編,分別是 基本內聯彙編語句 basic inline asm statement 和擴充套件內聯彙編語句 extended inline asm statement 基本內聯彙編不包括運算元 operand 而擴充套件內聯彙編語句乙個或多個運算元 operands 先...