以前學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...