在ARM C語(yǔ)言程序中使用關(guān)鍵詞 ̄asm來(lái)標(biāo)識(shí)一段匯編指令程序,其格式如下。
其中,asm后面的括號(hào)中必須是一個(gè)單獨(dú)的字符串,該字符串中不能包含注釋語(yǔ)句。
在C/C++程序中使用內(nèi)嵌的匯編指令應(yīng)注意以下事項(xiàng)。
在匯編指令中,逗號(hào)(,)用作分隔符。因此如果指令中的C/C++表達(dá)式中包含有逗號(hào)(,),則該表達(dá)式應(yīng)該被包含在括號(hào)中。例如:
其中,(f(),Z)為C/C++表達(dá)式
如果在指令中使用物理寄存器,則應(yīng)該保證該寄存器不會(huì)被編譯器在計(jì)算表達(dá)式值時(shí)破壞。例如,在下面的代碼段中,編譯器通過程序調(diào)用來(lái)計(jì)算表達(dá)式x/y的值。在這個(gè)過程中編譯器破壞了寄存器R2、R3、IP、LR的值;更新了CPSR寄存器的NZCV條件標(biāo)志位;并在寄存器R0中返回表達(dá)式的商,在寄存器RI中返回表達(dá)式的余數(shù)。這時(shí)程序中寄存器R0的數(shù)據(jù)就丟掉了。
這種情況下可以用C變量來(lái)代替第1條指令中的物理寄存器RO,如下所示。
這時(shí)編譯器將會(huì)為變量cvar分配合適的寄存器,從而避免沖突的發(fā)生。如果編譯器不能分配合適的寄存器,那么它將報(bào)告錯(cuò)誤。例如,在下面的代碼段中,由于編譯器將會(huì)展開ADD指令,在展開時(shí)會(huì)用到P寄存器,從而破壞了第1條指令為IP寄存器賦的值,這時(shí)編譯器將報(bào)告錯(cuò)誤。
不要使用物理寄存器去引用一個(gè)C變量。比如,在下面的例子中,用戶可能認(rèn)為進(jìn)入子程序example1中后,參數(shù)x的值保存在寄存器RO中,因而在內(nèi)嵌的匯編指令中直接使用寄存器RO,最后返回結(jié)果。實(shí)際上,編譯器認(rèn)為子程序中沒有作任何有意義的操作,于是將該段匯編代碼優(yōu)化掉了,從而返回的結(jié)果與輸八的參數(shù)值相同,并沒有做加1操作。
對(duì)于內(nèi)嵌匯編器可能會(huì)用到的寄存器,編譯器自己會(huì)保存和恢復(fù)這些寄存器,用戶不用保存和恢復(fù)這些寄存器。除常量寄存器CPSR和寄存器SPSR外,其他寄存器必須先賦值后讀取,否則編譯器將會(huì)報(bào)錯(cuò)。例如,在下面的例子中,第1條指令在沒有給寄存器R0賦值前讀取其值,這是錯(cuò)誤的;而最后一條指令恢復(fù)寄存器R0的值,也是沒有必要的。
來(lái)源:ks990次