C言語とアセンブリ言語の混合プログラミング


C言語とアセンブリ言語の混合プログラミング
1、C/C++プログラムに埋め込まれたアセンブリ命令を使用する
ARM C言語プログラムでは、キーワードを使用します.asmは、アセンブリ命令プログラムを識別します.
プログラムフォーマットは以下の通りです.
__asm	;        !
{
          
    ~~~~~~~~~~
          
}
のうちの一つの命令が複数行を占める場合は、連続行記号(\)を使用します.R 0~R 3、SP、LRとCPSRのN、Z、C、Vフラグビットは、コンパイルコードのC式を計算する際に、これらの物理レジスタを使用して、N、Z、C、Vフラグビットを変更することがありますので、物理レジスタを注意して使用してください.
2、アセンブラからCプログラム変数にアクセスする
Cプログラムで宣言されたグローバル変数はアドレスによって間接的にアクセスできます.
具体的なアクセス方法は以下の通りです.
a、IMPORTダミーコマンドを使ってこのグローバル変数を宣言する.
b、LDRコマンドを使用して、このグローバル変数のメモリアドレスを読み出します.通常、このグローバル変数のメモリアドレスはプログラムのデータバッファに格納されます.
c、このデータの種類に応じて、該当するLDRコマンドでグローバル変数の値を読み出し、該当STRコマンドでグローバル変数の値を修正します.
    AREA globals, CODO, READONPY
    EXPORT asmsub
    IMPORT glovbver	;      glovbver
asmsub
    LDR R1, =glovbver	;      
    LDR R0, [R1]	;    
    ADDR R0, R0, #1	; 1  
    STR R0, [R1]	;     
    MOV PC, LR
    END
3、Cプログラムとアセンブラが相互にルールを呼び出す
レジスターの使用規則:
a、サブルーチン間は、レジスタR 0〜R 3を介してパラメータを転送する.
b、サブルーチンでは、レジスタR 4〜R 11を用いてローカル変数を保存します.
c、レジスタR 12は、SPを保存するために使用され、関数の帰りにこのレジスタスタックを使用して、IPとして記録される.
d、レジスタR 13は、データスタックポインタのために使用され、SPとして記憶され、レジスタSPは、サブルーチンに入るときの値と、レジスタを終了するときの値とが等しくなければならない.
e、レジスタR 14は、リンクレジスタと称され、LRと記載され、サブルーチンの戻りアドレスを保存するために用いられる.
f、レジスタR 15はプログラムカウンタであり、PCと記す.