埋め込みARMアセンブリ

アセンブリ言語はどのように見えますか?

  • 例:レジスタの値に100を
    追加します。x86:eaxを追加、#100
    68K:#100を
    追加、D0 ARM:r0、r0、#100を追加

  • 例:レジスタポインタからレジスタ
    x86へのロード:mov eax、DWORD PTR [ebx]
    68K:MOVE L(A0)、D0
    ARM:ldr r0、[r1]

  • 例:ARM開始コード構造
    ここに写真の説明を挿入

  • ARMアセンブリ命令フォーマット
    Operation [cond] {status} Rd、Rn、Operand2

ARMアセンブリ

指示条件とステータスコード

  • 条件コード(条件)
    ここに写真の説明を挿入
  • ステータスコード(ステータス)

ここに写真の説明を挿入

ARMアセンブリアドレス指定モード

  • 即時アドレス指定
    ADD R0、R0、#0x3F
  • レジスタアドレス指定:
    ADD R0、R1、R2
  • 間接アドレス指定
    LDRR0、[R1]
    STR R0、[R1]を登録します
  • レジスタシフトアドレッシング
    ADDR3、R2、R1、LSL#2(R1は2ビット左にシフトされ、R1が追加されてから、R3に割り当てられます)
  • ベースアドレスアドレス指定
    LDRR0、[R1、#4](R1アドレスが指す値に4を加えた値をR0に
    追加LDR R0、[R1]、#4(R1アドレスから取得した値に4を追加) R0)
    LDR R0、[R1、R2]
  • マルチレジスタアドレス指定
    LDMIAR0、{R1、R2、R3、R4}
  • 相対アドレス指定
    BLNEXT(NEXTにジャンプ)
    MOV PC、LR

データ操作(ALU操作)

ここに写真の説明を挿入
ここに写真の説明を挿入

論理演算(および、または、排他的または)

ここに写真の説明を挿入

比較操作

ここに写真の説明を挿入

メモリ操作

単一レジスタの読み取りおよび書き込み命令、
ここに写真の説明を挿入
複数レジスタの読み取りおよび書き込み命令
ここに写真の説明を挿入

  • アドレスモード
    (1)データブロックモード:IA(送信後のアドレスプラス4)、IB(送信前のアドレスプラス4)、DA(送信後のアドレスマイナス4)、DB(送信前のアドレスマイナス4)
    (2)スタックモード:フルボトムスタック、EA(空のデクリメントスタック)、FD(フルデクリメントスタック)、ED(空のインクリメントスタック)、FA(フルインクリメントスタック)

データ交換手順
ここに写真の説明を挿入

ジャンプ、状態操作

オペコード オペランド 説明 関数
B ジャンプ命令 pc <-label
BL リターン付きの接続ジャンプ pc->-ラベル
BX ジャンプして状態を切り替えるThumb
BLX リターンでジャンプして状態を切り替えますThumb

ステータスレジスタ操作

ステータスレジスタ操作:32ビット命令を4つのフィールドに分割します:[7:0]制御ビットフィールドc、[15:8]拡張ビットフィールドx、[23:16]ステータスビットフィールドs、[31:24]条件フラグフィールドf

オペコード オペランド 説明 関数
夫人 プログラムステータスレジスタの値を汎用レジスタに転送します
MSR CPSR R0; SPSR、R0; CPSR_c R0 一般レジスタからプログラムステータスレジスタへ

例外生成命令

オペコード オペランド 説明 関数
SWI SWI 0x02 ソフト割り込み命令
BKPT BKPT ブレークポイント割り込み命令

ARM疑似命令

ARMアセンブリ言語プログラムには、いくつかの特別な命令ニーモニックがあります。これらのニーモニックは、命令システムのニーモニックとは異なります。対応する操作コードはありません。これらの特別な命令ニーモニックは、通常、疑似命令と呼ばれます。この操作は疑似操作と呼ばれます。ソースプログラムの疑似命令の機能は、アセンブリプログラムを完了するためのさまざまな準備を行うことです。これらの疑似命令は、アセンブリプロセスでのみ機能します。アセンブリが終了すると、疑似命令のミッションが完了します。

  • 基本的な一般的な疑似命令
    ここに写真の説明を挿入
    ここに写真の説明を挿入
    ここに写真の説明を挿入

アセンブリ言語プログラムで一般的に使用される記号

  • シンボルの命名規則:
    (1)シンボルは大文字と小文字が区別され、同じ名前の大文字と小文字のシンボルは、コンパイラーによって2つの異なるシンボルと見なされます。
    (2)シンボルは、そのアクションの範囲内で一意である必要があります。
    (3)自己定義のシンボルは、システムの予約済みワードと同じにすることはできません。
    (4)シンボル名は、命令または疑似命令と同じであってはなりません
  • シンボル、変数
    ARM(Thumb)アセンブラは、数値変数、論理変数、および文字列変数をサポートします
    ここに写真の説明を挿入
  • 定数
    (1)デジタル定数は通常32ビットの整数です。符号なしの数値として使用する場合、その値の範囲は0〜232-1であり、符号付きの数値として使用する場合、その値の範囲は-231〜231-1
    ( 2)論理定数の値はtrueまたはfalseの2つだけです
    (3)文字列定数は固定文字列であり、プログラムの実行時に情報プロンプトに一般的に使用されます
  • 変数置換文字
    プログラム内の変数は、置換操作によって定数を取得できます。置換演算子は次のとおりです。 "" $ ""
    サンプル:
LCLS S1
LCL S2
S1 SETS "Test!"
S2 SETS "This is a  $S1"   ;字符串变量S2的值为    This is a Test!
  • 式と演算子
    ここに写真の説明を挿入

登録操作

登録操作
ここに写真の説明を挿入

データ定義疑似アセンブリ

データ定義疑似アセンブリ
ここに写真の説明を挿入
ここに写真の説明を挿入

制御指令

ここに写真の説明を挿入
サンプル:

GBLL Test ;声明一个全局的逻辑变量,变量名为Test
……
IF Test = TRUE
指令序列1
ELSE
指令序列2
ENDIF


GBLA Counter ;声明一个全局的数学变量,变量名为Counter 
Counter SETA 3 ;由变量Counter控制循环次数 
…… 
WHILE Counter < 10 
指令序列 
WEND


MACRO
$OP hello world $param1,$param2
MOV R3,#0x02
MEXIT
MEND

おすすめ

転載: blog.csdn.net/qq_41782149/article/details/96176151