亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

ARM體系下的GCC內(nèi)聯(lián)匯編教程詳解

 更新時間:2020年02月10日 11:08:38   作者:摩斯電碼  
在操作系統(tǒng)級的編程中,有時候,C語言并不能完全的使用硬件的功能,這時候就需要嵌入一些匯編代碼來實現(xiàn)功能。這篇文章主要介紹了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)文章

  • 最好懂的匯編語言教程,解釋CPU如何執(zhí)行代碼

    最好懂的匯編語言教程,解釋CPU如何執(zhí)行代碼

    這篇文章主要介紹了最好懂的匯編語言教程,解釋CPU如何執(zhí)行代碼。計算機(jī)真正能夠理解的是低級語言,它專門用來控制硬件。匯編語言就是低級語言,直接描述/控制?CPU?的運(yùn)行。如果你想了解?CPU?到底干了些什么,以及代碼的運(yùn)行步驟,就一定要學(xué)習(xí)匯編語言。
    2022-12-12
  • 匯編程序 查表求平方的實現(xiàn)

    匯編程序 查表求平方的實現(xiàn)

    這篇文章主要介紹了匯編程序 查表求平方的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 使用匯編語言實現(xiàn)if else 循環(huán)函數(shù)調(diào)用的具體方法

    使用匯編語言實現(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-01
  • UEFI開發(fā)實戰(zhàn)用戶交互界面使用說明UNI文件

    UEFI開發(fā)實戰(zhàn)用戶交互界面使用說明UNI文件

    這篇文章主要為大家介紹了UEFI開發(fā)實戰(zhàn)用戶交互界面使用說明UNI文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 匯編語言軟件延時1s的實現(xiàn)方法

    匯編語言軟件延時1s的實現(xiàn)方法

    這篇文章主要介紹了匯編語言軟件延時1s的實現(xiàn)方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • Debug的基本使用()

    Debug的基本使用()

    Debug是一個通過操作系統(tǒng)(os)對cpu寄存器進(jìn)行訪問用于學(xué)習(xí)匯編的程序,但是如今的win10(64位)已經(jīng)不支持cmd打開debug,但是我們可以通過DOSBOX模擬器對其進(jìn)行訪問
    2023-08-08
  • VScode配置匯編語言環(huán)境的實現(xiàn)步驟

    VScode配置匯編語言環(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)

    這篇文章主要介紹了用匯編語言實現(xiàn)從1加到100的方法(1+2+...+100),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 匯編語言 跳轉(zhuǎn)指令與C語言的條件分支

    匯編語言 跳轉(zhuǎn)指令與C語言的條件分支

    這篇文章主要介紹了匯編語言 跳轉(zhuǎn)指令與C語言的條件分支,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 淺析ARMv8匯編指令adrp和adr

    淺析ARMv8匯編指令adrp和adr

    這篇文章給大家介紹ARMv8匯編指令adrp和adr的相關(guān)知識,暫時不介紹alpha生成的指令,因此先來主要分析一下,arm架構(gòu)之所以少生成匯編指令的原因——adrp指令,感興趣的朋友跟隨小編一起看看吧
    2021-12-12

最新評論