新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 混合使用C、C++和匯編語之:內(nèi)聯(lián)匯編和嵌入型匯編的使用

混合使用C、C++和匯編語之:內(nèi)聯(lián)匯編和嵌入型匯編的使用

作者: 時間:2013-09-30 來源:網(wǎng)絡 收藏

本文引用地址:http://www.2s4d.com/article/257034.htm

可以顯示地使用、THUMB和ODE16偽操作改變嵌入式匯編的執(zhí)行狀態(tài)。關于偽操作的詳細信息請參加指令偽操作一節(jié)。如果使用的處理器支持Thumb-2指令,則可以在Thumb狀態(tài)下,在嵌入式匯編中使用Thumb-2指令。

參數(shù)名允許用在參數(shù)列表中,但不能用在嵌入式匯編函數(shù)體內(nèi)。例如,以下函數(shù)在函數(shù)體內(nèi)使用整數(shù)i,但在匯編中無效:

__asmintf(inti){

ADDi,i,#1//編譯器報錯

}

可以使用r0代替i。

下面通過嵌入式匯編的例子,來進一步熟悉嵌入式匯編的使用。

下面的例子實現(xiàn)了字符串的拷貝,注意和上一節(jié)中中字符串拷貝的例子相比較,分析其中的區(qū)別。

#includestdio.h>

__asmvoidmy_strcpy(constchar*src,constchar*dst){

loop

LDRBr3,[r0],#1

STRBr3,[r1],#1

MPr3,#0

BNEloop

MOVpc,lr

}

voidmain()

{

constchar*a=Helloworld!;

charb[20];

my_strcpy(a,b);

printf(Originalstring:'%s'n,a);

printf(opiedstring:'%s'n,b);

}

2.嵌入式的使用限制

嵌入式匯編的使用有下面一些限制。

①在預處理之后,__asm函數(shù)只能包含匯編代碼,但以下標識符除外:

·__cpp(expr);

·__offsetof_base(D,B);

·__mcall_is_virtual(D,f);

·__mcall_is_in_vbase(D,f);

·__mcall_this_offset(D,f);

·__vcall_offsetof_vfunc(D,f);

②編譯程序不為__asm函數(shù)生成返回指令。如果要從__asm函數(shù)返回,必須將用匯編代碼編寫的返回指令包含到函數(shù)體內(nèi)。由于嵌入式匯編執(zhí)行__asm函數(shù)的順序是在編譯時定義好的,所有從一個內(nèi)嵌匯編跳轉(zhuǎn)到一個內(nèi)嵌匯編程序是運行的,但在中卻不能實現(xiàn)。

③__asm函數(shù)調(diào)用遵循AAPCS規(guī)則。所以,即使在__asm函數(shù)體內(nèi)可用的匯編代碼(例如,更改狀態(tài)),在__asm函數(shù)和普通C或函數(shù)相互調(diào)用時,未必可用,因為此調(diào)用也必須遵循AAPCS規(guī)則。

c語言相關文章:c語言教程


c++相關文章:c++教程




評論


相關推薦

技術專區(qū)

關閉