ARM命令セットの概要

ARM命令の概要

ARM命令セットは、ARMアーキテクチャ用に設計された命令です。ブートローダーブートの最初の段階とカーネルの最初の段階では、アセンブリ言語で記述されたファイルがあり、オペレーティングシステムを実行せずにベアボードで開発ボード環境を初期化するために使用されるアセンブリコードもあります。したがって、オペレーティングシステムを備えたボードの開発であろうと、ベアボードの開発であろうと、少なくとも一般的に使用されるアセンブリ命令を理解するには、アセンブリ言語は少し学ぶ必要があります。優れたパフォーマンスを持つシステムを設計するには、ARMの動作原理を習得する必要があります。

ARM命令セットは、次の6つに分類できます。

  • ジャンプ指導
  • データ処理命令
  • プログラムステータスレジスタ転送命令
  • ロード/ストア命令
  • コプロセッサー命令
  • 異常割り込み命令

一般的なarm命令の構文は次のとおりです:<opcode> {<cond>} {s} <Rd>、<Rn>、<shifter_operand>

  • <opcode>:ADD、SUB、その他の命令などの命令ニーモニック。
  • {<cond>}:条件付き実行1を示します
  • {S}:命令の操作がCPSRの値に影響を与えるかどうかを判断します。
  • <Rd>:ターゲットレジスタ。
  • <Rn>:第1オペランドを含むレジスタを示します。
  • <shifter_operand>:第2オペランドを示します。

ARM命令アドレッシングモード

ARM命令のアドレス指定とは、オペランドのアドレスを見つけることです。アドレス指定方法は次のように分類できます。

  • データ処理命令のオペランドのアドレッシングモード。
  • ロード/ストア命令アドレッシングモード。

データ処理命令のオペランドアドレス指定

これらの命令のオペランドには、即値2、レジスタモード(オペランドはレジスタの値)、レジスタシフトモード(オペランドはレジスタ内の値の対応するシフト)の3つの形式があります。レジスタシフトモード3:ASR(算術右シフト)、LSL(論理左シフト)、LSR(論理右シフト)、ROR(循環右シフト)、RRX(拡張付き循環右シフト)、シフトされたビット数値は、即値またはレジスタとして表すことができます。したがって、データ処理命令には11種類のアドレッシングモードがあります。

  • #<即時>
  • <Rm>
  • <Rm>、LSL、#<shirt_imm>
  • <Rm>、LSL、#<Rs>
  • <Rm>、LSR、#<shirt_imm>
  • <Rm>、LSR、#<Rs>
  • <Rm>、ASR、#<shirt_imm>
  • <Rm>、ASR、#<Rs>
  • <Rm>、ROR、#<shirt_imm>
  • <Rm>、ROR、#<Rs>
  • <Rm>、RRX

オペランドのアドレス指定のロード/ストア

ワードおよび符号なしバイトのロード/ストア命令アドレッシング

