記事ディレクトリ
アセンブリ言語はどのように見えますか?
-
例:レジスタの値に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