本文引用地址:http://www.eepw.com.cn/article/257034.htm
內聯彙編和嵌入型彙編是包含在C/C++編譯器中的彙編器。使用它可以在C/C++程序中實現C/C++語言不能完成的一些工作。例如,在下面幾種情況中必須使用內聯彙編或嵌入型彙編。
·程序中使用飽和算術運算(Saturatingarithmetic),如SSAT16和USAT16指令。
·程序中需要對協處理器進行操作。
·在C或C++程序中完成對程序狀態寄存器的操作。
使用內聯彙編編寫的程序代碼效率也比較高。
12.1.1內聯彙編1.內聯彙編語法內聯彙編使用「_asm」(C++)和「asm」(C和C++)關鍵字聲明,語法格式如下所示。
·__asm(instruction[;instruction]); //必須為單條指令
__asm{instruction[;instruction]}
·__asm{
...
instruction
...
}
·asm(instruction[;instruction]); //必須為單條指令
asm{instruction[;instruction]}
·asm{
...
instruction
...
}
內聯彙編支持大部分的ARM指令,但不支持帶狀態轉移的跳轉指令,如BX和BLX指令,詳見ARM相關文檔。
由於內聯彙編嵌入在C或C++程序中,所有在用法上有其自身的一些特點。
①如果同一行中包含多條指令,則用分號隔開。
②如果一條指令不能在一行中完成,使用反斜槓「/」將其連接。
③內聯彙編中的注釋語句可以使用C或C++風格的。
④彙編語言中使用逗號「,」作為指令操作數的分隔符,所以如果在C語言中使用逗號必須用圓括號括起來。如,__asm{ADDx,y,(f(),z)}。
⑤內聯彙編語言中的寄存器名被編譯器視為C或C++語言中的變量,所以內聯彙編中出現的寄存器名不一定和同名的物理寄存器相對應。這些寄存器名在使用前必須聲明,否則編譯器將提示警告信息。
⑥內聯彙編中的寄存器(除程序狀態寄存器CPSR和SPSR外)在讀取前必須先賦值,否則編譯器將產生錯誤信息。下面的例子顯示了內聯彙編和真正彙編的區別。
錯誤的內聯彙編函數如下所示。
intf(intx)
{
__asm
{
STMFDsp!,{r0} //保存r0不合法,因為在讀之前沒有對寄存器寫操作
ADDr0,x,1
EORx,r0,x
LDMFDsp!,{r0} //不需要恢復寄存器
}
returnx;
}
將其進行改寫,使它符合內聯彙編的語法規則。
intf(intx)
{
intr0;
__asm
{
ADDr0,x,1
EORx,r0,x
}
returnx;
}
下面通過幾個例子進一步了解內聯彙編的語法。
①字符串拷貝
下面的例子使用一個循環完成了字符串的拷貝工作。
#includestdio.h>
voidmy_strcpy(constchar*src,char*dst)
{
intch;
__asm
{
loop:
LDRBch,[src],#1
STRBch,[dst],#1
CMPch,#0
BNEloop
}
}
intmain(void)
{
constchar*a=Helloworld!;
charb[20];
my_strcpy(a,b);
printf(Originalstring:'%s'\n,a);
printf(Copiedstring:'%s'\n,b);
return0;
}
c語言相關文章:c語言教程
c++相關文章:c++教程