ロード/ストア命令のアドレッシングモードは2つの部分で構成されます。1つはベースアドレスレジスタで、もう1つはアドレスオフセットです。アドレスオフセットには、イミディエート、レジスタ、レジスタシフトの3つの形式があります同じアドレッシングモードのアドレス計算方法には、通常のオフセット、更新前の方法、更新後の方法の 3種類があります

  • 一般的なオフセット方法は、ベースアドレスレジスタの値と、[<Rn>、アドレスオフセット]で表されるオフセットを直接加算および減算することです。
  • 以前の更新方法:使用前に更新、[<Rn>、アドレスオフセット] として表現使用!更新方法を事前に示します。
  • イベント後の更新方法:ベースアドレスレジスタの値を使用して更新します。[<Rn>] 、アドレスオフセット、[]、アドレスオフセットの順で表され、イベント後の更新を示します。
    したがって、9つのアドレッシングモードを組み合わせることができます。
  • [<Rn>、#+ /-<offset_12>]
  • [<Rn>、+ /-<Rm>]
  • [<Rn>、+ /-<Rm>、<shift>#<shift_imm>]
  • [<Rn>、#+ /-<offset_12>]
  • [<Rn>、+ /-<Rm>]
  • [<Rn>、+ /-<Rm>、<shift>#<shift_imm>]
  • [<Rn>] 、#+ /-<offset_12>
  • [<Rn>] 、+ /-<Rm>
  • [<Rn>] 、+ /-<Rm>、<shift>#<shift_imm>
    更新前メソッドと更新後メソッドは、最初にベースアドレスレジスタの値とオフセット値を処理するプロセスを参照し、次に使用。ベースアドレスレジスタは、ベースアドレスレジスタの値を使用した後に更新されます。C言語の++ valおよびval ++に似ています。

一括読み込み/ストアアドレス指定モード

大量のデータをロードまたは保存する必要がある場合は、バルクロード/ストア命令操作を使用できます。バッチ命令は、レジスタセットと連続メモリユニット間でデータを転送できます。一度に最大16のメモリユニットデータを転送します。レジスタと命令内のメモリユニットとの対応は、番号小さいレジスタがメモリ内の下位アドレスユニットに対応することです。
形式は次のとおりです。LDM| STM {<cond>} <addressing_mode> <Rn> {!}、<Registers> {^} <addressing_code>は、アドレスがどのように変化するかを示し、次の4つのタイプがあります。

  • IA(後の増分):後の増分。最初のレジスタは、ベースレジスタ<Rn>によってポイントされるユニットメモリとしてのメモリユニットに対応します。次に、4バイトを順番に追加します
  • IB(前に増加):事前に増加します。最初のレジスタはメモリユニットに対応し、メモリユニットはベースアドレスレジスタ<Rn> + 4です。次に、4バイトを順番に追加します
  • DA(後の減少):後の減少。メモリユニットに対応する最初のレジスタは、ベースアドレスレジスタ<Rn> -4 *(レジスタの総数-1)で示されるユニットメモリです。次に、4バイトを順番に追加します
  • DB(前に減少):事前に減少します。最初のレジスタは、メモリユニットがベースアドレスレジスタ<Rn> -4 *(レジスタの総数)であるメモリユニットに対応します。次に、4バイトを順番に追加します

通常のデータ送信では、ロード命令とストア命令で同じアドレッシングモードを使用できます。ただし、データスタックの操作では、データのメモリへの書き込みとメモリからの読み取りの順序が異なるため、使用されるアドレッシング方法も異なります。スタックアドレッシングモードは、FD、ED、FA、EA 4です。

その他のロード/ストア命令アドレッシングモード

その他の命令には、ハーフワードオペランド、符号付きバイト、およびダブルバイトのロード/ストア命令があります。構文形式は次のとおりです
。LDR| STR {<cond>} H | SH | SB | D <Rd>、<addressing_mode>

  • H:ハーフワードのインタビュー。
  • S:文字データ。
  • B:バイトデータアクセス。
  • W:ダブルワードアクセス。
    アドレッシングメソッドには6種類しかありません。アドレッシングメソッドには、通常のオフセット、更新前メソッド、更新後メソッドがあります。オフセットの形式は、即値、レジスタです。したがって、6つのアドレッシングモードを組み合わせます。
  • [<Rn>、#+ /-<offset_8>]
  • [<Rn>、+ /-<Rm>]
  • [<Rn>、#+ /-<offset_8>]
  • [<Rn>、+ /-<Rm>]
  • [<Rn>] 、#+ /-<offset_8>
  • [<Rn>] 、+ /-<Rm>

ARM命令セット

ジャンプ指導

ARMでプログラムジャンプを行う方法は2つあります。ジャンプ命令使用て、ターゲットアドレス値をPCに直接書き込みます。2つの違いは、PCレジスタが直接操作され、4GBのアドレス空間でジャンプ(ロングジャンプ)を実行できることです。ARMのジャンプ命令は、現在の命令から32MBアドレス空間に前方または後方にジャンプできます。命令は、B、BL、BLX、BX Lです。PC値をLRレジスタに保存し、状態を切り替えてXジャンプします(サム命令セットに切り替えることができます。ターゲットアドレスの命令タイプは、ターゲットアドレスのビット[0]によって決定されます) )。

データ処理命令

データ処理命令は、データ転送命令、算術論理演算命令、比較命令の3つのカテゴリに分類できます。オペランドの計算方法については、前述のデータ処理命令のアドレッシングモード部分を参照してください。算術論理命令は結果をターゲットレジスタに格納し、CPSRの価格調整フラグビットを更新します。比較命令は演算結果を保存せず、CPSR内の対応する条件フラグを更新するだけです。

  • データ送信命令は次のとおりです。MOVMVN
    MOV | MVN {<cond>} {s} <Rd>、<shifter-operand>
    MOV(MVN)命令は、<shifter_operand>で表されるデータ(逆コード)をターゲットレジスタに転送します< Rd>中。
    注:MOVS PC、LR命令は、何らかの異常な割り込みからの復帰を実現できます。PCがターゲットレジスタであり、Sビットが設定されており、命令が実行されると、現在のプロセッサモードに対応するSPSRの値がCPSRにコピーされます。

  • 比較手順は次の
    とおりです。CMP CMN TST TEQ <opcode> {<cond>} <Rn>、<shifter_operand>
    CMP命令は、<Rn>-<shifet_operand>の値に従ってCPSRの対応する条件フラグを更新しますビット。
    CMN命令は、<Rn> + <shifet_operand>の値とCPSRの対応する条件フラグビットを演算結果に応じて更新します。
    TST命令は、<Rn>の値と<shifet_operand>の値に対してビットごとのAND演算を実行し、その演算結果に従ってCPSRの対応する条件フラグビットを更新します。
    TEQ命令は、<Rn>の値と<shifet_operand>の値の間でビット単位のXOR演算を実行し、その演算結果に従ってCPSRの対応する条件フラグビットを更新します。

  • 算術論理命令は、ADD SUB RSB ADC SBC RSCおよびBIC EOR ORR
    <opcode> {<cond>} {s} <Rd>、<Rn>、<shifter_operand>です。

ADDは、オペランドをレジスタ<Rn>の値に追加し、結果を宛先レジスタに保存します。
ADCにはビット加算命令があり、ADDに基づいてCPSRのC条件フラグビットの値を加算します。
例:64ビットのオペランドを追加します。64ビットのソースオペランドがR0とR1に配置され、下位の33ビットがR0に配置され、64ビットのソースオペランドもR2とR3に配置され、下位の32ビット
ADDS がR2 R4、R0、R2
ADC R5、R1に格納されます。 R3 ==> R5R4は、計算結果の
SUB、SUC減算命令、およびビット減算命令です。SUCは、SUBに基づいてCPSRのC条件フラグの逆を減算します。これら2つの命令を組み合わせて、64ビットの減算を実行することもできます。
SUBS R4、R0、R2
SUC R5、R1、R3
RSB、RSC逆減算命令およびビット単位の逆減算命令。<Rd> = <shifter_operand>-<Rn>

乗算命令:(これにはあまり使用されません)

  • MUL:32ビット乗算命令。
  • MLA:加数付きの32ビット乗算命令。
  • SMULL:64ビット符号付き数値乗算命令。
  • SMLAL:加数付きの64ビット符号付き乗算命令。
  • UMULL:64ビット符号なし乗算命令。
  • UMLAL:追加の64ビット符号なし乗算命令。

CLZ {<cond>} <Rd>、<Rm>。この命令は、レジスタ内のオペランドの最上位にある0の数をカウントするために使用されます。
ARM命令セットの除算演算はコプロセッサによって実装されるため、除算算術命令はありません。

AND、ORR、EOR、およびBICは、それぞれビットごとの論理AND、OR、XOR、およびクリア操作です。

プログラムステータスレジスタ転送命令

ARMには、ステータスレジスタと汎用レジスタの間でデータを転送するための2つの命令があります。プログラムは、CPSRのT制御ビットを直接変更してプログラム状態を直接サム状態に変更することはできません。プログラム状態は、BXなどの命令を介して切り替える必要があります。通常、プログラムステータスレジスタの変更は、「読み取り->変更->書き込み」によって実現されます。

  • MSR汎用レジスタからステータスレジスタに命令を転送します。それが書かれています。
  • MRSステータスレジスタから汎用レジスタに命令を転送します。読んで。

ロード/ストア命令

ロード命令はメモリからレジスタにデータを読み込むために使用され、ストア命令はレジスタ内のデータをメモリに保存するために使用されます。
ロード/ストア
移動されたデータが大量にある場合、ARMは一括ロード/ストアメモリアクセス命令も提供します。バッチロード命令は、連続するメモリセルから一度にデータを読み取り、それらをレジスタに転送できます。バッチストア命令は、レジスタリスト内の複数のレジスタ値を異性によってメモリに書き込むことです。

LDM | STM {<cond>} <addressing_mode> Rn {!}、<Registers> {^}
**コマンド内!**命令の実行後、オペランドのメモリアドレスがベースアドレスレジスタ<Rn>に書き込まれます。つまり、ベースアドレスが更新されます。
^命令の実行時に、現在のプロセッサモードのSPSR値がCPSRにコピーされることを意味します。PCがレジスタに含まれていない場合、命令命令で使用されるレジスタはユーザーモードのレジスタです。

データ転送命令には特別な命令があります。セマフォの操作要件は、アトミック操作です(中断できません。つまり、1つの命令しかありません)。SWP命令は、レジスタの読み取りと変更が終了したときのセマフォ操作に使用されます。
swp {<cond>} <Rd>、<Rm>、[<Rn>]実行の結果、Rnの内容がRdに読み込まれ、同時にRmレジスタの内容がRnに書き込まれます。

コプロセッサー命令

ARMコプロセッサ命令には、次の3つのカテゴリがあります。

  • これは、ARMコプロセッサーを初期化するARMプロセッサーのデータ処理操作に使用されます。CDP
  • ARMプロセッサのレジスタとARMコプロセッサのレジスタ間のデータ転送操作に使用されます。MCR、MRC
  • ARMコプロセッサのレジスタとメモリユニット間でデータを転送するために使用されます。LDC、STC

CDPコプロセッサー操作命令。CDP命令を使用すると、ARMプロセッサは特定の操作を実行するようにARMコプロセッサに通知できます。これは、コプロセッサによって完了されます。
ここに画像の説明を挿入
LDC命令は、連続するメモリユニットからコプロセッサのレジスタにデータを読み込みます。STC命令は、コプロセッサーのレジスター内のデータを一連のメモリー・セルに書き込みます。
形式:
LDC {<cond>} {L} <coproc>、<CRd>、<addressing_mode>
LDC2 {L} <coproc>、<CRd>、<addressing_mode>

STC {<cond>} {L} <coproc>、<CRd>、<addressing_mode>
STC2 {L} <coproc>、<CRd>、<addressing_mode>

MCR命令はARMプロセッサのレジスタ内のデータをコプロセッサのレジスタに転送し、MRCはコプロセッサのレジスタ内の値をARMプロセッサのレジスタに転送します。
MCR {<cond>} <coproc>、<opcode_1>、<Rd>、<CRn>、<CRm> {、<opcode2>}
MCR2 <coproc>、<opcode_1>、<Rd>、<CRn>、<CRm > {、<opcode2>}

MRC {<cond>} <coproc>、<opcode_1>、<Rd>、<CRn>、<CRm> {、<opcode2>}
MRC2 <coproc>、<opcode_1>、<Rd>、<CRn>、<CRm > {、<opcode2>}

<Rd>:ARMレジスタ、その値はアシスタントシャープツールのレジスタに転送されるか、アシスタント処理レジスタから値を読み取ります。
<CRn>:プロセッサレジスタを補助するため。
<CRm>:追加の宛先レジスタまたはソースオペランドレジスタ用。

異常割り込み発生命令

ARMの概要では、ARMには7つのモードがあり、ユーザーモードと特権モードに分類できることがわかります。特権モードでは、システムのすべてのリソースにアクセスして、自由に他のモードに切り替えることができます。しかし、ユーザーモードでは権限がそれほど大きくないので、ユーザーモードでシステムリソースにアクセスする場合はどうすればよいでしょうか。ARMは、ユーザーモードのオペレーティングシステムで特権モードプログラムへの呼び出しを実現するソフト割り込みを通じて、異常な割り込み命令SWIを提供します。
SWI {<cond>} <immed_24>オペレーティングシステムは、24ビットの即値を通じて、ユーザープログラムによって要求されたサービスのタイプを識別します。


  1. ARMの命令実行条件コードは次のとおりです
    命令条件コード

  2. 即値データは32ビットですが、すべてのオペランドが即値データであるとは限りません。即値 = 8ビットデータ>>偶数(最大30ビットシフト、場合によっては32ビット、右シフト32ビットはシフトなし)、即値の構成は最小シフトを使用する方法なので、データ幅が8ビットを超える場合、確実に即時ではありません。ARM命令セットの即時データには#マークを使用します。↩︎

  3. 算術右シフトは符号ビットです。つまり、最上位ビットの値が予約されます。論理右シフトは、左ビットを0で埋めることです。循環右シフトは、左ビットを右シフトしたビットで埋めることです。循環右シフトは、拡張します。 CPSRでは、最上位ビットがCビットで埋められます。↩︎

  4. F(フル)、E(空):スタックポインターがスタックの一番上の要素(スタックにプッシュされた最後のデータ)を指す場合、それはフルスタックと呼ばれ、スタックポインターがスタックの一番上の要素に隣接する使用可能なデータユニットを指す場合、それは空のスタックと呼ばれます。D(降順):データスタックはメモリアドレスが減少する方向に増加し、A(昇順)データスタックはメモリアドレスが増加する方向に増加します。↩︎

元の記事を35件公開 Like1 Visits 1870

おすすめ

転載: blog.csdn.net/lzj_linux188/article/details/103523087