最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C與匯編混合編程的實現(xiàn)示例

 更新時間:2021年07月13日 15:13:57   作者:Cx_class  
本文主要介紹了C與匯編混合編程的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

上一期中,使用鏈表的方式進(jìn)行對不同任務(wù)的調(diào)用,實現(xiàn)的效果還是不錯的,但是,任務(wù)在進(jìn)行過程中不能進(jìn)行來回的切換,必須要執(zhí)行完,這是一個弊端,若不使用實時操作系統(tǒng)的情況下,如何切換呢,那就要說一下萬能的匯編了,用匯編則可以做到任務(wù)的切換

首先我們知道,c與匯編的聯(lián)合使用就三種情況,如下

1. C語言內(nèi)聯(lián)匯編

首先看一下代碼

__inline int ADD(int input1,int intput2)
{
	int output;
	__asm{
		ADD output,input1,intput2
	}
	return output;
}


int Number(void);

int value;
int main(void)
{
	int a = 12,b = 13;
	while(1)
	{
		value = ADD(a,b);
	}
}

執(zhí)行效果

在這里插入圖片描述

0x19的十進(jìn)制為25

2. C語言調(diào)用匯編函數(shù)

調(diào)用匯編函數(shù),首先創(chuàng)建一個.s匯編文件

在這里插入圖片描述

創(chuàng)建完成后,在匯編文件中寫入一個匯編函數(shù)

				AREA |.text|,CODE,READONLY
				EXPORT Get_Number
Get_Number
		MOV		R0,#761
		BX		LR
		ALIGN
		END	

然后寫一個main函數(shù)調(diào)用它

int Get_Number(void);

int value;
int main(void)
{
	while(1)
	{
		value = Get_Number();
	}
}

查看執(zhí)行效果

在這里插入圖片描述

3. 匯編代碼調(diào)用C語言函數(shù)

在匯編文件中,輸入如下代碼

				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)
{
	Number = Number + 32;
	
	return Number;
}

看一下執(zhí)行效果吧

在這里插入圖片描述

在這里插入圖片描述

繼續(xù)向下執(zhí)行

在這里插入圖片描述

數(shù)字由100變成132;實現(xiàn)功能

解釋說明:

/*
AREA    
    語法格式:    
    AREA 段名 屬性1 ,屬性2 ,……    
    AREA偽指令用于定義一個代碼段或數(shù)據(jù)段。其中,段名若以數(shù)字開頭,則該段名需用“|”括起來,如:|1_test| 。    
    屬性字段表示該代碼段(或數(shù)據(jù)段)的相關(guān)屬性,多個屬性用逗號分隔。常用的屬性如下:    
    — CODE 屬性:用于定義代碼段,默認(rèn)為READONLY 。    
    — DATA 屬性:用于定義數(shù)據(jù)段,默認(rèn)為READWRITE 。    
    — READONLY 屬性:指定本段為只讀,代碼段默認(rèn)為READONLY 。    
    — READWRITE 屬性:指定本段為可讀可寫,數(shù)據(jù)段的默認(rèn)屬性為READWRITE 。    
    — ALIGN 屬性:使用方式為ALIGN表達(dá)式。在默認(rèn)時,ELF(可執(zhí)行連接文件)的代碼段和數(shù)據(jù)段是按字對齊的,表達(dá)式的取值范圍為0~31,相應(yīng)的對齊方式為2表達(dá)式次方。    
    — COMMON 屬性:該屬性定義一個通用的段,不包含任何的用戶代碼和數(shù)據(jù)。各源文件中同名的COMMON段共享同一段存儲單元。 
	
*/

/*
MOV
	傳送指令	將右邊數(shù)據(jù)移入左邊寄存器
LDR 
	將右值地址存的數(shù)據(jù)移入左邊寄存器
BX	
	通用寄存器 里面存入基地址、偏移量、臨時數(shù)據(jù)
BL
	跳轉(zhuǎn)指令

LR r14
(1)當(dāng)使用bl或者blx跳轉(zhuǎn)到子過程的時候,r14保存了返回地址,可以在調(diào)用過程結(jié)尾恢復(fù)
(2)異常中斷發(fā)生時,這個異常模式特定的物理R14被設(shè)置成該異常模式將要返回的地址

ENTRY   是程序入口偽指令。在一個完整的匯編程序中至少有一個 ENTRY,編譯程序在編譯連接時依據(jù)程序入口進(jìn)行連接。
		在只有一個入口時,編譯程序會把這個入口的地址定義為系統(tǒng)復(fù)位后的程序起始點。但在一個源文件里最多只能有一個 ENTRY。

ENDP    表示PROC所定義的過程結(jié)束. (end procedure)
ENDS    表示SEGMENT定義的段結(jié)束.   (end segment)
END     程序結(jié)束.
*/

使用BL跳轉(zhuǎn)
BL指令同時還將PC寄存器的值保存到LR寄存器中,是帶返回的跳轉(zhuǎn)指令
所以
假設(shè)在一個匯編程序中,要調(diào)用兩個C語言函數(shù)
用事實證明可以返回

