『壹』 C/C++與匯編混合編程有什麼好處
當需要C/C++與匯編混合編程時,可以有以下兩種處理策略:
若匯編代碼較短,則可在C/C++源文件中直接內嵌匯編語言實現混合編程。
若匯編代碼較長,可以單獨寫成匯編文件,最後以匯編文件的形式加入項目中,通過ATPCS規定與C程序相互調用及訪問。
後綴.S文件中的匯編指令是用armasm匯編器進行匯編的,而C語言程序中的內嵌匯編指令則是用內嵌匯編器進行匯編的。這兩種匯編器存在一定的差異,所以在內嵌匯編時要注意以下幾點。
2.3.1 小心使用物理寄存器
必須小心使用物理寄存器,如R0~R3、IP(R12)、LR(R14)和CPSR中的N、Z、C、V標志位。因為計算匯編代碼中的C表達式時,可能使用這些物理寄存器,並會修改N、Z、C、V標志位。
如計算:
y=x+x/y;
[cpp] view plain
1. __asm
2. {
3. MOV R0, x //把x的值給R0
4. ADD y, R0, x/y //計算x/y時R0的值會被修改
5. }
2.3.2 內嵌匯編程序中允許使用C變數
在計算x/y時R0會被修改,從而影響R0+x/y的結果。內嵌匯編程序中允許使用C變數,用C變數來代替寄存器R0可以解決上述問題。這時內嵌匯編器將會為變數var分配合適的存儲單元,從而避免沖突的發生。如果內嵌匯編器不能分配合適的存儲單元,它將會報告錯誤。
[cpp] view plain
1. int var;
2. __asm
3. {
4. MOV var, x //把x的值給R0
5. ADD y, var, x/y //計算x/y時R0的值會被修改
6. }
2.3.3 不需要保存和恢復用到的寄存器
對於在內嵌匯編語言程序中用到的寄存器,編譯器在編譯時會自動保存和恢復這些寄存器,用戶不用保存和恢復這些寄存器。除了CPSR和SPSR寄存器外,其他物理寄存器在讀之前必須先賦值,否則編譯器會報錯。
[cpp] view plain
1. int fun (int x)
2. {
3. __asm
4. {
5. STMFD SP!, {R0} //保存R0,先讀後寫,匯編出錯
6. ADD R0, x, #1
7. EOR x, R0, x
8. LDMFD SP!, {R0} //多餘的
9. }
10. return x;
11. }