記事ディレクトリ
C コードでアセンブリ関数を呼び出す
tip1: アセンブリ関数の書き方
例: READONLY の後にアセンブラ関数を追加する
EXPORT ADD_OPT
ADD_OPT FUNCTION
ADD R0, R0,#1
BX LR
ENDFUNC
main 関数に呼び出しを追加します。
extern int ADD_OPT(void); //如果不加void,编译器会提示warn:warning: function declaration isn’t a prototype(函数声明不是原型)
int main(void)
{
int i = 0;
i = i +1 ;
ADD_OPT();
}
デバッグ モード、リセット、F11 を押してステップごとに実行:
add+1 操作を実行:
mov を追加して R1 の値を表示:
アセンブリ ステートメントを C コードに直接追加する
·組み込みアセンブリ ステートメント
__asm{ アセンブリ関数またはコード} . インライン アセンブリ ステートメントの例:
int main(void)
{
int i = 0;
i = i +1 ;
int r1; //若无此定义会提示:Implicit physical register R1 should be defined as a variable
__asm
{
ADDS r1,#1
}
}
__asm void add_opt()
{
ADDS R0,R1
BX LR
}
C 言語の組み込みアセンブリ asm 構文については、ブログ投稿を参照してください。
ヒント: MDK コメントは中国語で表示されます
MDK のエンコーディングは、chinese2312 に設定されています ([編集] > [構成] > [エディタ] > [エンコーディング])。
Cortex-M アーキテクチャ CPU コアのレジスタとプロセッサ モード
Cortex-M アーキテクチャの CPU コア レジスタ
デモ
スタートアップファイルを開いてデバッグ状態に入り、リセット:
F:\IOT\PRJ\first_prj\RTE\Device\STM32F407ZGTx\startup_stm32f407xx.s
1ステップ実行、LR値変化:
命令追加: MOV R1, PC,
再コンパイル:
debug,リセット, PC の値を見てください:
これはパイプライン命令であるため、表示される値は異なります (実際には現在のアドレス + 4 の後の値):
特に説明するいくつかのレジスタ
R13 MSP/PSP
R14 LR
R15 PC
2 特殊レジスタ
プログラム ステータス レジスタ xPSR
Cortex-M アーキテクチャ CPU プロセッサの動作状態、モード、特権レベル
1 動作状態
デバッグ状態
Thumb状態(Thumb命令実行)
2 特権レベルと動作モード
2種類の特権レベル 特権
レベル
非特権レベル(ユーザーレベル):特殊レジスタ、特殊ステータスレジスタの書き込み禁止
2つの動作モード
ハンドラモード
スレッド(スレッド) ) モデル
3状態とモードとレベルの切り替え
MDK でのデモ
内部の CONTROL の 0 ビットを 1 に変更します。
影響を受ける値は反転表示され、非特権になります
内部の CONTROL の 0 ビットを 3 に変更します。
SP レジスタを 0 に設定します。実行を継続し、割り込みをトリガーします。
HardFault_Handler