gcc嵌入彙編語法

2021-08-31 22:24:31 字數 1160 閱讀 9895

以前學gcc嵌入彙編時的一些筆記,看一下對gcc的嵌入彙編比較有用處:

1· 格式:

asm ( "以回車或分號分隔的彙編指令" : 以逗號分隔的輸出運算元 : 以逗號分隔的輸入運算元 : 以逗號分隔的受影響的暫存器或記憶體 )

2·輸出運算元表示彙編指令執行結果,輸入運算元表示彙編指令執行時的輸入值;

3·每個輸出和輸入運算元都是分為兩部分:「限定符」 (c表示式),其中輸出運算元的限定符必須包含等號(=)

4·如果限定符表示乙個暫存器,則對於輸入運算元,在生成第一部分的彙編指令之前,會先生成將c表示式的值生成到指定的暫存器的彙編指令;對於輸出運算元,在生成第一部分的彙編指令後,會生成將指定暫存器中的值移到c表示式的指令,所以輸出運算元中的c表示式必須都是左值(lvalue)。

5·所有運算元從頭到尾順序排列,在彙編指令中以「%編號」引用,其中編號從0開始,依次遞增。

6·引用時引用的是限定符所指定的東西,比如限定符指定的是暫存器,則引用的是暫存器;指定的是變數,則引用的是變數的記憶體位址。

7·asm也可以是__asm__。

8·彙編指令中的暫存器前需要新增%%字首,如%%edi。如果沒有輸入輸出部分,可以只有乙個%字首,如%eax

9·有如下常用限定符:r:通用暫存器,m:記憶體位址,a:eax,b:ebx,c:ecx,d:edx,s:esi,d:edi,q:a/b/c/d,i:立即數,o:可以加乙個偏移的記憶體位址,g:前面所有這些,0~n:指定使用和第n個運算元相同的限定符

舉例:asm("mov %2, %%eax\n\t"

"mov %%eax, %%ecx\n\t"

"inc %%eax\n\t"

"mov %%eax, %1",

: "=c" (old_value), "=m" (inced_value)

: "d" (input_value)

);如果input_value位於0x8(%ebp)(第乙個引數), inced_value位於-8(%ebp)(第二個區域性變數),old_value位於-4(%ebp)(第乙個區域性變數),則生成的**大概如下:

mov 8(%ebp), %edi

mov %edi, %eax

mov %eax, %ecx

inc %eax

mov %eax, -8(%ebp)

mov %ecx, -4(%ebp)

GCC嵌入彙編

其中有一段精華如下 嵌入式彙編的一般形式 asm volatile output input modify 其中,asm 表示彙編 的開始,其後可以跟 volatile 這是可選項 其 含義是避免 asm 指令被刪除 移動或組合 然後就是小括弧,括弧中的內容是我們介 紹的重點 為彙編指令部分,例如,...

gcc嵌入彙編

有時候需要在c語言裡使用組合語言,或者是提高效能,或者是因為某些功能不能由系統呼叫實現。而在核心裡,c語言裡嵌入彙編是非常普遍的。如何在c語言裡嵌入組合語言呢?int main 使用 asm 巨集就可以嵌入彙編,volatile 指示不讓gcc優化下面的彙編 file gccasm.c text g...

GCC內嵌彙編語法

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