GCC嵌入彙編

2021-05-21 23:39:42 字數 1333 閱讀 3075

其中有一段精華如下:

嵌入式彙編的一般形式:

__asm__ __volatile__ ("" : output : input : modify);

其中,__asm__表示彙編**的開始,其後可以跟__volatile__(這是可選項),其

含義是避免「asm」指令被刪除、移動或組合;然後就是小括弧,括弧中的內容是我們介

紹的重點:

· ""為彙編指令部分,例如,"movl %%cr0,%0/n/t"。數字前加字首「%「,

如%1,%2等表示使用暫存器的樣板運算元。可以使用的運算元總數取決於具體cpu

中通用暫存器的數量,如intel可以有8個。指令中有幾個運算元,就說明有幾個變

量需要與暫存器結合,由gcc在編譯時根據後面輸出部分和輸入部分的約束條件進

行相應的處理。由於這些樣板運算元的字首使用了」%「,因此,在用到具體的寄存

器時就在前面加兩個「%」,如%%cr0。

· 輸出部分(output),用以規定對輸出變數(目標運算元)如何與暫存器結合的約

束(constraint),輸出部分可以有多個約束,互相以逗號分開。每個約束以「=」開

頭,接著用乙個字母來表示運算元的型別,然後是關於變數結合的約束。例如,上例

中::"=r" (__dummy)__dummy 存放在這個暫存器中,但如果是:

:「=m」(__dummy)

「=m」就表示相應的目標運算元是存放在記憶體單元__dummy中。

表示約束條件的字母很多,表 2-5 給出幾個主要的約束字母及其含義:

主要的約束字母及其含義

字母含義

m, v,o 表示記憶體單元

r 表示任何通用暫存器

q 表示暫存器eax, ebx, ecx,edx之一

i, h 表示直接運算元

e, f 表示浮點數

g 表示「任意」

a, b.c d 表示要求使用暫存器eax/ax/al, ebx/bx/bl, ecx/cx/cl或edx/dx/dl

s, d 表示要求使用暫存器esi或edi

i 表示常數(0~31)

· 輸入部分(input):輸入部分與輸出部分相似,但沒有「=」。如果輸入部分乙個

運算元所要求使用的暫存器,與前面輸出部分某個約束所要求的是同乙個暫存器,

那就把對應運算元的編號(如「1」,「2」等)放在約束條件中,在後面的例子中

我們會看到這種情況。

· 修改部分(modify):這部分常常以「memory」為約束條件,以表示操作完成後記憶體

中的內容已有改變,如果原來某個暫存器的內容來自記憶體,那麼現在記憶體中這個單

元的內容已經改變。

下面給個例項

gcc嵌入彙編

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

gcc嵌入彙編語法

以前學gcc嵌入彙編時的一些筆記,看一下對gcc的嵌入彙編比較有用處 1 格式 asm 以回車或分號分隔的彙編指令 以逗號分隔的輸出運算元 以逗號分隔的輸入運算元 以逗號分隔的受影響的暫存器或記憶體 2 輸出運算元表示彙編指令執行結果,輸入運算元表示彙編指令執行時的輸入值 3 每個輸出和輸入運算元都...

GCC內聯彙編

有時為了高效,有時為了直接控制硬體,有些模組我們不得不直接用組合語言來編寫,並且對外提供呼叫的介面,隱藏細節,這其實就是內聯彙編。如何使用內聯彙編?我們就以 gcc 為例,一窺其中奧秘!一 關鍵字 如何讓 gcc 知道 中內嵌的彙編呢?借助 關鍵字!來看下面的例子 asm volatile hlt ...