混合使用C、C++和匯編語(yǔ)之:內聯(lián)匯編和嵌入型匯編的使用
可以顯示地使用ARM、THUMB和CODE16偽操作改變嵌入式匯編的執行狀態(tài)。關(guān)于ARM偽操作的詳細信息請參加指令偽操作一節。如果使用的處理器支持Thumb-2指令,則可以在Thumb狀態(tài)下,在嵌入式匯編中使用Thumb-2指令。
參數名允許用在參數列表中,但不能用在嵌入式匯編函數體內。例如,以下函數在函數體內使用整數i,但在匯編中無(wú)效:
__asmintf(inti){
ADDi,i,#1//編譯器報錯
}
可以使用r0代替i。
下面通過(guò)嵌入式匯編的例子,來(lái)進(jìn)一步熟悉嵌入式匯編的使用。
下面的例子實(shí)現了字符串的拷貝,注意和上一節中內聯(lián)匯編中字符串拷貝的例子相比較,分析其中的區別。
#includestdio.h>
__asmvoidmy_strcpy(constchar*src,constchar*dst){
loop
LDRBr3,[r0],#1
STRBr3,[r1],#1
CMPr3,#0
BNEloop
MOVpc,lr
}
voidmain()
{
constchar*a=Helloworld!;
charb[20];
my_strcpy(a,b);
printf(Originalstring:'%s'n,a);
printf(Copiedstring:'%s'n,b);
}
2.嵌入式匯編語(yǔ)言的使用限制
嵌入式匯編的使用有下面一些限制。
①在預處理之后,__asm函數只能包含匯編代碼,但以下標識符除外:
·__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);
②編譯程序不為_(kāi)_asm函數生成返回指令。如果要從__asm函數返回,必須將用匯編代碼編寫(xiě)的返回指令包含到函數體內。由于嵌入式匯編執行__asm函數的順序是在編譯時(shí)定義好的,所有從一個(gè)內嵌匯編跳轉到一個(gè)內嵌匯編程序是運行的,但在內聯(lián)匯編中卻不能實(shí)現。
③__asm函數調用遵循AAPCS規則。所以,即使在__asm函數體內可用的匯編代碼(例如,更改狀態(tài)),在__asm函數和普通C或C++函數相互調用時(shí),未必可用,因為此調用也必須遵循AAPCS規則。
c語(yǔ)言相關(guān)文章:c語(yǔ)言教程
c++相關(guān)文章:c++教程
評論