ARM體系下的GCC內(nèi)聯(lián)匯編教程詳解
在操作系統(tǒng)級的編程中,有時候,C語言并不能完全的使用硬件的功能,這時候就需要嵌入一些匯編代碼來實現(xiàn)功能。 有兩種方式可以使C語言和assemly語言一起工作,一種是兩種語言分開寫成兩個文件,鏈接的時候鏈接成一個文件;另一種就是在C語言中嵌入?yún)R編代碼。下面簡單介紹一下如何在GCC中嵌入?yún)R編代碼。
GCC規(guī)定了一個內(nèi)聯(lián)匯編的語法,不同硬件平臺上的GCC內(nèi)聯(lián)匯編幾乎都是這樣的:
asm( 匯編指令列表 :輸出運(yùn)算符列表 :輸入運(yùn)算符列表 :被更改的資源列表 };
在GCC中插入?yún)R編代碼,需要以asm關(guān)鍵字開頭,中間四個部分用”:”分隔,如果你嵌入的匯編沒有輸入輸出,或者更改資源,后面三項是可以省略的。
下面以一個實例來說明這個語法:
void test(void) { int tmp; // some code __asm__( " mov r1,%0\n\t" : : "r" (tmp) : "r1" ); }
以上代碼的意思就是,將tmp變量的值賦給r1寄存器,%0代表出現(xiàn)在輸入運(yùn)算符列表和輸出運(yùn)算符列表中的第一個值,%1,%2依次類推。由于我們自己的匯編代碼改變了r1的值,所以我們要通知GCC編譯器,r1的值被我們改變了, 在 “r” (tmp) 表達(dá)式中,tmp代表C語言輸入到匯編中的變量,”r”代表tmp會通過一個寄存器傳遞??梢允褂玫姆栍幸韵聨追N:
表1 GCC4內(nèi)聯(lián)匯編操作符節(jié)選
操作符 | 含義 |
r | 通用寄存器R0~R15 |
m | 一個有效內(nèi)存地址 |
l | 數(shù)據(jù)處理指令中的立即數(shù) |
X | 被修飾的操作符只能作為輸出 |
上面一個代碼是將C語言的值傳遞到匯編代碼中,也可以將匯編代碼輸出的結(jié)果傳給C代碼:
void test(void) { int tmp; __asm__( "mov %0, #1\n\t" : "=r" (tmp) : ); }
這段代碼的意思是,將立即數(shù)1賦給變量tmp。 與上面不同的是,輸入運(yùn)算符列表移到了輸出運(yùn)算符列表,”r”前面也多了一個等于號。這個等號被稱為約束修飾符,以下是幾種修飾符的含義列表:
表2 GCC4中內(nèi)聯(lián)匯編修飾符
修飾符 | 說明 |
無 | 被修飾的操作符是只讀的 |
= | 被修飾的操作符只寫 |
+ | 被修飾的操作符具有可讀寫的屬性 |
& | 被修飾的操作符只能作為輸出 |
總結(jié)
以上所述是小編給大家介紹的ARM體系下的GCC內(nèi)聯(lián)匯編教程詳解,希望對大家有所幫助!
相關(guān)文章
使用匯編語言實現(xiàn)if else 循環(huán)函數(shù)調(diào)用的具體方法
這篇文章主要介紹了使用匯編語言實現(xiàn)if else 循環(huán)函數(shù)調(diào)用的具體方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01UEFI開發(fā)實戰(zhàn)用戶交互界面使用說明UNI文件
這篇文章主要為大家介紹了UEFI開發(fā)實戰(zhàn)用戶交互界面使用說明UNI文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06VScode配置匯編語言環(huán)境的實現(xiàn)步驟
本文主要介紹了VScode配置匯編語言環(huán)境的實現(xiàn)步驟,文中通過圖文的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03用匯編語言實現(xiàn)從1加到100的方法(1+2+...+100)
這篇文章主要介紹了用匯編語言實現(xiàn)從1加到100的方法(1+2+...+100),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01