国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > ASM > 正文

c與匯編混合編程

2019-11-08 01:48:10
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1、為什么要混合編程?

匯編語(yǔ)言:執(zhí)行效率高,編寫繁瑣 C語(yǔ)言:可讀性強(qiáng),移植性好,調(diào)試方便 應(yīng)用在對(duì)執(zhí)行效率有要求的場(chǎng)合、能夠更直接地控制處理器

(1)匯編調(diào)用c函數(shù) 很簡(jiǎn)單,在匯編程序中直接ldr: 例如:ldr pc,=gboot_main (備注:gboot_main是main.c中的一個(gè)子函數(shù),需要修改makefile,見(jiàn)上一篇博客)

(2)c調(diào)用匯編 在匯編中用標(biāo)號(hào)注明,并設(shè)置為全局,然后再c語(yǔ)言中直接引用函數(shù)(標(biāo)號(hào)(),例如 light_led( );)。

.global light_ledlight_led: ldr r0, =GPBCON mov r1, #0x400 str r1, [r0] ldr r0, =GPBDAT mov r1, #0x0 str r1, [r0] mov pc, lr

(3)c內(nèi)嵌匯編

_arm__( 匯編語(yǔ)句部分 :輸出部分 (凡是要寫進(jìn)去的參數(shù)都寫到輸出部分) :輸入部分 (凡是要讀的參數(shù)都寫到輸入部分) :破壞描述部分 ); 后面三個(gè)部分可以省略,也可以arm開(kāi)頭。 這里寫圖片描述

例1:(輸出:在匯編中被修改的C變量列表

void long read_p15_c1(void){ unsigned long value; _arm_( "mrc p15,0,%0,c1,c0,0/n" :"r"(value) @'='表示只寫操作數(shù),用于輸出部 : :“memory” ); return value;}

讀取數(shù)據(jù) 到r*寄存器,并復(fù)制到變量value中去,因?yàn)関alue是存在于棧區(qū)(即內(nèi)存中),所以破壞區(qū)要加上“memory”

例2:(輸入:作為參數(shù)輸入到匯編中的變量列表

void write_p15_c1(unsigned long value){ _arm_( "mcr p15,0,%0,c1,c0,0/n" : :"r"(value) @編譯器選擇一個(gè)R*寄存器 );}

上面的%0表示 0 號(hào)參數(shù)(通用寄存器,系統(tǒng)自動(dòng)分配一個(gè)寄存器),從這個(gè)參數(shù)中讀取數(shù)據(jù)(值從value中獲?。懙絚1寄存器中。

例3:(volatile這里寫圖片描述

例4:(使用內(nèi)嵌匯編點(diǎn)亮LED)

#dedine GPKCON 0X7f008800#define GPKDAT 0x7f008808int gboot_main(){ _arm_( "ldr r1,=0x11110000/n" "str r1,[%0]/n" "ldr r1,=0xa0/n" "str r1,[%1]/n" : :"r"(GPKCON),"r"(GPKDAT) @輸入 :"r1" @因?yàn)樯厦嫘薷牧藃1寄存器,所以放在破壞區(qū) ); return 0;}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 铜鼓县| 临西县| 渑池县| 武川县| 银川市| 东明县| 正蓝旗| 武威市| 荔浦县| 偃师市| 临城县| 平潭县| 新丰县| 临洮县| 榕江县| 天水市| 南和县| 手游| 罗江县| 潞城市| 南涧| 台中县| 乃东县| 宜黄县| 马龙县| 察哈| 五台县| 靖宇县| 庆元县| 沅陵县| 女性| 大兴区| 屏山县| 德保县| 望都县| 彭州市| 莱芜市| 乃东县| 松江区| 铅山县| 江油市|