C與彙編混合程式設計的實現示例

2022-09-24 22:27:11 字數 2792 閱讀 9854

目錄

上一期中,使用鍊錶的方式進行對不同任務的呼叫,實現的效果還是不錯的,但是,任務在進行過程中不能進行來回的切換,必須要執行完,這是乙個弊端,若不使用實時作業系統的情況下,如何切換呢,那就要說一下萬能的彙編了,用彙編則可以做到任務的切換

首先我們知道,c與彙編的聯合使用就三種情況,如下

首先看一下**

__inline int add(int input1,int intput2)

return output;

}int number(void);

int value;

int main(void)

}執行效果

0x19的十進位制為25

呼叫彙編函式,首先建立乙個.s彙編檔案

建立完成後,在彙編檔案中寫入乙個彙編函式

area |.text|,code,readonly

export get_number

get_number

mov r0,#761

bx lr

align

end然後寫乙個main函式www.cppcns.com呼叫它

int get_number(void);

int value;

int main(void)

}檢視執行效果

在彙編檔案中,輸入如下**

area |.text|,code,readonly

import get_number

import number

export __main

entry

__main

ldr r1,=number

mov r0,#100

str r0,[r1]

bl get_number

end在c檔案中輸入如下**

int number;

int get_number(void)

看一下執行效果吧

繼續向下執行

數字由100變成132;實現功能

解釋說明:

/*area

語法格式:

area 段名 屬性1 ,屬性2 ,……

area偽指令用於定義乙個**段或資料段。其中,段名若以數字開頭,則該段名需用「|」括起來,如:|1_test| 。

屬性字段表示該**段(或資料段)的相關屬性,多個屬性用逗號分隔。常用的屬性如下:

— code 屬性:用於定義**段,預設為readonly 。

— data 屬性:用於定義資料段,預設為readwrite 。

— readonly 屬性:指定本段為唯讀,**段預設為readonly 。

— readwrite 屬性:指定本段為可讀可寫,資料段的預設屬性為readwrite 。

— align 屬性:使用方式為align表示式。在預設時,elf(可執行連線檔案)的**段和資料段是按字程式設計客棧對齊的,表示式的取值範圍為0~31,相應的對齊方式為2表示式次方。

— common 屬性:該屬性定義乙個通用的段,不包含任何的使用者**和資料。各原始檔中同名的common段共享同一段儲存單元。 */

/*mov

傳送指令 將右邊資料移入左邊暫存器

ldr

將右值位址存的資料移入左邊暫存器

bx 通用暫存器 裡面存入基位址、偏移量、臨時資料

bl 跳轉指令

lr r14

(1)當使用bl或者blx跳轉到子過程的時候,r14儲存了返回位址,可以在呼叫過程結尾恢復

(2)異常中斷發生時,這個異常模式特定的物理r14被設定成該異常模式將要返回的位址

entry 是程式入口偽指令。在乙個完整的匯程式設計序中至少有乙個 entry,編譯程式在編譯連線時依據程式入口進行連線。

在只有乙個入口時,編譯程式會把這個入口的位址定義為系統復位後的程式起始點。但在乙個原始檔裡最多只能有乙個 entry。

endp 表示proc所定義的過程結束. (end procedure)

ends 表示segment定義的段結束. (end segment)

end 程式結束.

*/使用bl跳轉

bl指令同時還將pc暫存器的值儲存到lr暫存器中,是帶返回的跳轉指令

所以假設在乙個匯程式設計序中,要呼叫兩個c語言函式

用事實證明可以返回

將彙編**修改為如下

area |.text|,code,readonly

import get_number

import number

import get_value

import value

export __main

entry

__main

ldr r1,=number

mov r0,#100

str r0,[r1]

bl get_number

ldr r1,=value

mov r0,#100

str r0,[r1]

bl get_value

end對應的c檔案為

int number;

int get_number(void)

int value;

int get_value(void)

檢視**執**況

首先進行第乙個函式的執行,數字發生改變

接下來是第二個函式執行,數字發生改變

證明bl跳轉可以返回。

可以使用彙編加c語言的程式設計思路,打破一些限制

也為後面進行pc的跳轉打下基礎

c與彙編的混合程式設計

場景1 c內嵌彙編 vim main.c include int main int argc,char ar 形式2 asm volatile mrc p14,0,0,c0,c1,0 r status c a b return 0 注 內嵌彙編的限制 1.匯程式設計序跳轉只能用b或bl指令,不能直接...

C語言與彙編混合程式設計

c語言是乙個系統級的語言,是乙個可以直接深入到硬體最底層操作的語言。在前邊的部分部落格中,我們提到過,對硬體的操作實際上是對硬體控制器中的暫存器或儲存單元進行操作,而在arm架構中,這些暫存器或儲存單元一般是以記憶體對映的方式進行訪問的。在c語言中,指標剛好提供了訪問任意的記憶體位址的方式,因此從語...

ARM彙編與C混合程式設計

內聯彙編即在c中直接使用彙編語句進行程式設計,使程式可以在c程式中實現c語言不能完成的一些工作,例如,在下面幾種情況中必須使用內聯彙編或嵌入型彙編 程式中使用飽和算術運算 saturating arithmetic 程式需要對協處理器進行操作 在c程式中完成對程式狀態暫存器的操作 asm volat...