回覆列表
  • 1 # 使用者2458114238191884

    當需要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]viewplaincopy1.__asm2.{3.MOVR0,x//把x的值給R04.ADDy,R0,x/y//計算x/y時R0的值會被修改5.}2.3.2內嵌彙編程式中允許使用C變數在計算x/y時R0會被修改,從而影響R0+x/y的結果。內嵌彙編程式中允許使用C變數,用C變數來代替暫存器R0可以解決上述問題。這時內嵌彙編器將會為變數var分配合適的儲存單元,從而避免衝突的發生。如果內嵌彙編器不能分配合適的儲存單元,它將會報告錯誤。[cpp]viewplaincopy1.intvar;2.__asm3.{4.MOVvar,x//把x的值給R05.ADDy,var,x/y//計算x/y時R0的值會被修改6.}2.3.3不需要儲存和恢復用到的暫存器對於在內嵌組合語言程式中用到的暫存器,編譯器在編譯時會自動儲存和恢復這些暫存器,使用者不用儲存和恢復這些暫存器。除了CPSR和SPSR暫存器外,其他物理暫存器在讀之前必須先賦值,否則編譯器會報錯。[cpp]viewplaincopy1.intfun(intx)2.{3.__asm4.{5.STMFDSP!,{R0}//儲存R0,先讀後寫,彙編出錯6.ADDR0,x,#17.EORx,R0,x8.LDMFDSP!,{R0}//多餘的9.}10.returnx;11.}

  • 中秋節和大豐收的關聯?
  • 透過2018年世界盃表現分析,莫德里奇和德布勞內誰才是世界第一中場?