將匯編代碼修改為如下

				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

對應(yīng)的c文件為

int Number;

int Get_Number(void)
{
	Number = Number + 32;
	
	return Number;
}

int Value;

int Get_Value(void)
{
	Value = Value - 32;
	
	return Value;
}

查看代碼執(zhí)行情況
首先進(jìn)行第一個函數(shù)的執(zhí)行,數(shù)字發(fā)生改變

在這里插入圖片描述

接下來是第二個函數(shù)執(zhí)行,數(shù)字發(fā)生改變

在這里插入圖片描述

證明BL跳轉(zhuǎn)可以返回。
可以使用匯編加C語言的編程思路,打破一些限制
也為后面進(jìn)行PC的跳轉(zhuǎn)打下基礎(chǔ)

到此這篇關(guān)于C與匯編混合編程的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)C與匯編混合編程 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Matlab仿真實現(xiàn)圖像煙霧識別(k-means聚類圖像分割+LBP+PCA+SVM)

    利用Matlab仿真實現(xiàn)圖像煙霧識別(k-means聚類圖像分割+LBP+PCA+SVM)

    本文主要介紹了利用k-means聚類實現(xiàn)圖像分割+LBP算法進(jìn)行特征提取+PCA算法進(jìn)行特征降維+SVM算法訓(xùn)練二分類模型從而實現(xiàn)煙霧識別。文中介紹很詳細(xì),感興趣的朋友可以了解一下
    2021-12-12
  • C++使用模板實現(xiàn)單鏈表(類外實現(xiàn))

    C++使用模板實現(xiàn)單鏈表(類外實現(xiàn))

    這篇文章主要為大家詳細(xì)介紹了C++使用模板實現(xiàn)單鏈表的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C語言職工信息管理系統(tǒng)源碼

    C語言職工信息管理系統(tǒng)源碼

    這篇文章主要為大家詳細(xì)介紹了C語言職工信息管理系統(tǒng)源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言中二維數(shù)組指針的簡要說明

    C語言中二維數(shù)組指針的簡要說明

    這篇文章主要介紹了C語言中二維數(shù)組指針的簡要說明,文章后也附送一個小練習(xí)題進(jìn)行鞏固,需要的朋友可以參考下
    2015-08-08
  • C/C++?extern關(guān)鍵字用法示例全面解析

    C/C++?extern關(guān)鍵字用法示例全面解析

    這篇文章主要為大家介紹了C/C++?extern關(guān)鍵字用法示例全面解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • C語言實現(xiàn)一個文件版動態(tài)通訊錄流程詳解

    C語言實現(xiàn)一個文件版動態(tài)通訊錄流程詳解

    這篇文章主要介紹了C語言實現(xiàn)一個文件版動態(tài)通訊錄流程,希望大家能從這篇文章中收獲到許多,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • C++實現(xiàn)將輸入的內(nèi)容輸出到文本文件

    C++實現(xiàn)將輸入的內(nèi)容輸出到文本文件

    這篇文章主要介紹了C++實現(xiàn)將輸入的內(nèi)容輸出到文本文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 使用C語言計算長方體的表面積和體積

    使用C語言計算長方體的表面積和體積

    這篇文章主要給大家介紹了關(guān)于如何使用C語言計算長方體的表面積和體積的相關(guān)資料,在C語言中,我們可以使用乘法運(yùn)算符(*)來進(jìn)行乘法運(yùn)算,并將結(jié)果保存在一個變量中,需要的朋友可以參考下
    2023-10-10
  • 深入理解C語言中編譯相關(guān)的常見錯誤

    深入理解C語言中編譯相關(guān)的常見錯誤

    本篇文章是對C語言中編譯相關(guān)的常見錯誤進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Qt采用線程以隊列方式實現(xiàn)下發(fā)數(shù)據(jù)

    Qt采用線程以隊列方式實現(xiàn)下發(fā)數(shù)據(jù)

    在C++中隊列是一種常用的數(shù)據(jù)結(jié)構(gòu)之一,一種特殊的線性表,一般采用先進(jìn)先出的方式。本文主要為大家介紹了Qt如何以隊列方式實現(xiàn)下發(fā)數(shù)據(jù),感興趣的可以了解一下
    2022-10-10

最新評論

泊头市| 讷河市| 信宜市| 乌海市| 忻州市| 商水县| 宜黄县| 泰州市| 固镇县| 南丹县| 澄城县| 监利县| 鄂伦春自治旗| 廊坊市| 循化| 阿克| 牡丹江市| 金阳县| 上林县| 新沂市| 贵港市| 沿河| 精河县| 安顺市| 元谋县| 九龙坡区| 上蔡县| 信丰县| 水城县| 安西县| 兰西县| 平度市| 疏附县| 泽州县| 中山市| 浮梁县| 浙江省| 响水县| 姚安县| 松原市| 昌乐县|