‹テンプレート マニュアルは統合が検討されています。›
Atmel AVR 命令セットは、 1996 年にAtmelによって開発された改良型ハーバード アーキテクチャ8 ビットRISCシングル チップマイクロコントローラであるAtmel AVRのマシン言語です。AVR は、プログラム ストレージに オンチップフラッシュ メモリを使用する最初のマイクロコントローラ ファミリの 1 つでした。
プロセッサレジスタ
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
汎用 8 ビット レジスタは 32 個あり、R0 ~ R31 です。すべての算術演算と論理演算はこれらのレジスタで実行されます。RAM にアクセスするのはロード命令とストア命令のみです。
限られた数の命令が 16 ビット レジスタ ペアで動作します。ペアの番号の小さい方のレジスタは最下位ビットを保持し、偶数である必要があります。最後の 3 つのレジスタ ペアは、メモリ アドレス指定のポインタ レジスタとして使用されます。これらは、X (R27:R26)、Y (R29:R28)、Z (R31:R30) と呼ばれます。3 つすべてで、ポストインクリメントおよびプリデクリメント アドレス指定モードがサポートされています。Y と Z は、6 ビットの正の変位もサポートしています。
即値を許可する命令は、レジスタ R16 ~ R31 (8 ビット演算) またはレジスタ ペア R25:R24 ~ R31:R30 (16 ビット演算 ADIW および SBIW) に制限されます。MUL 演算のいくつかのバリエーションは、8 つのレジスタ (R16 ~ R23) に制限されます。
特殊目的レジスタ
これら 32 個の汎用レジスタに加えて、CPU にはいくつかの特殊目的レジスタがあります。
- PC: 16 ビットまたは 22 ビットのプログラム カウンタ
- SP: 8 ビットまたは 16 ビットのスタック ポインタ
- SREG: 8ビットステータスレジスタ
- RAMPX、RAMPY、RAMPZ、RAMPD、EIND: 24 ビット アドレスを形成するために 16 ビット アドレスの前に付加される 8 ビット セグメント レジスタ。大きなアドレス空間を持つ部品でのみ使用できます。
ステータスレジスタ
ステータス レジスタ ビットは次のとおりです。
- Cキャリーフラグ。これは減算時の借用フラグです。
- Zゼロフラグ。演算結果がゼロのときに設定され、ゼロ以外のときにクリアされます。
- N負のフラグ。演算結果の最上位ビットのコピーに設定されます。
- Vオーバーフローフラグ。2の補数のオーバーフローの場合に設定されます。
- S 符号フラグ。AVR に固有のもので、常に N⊕V であり、比較の真の符号を示します。
- Hハーフキャリーフラグ。これは加算からの内部キャリーであり、BCD演算をサポートするために使用されます。
- T ビットコピー。特殊なビットロード命令とビットストア命令はこのビットを使用します。
- I割り込みフラグ。割り込みが有効な場合に設定されます。
マルチバイト演算を容易にするために、2 つの特殊なケースが存在します。
- 命令
INCとDEC命令はキャリーフラグを変更しないので、任意精度の算術オペランドをループするのに使用できます。[1] :84、101 CPC、SBCおよびSBCI(キャリー付き比較/減算)命令は、結果がゼロの場合にはZフラグを設定せず、結果がゼロ以外の場合にのみクリアします。[ 1] :79,147,149 固定精度のマルチバイト比較 では、展開されたシーケンスで実装され、差 全体CP; CPC; CPC; CPCがゼロの場合にのみ設定されるゼロフラグが生成されます。
アドレッシング
利用可能なアドレス空間は次のとおりです。
- 汎用レジスタは番号 (0 ~ 31) でアドレス指定されますが、これらのレジスタのサブセットのみを操作できる命令では、5 ビットの完全な番号は格納されません。
- I/O レジスタには専用の 6 ビット アドレス空間があり、その下位半分はビット アドレス指定可能です。一部の部分にはこのアドレス空間外の I/O レジスタがあり、これは「拡張 I/O」と呼ばれ、データ アドレス空間内のメモリ マップ I/Oとしてのみアクセスできます。
- データ アドレス空間は、32 個の汎用レジスタ、すべての I/O レジスタ (I/O アドレス空間からもアクセス可能なレジスタを含む)、および RAM をマップします。必要に応じて、それぞれ RAMPX、RAMPY、RAMPZ を先頭に追加して、X、Y、Z ポインタ レジスタを介して直接または間接的にアドレス指定できます。
- プログラムメモリ(フラッシュ)には、命令をフェッチするための16ビットワードとしてアドレス指定された別のアドレス空間があります。
- 定数データを取得するために、プログラム メモリは Z ポインタ レジスタを介してバイト単位でアドレス指定され、必要に応じて RAMPZ が先頭に追加されます。
- EEPROMは、一部のデバイスではメモリマップされていますが、他のデバイスでは直接アドレス指定できず、代わりにアドレス、データ、および制御 I/O レジスタを介してアクセスされます。
- 汎用レジスタ、ステータス レジスタ、および一部の I/O レジスタはビット アドレス指定可能で、ビット 0 が最下位ビット、ビット 7 が最上位ビットです。
最初の 64 個の I/O レジスタは、I/O とデータ アドレス空間の両方からアクセスできます。したがって、これらには 2 つの異なるアドレスがあります。これらは通常、「0x00 ( 0x20 )」から「0x3F ( 0x5F )」と記述され、最初の項目は I/O アドレスで、括弧内の 2 番目はデータ アドレスです。
PC を除く特殊用途の CPU レジスタは、I/O レジスタとしてアクセスできます。一部のレジスタ (RAMPX、RAMPY) は、アドレス指定可能なメモリが 64 KiB未満のマシンでは存在しない場合があります。
典型的な ATmega メモリ マップは次のようになります。
ここで、 RAMEND は最後の RAM アドレスです。拡張 I/O のないパーツでは、 RAM は0x0060から始まります。
命令タイミング
算術演算はレジスタ R0 ~ R31 上で実行されますが、RAM 上で直接実行されるわけではなく、乗算とワード全体の加算 (ADIW と SBIW) を除いて 1 クロック サイクルかかります。乗算とワード全体の加算は 2 サイクルかかります。
RAM および I/O スペースには、レジスタへのコピーまたはレジスタからのコピーによってのみアクセスできます。間接アクセス (オプションのポストインクリメント、プリデクリメント、または定数変位を含む) は、レジスタ X、Y、および Z を介して可能です。RAM へのすべてのアクセスには 2 クロック サイクルかかります。レジスタと I/O 間の移動は 1 サイクルです。レジスタ間での 8 ビットまたは 16 ビットのデータの移動、またはレジスタ間の定数の移動も 1 サイクルです。プログラム メモリ (LPM) の読み取りには 3 サイクルかかります。
指示リスト
命令は 1 つの 16 ビット長ワードですが、16 ビットまたは 22 ビットのアドレスを含む命令は 2 ワードかかります。
条件分岐には、アドレスへのジャンプとスキップの 2 種類があります。条件分岐 (BRxx) は、ALU フラグをテストし、指定されたアドレスにジャンプできます。スキップ (SBxx) は、レジスタまたは I/O 内の任意のビットをテストし、テストが真であれば次の命令をスキップします。
以下:
- RdとRrはR0~R31の範囲のレジスタです。
- RdhとRrhはR16~R31(上位半分)の範囲のレジスタです。
- RdqとRrqは、R16~R23の範囲のレジスタです(レジスタファイルの4分の1)。
- Rp はレジスタペア R25:R24、R27:R26 (X)、R29:R28 (Y)、または R31:R30 (Z) です。
- XYZはポインタレジスタ(X、Y、Zのいずれか)です。
- YZはポインタレジスタ、YまたはZのいずれかです。
- s はステータスレジスタのビット番号です (0 = C、1 = Z など、上記のリストを参照)
- b は汎用レジスタまたは I/O レジスタのビット番号です (0 = 最下位、7 = 最上位)
- K6は6ビットの符号なし即値定数(範囲:0~63)です。
- K8は8ビットの即値定数です。8ビット演算でのみ使用されるため、符号の有無は関係ありません。
- IO5は、I/Oアドレス空間のビットアドレス可能な部分、つまり下位半分(範囲:0~31)をカバーする5ビットのI/Oアドレスです。
- IO6は、完全なI/Oアドレス空間をカバーする6ビットのI/Oアドレスです(範囲:0~63)
- D16は64KiBをカバーする16ビットのデータアドレスです 。64KiBを超えるデータスペースを持つ部分では、RAMPDセグメントレジスタの内容が先頭に追加されます。
- P22は22ビットのプログラムアドレスで、2 22 16ビットワード(つまり8 MiB)をカバーする。
- S7とS12は、プログラムカウンタに格納されているプログラムアドレスを基準とした、ワード単位の7ビットと12ビットの符号付き変位である。
命令セットの継承
すべての命令がすべてのAtmel AVRコントローラに実装されているわけではありません。これは、乗算、拡張ロード/ジャンプ/呼び出し、ロングジャンプ、および電源制御を実行する命令の場合です。
オプションの指示は、次の 3 つのカテゴリに分類できます。
- コアCPU(計算)機能、より高性能なCPUコアに追加された機能
- メモリアドレッシング機能は、メモリ容量が十分大きいすべてのモデルに追加されます。
- オプション機能、特定のモデルに存在する場合と存在しない場合があるいくつかの周辺機器。
ハイエンドのプロセッサは、より高性能なコアとより多くのメモリの両方を備えている傾向がありますが、一方が存在するからといって、もう一方も存在するとは限りません。
コアCPU命令
オリジナルの「クラシック」コアから始まり、拡張機能は次のレベルに編成されており、各レベルには前述のすべてが含まれます。
LPM「クラシック」コアには、 と同等のゼロオペランド形式の命令のみがありますLPM r0,Z。- 「クラシック プラス」では、レジスタ ペアを移動するための命令と、任意の宛先レジスタと Z ポインタの自動増分を許可する
MOVWより一般的な形式の LPM 命令 (LPM Rd,Zおよび) が追加されています。LPM Rd,Z+ - 「拡張」コアは乗算命令を追加します。
- XMEGA コア自体は新しい命令を追加しませんが、いくつかの重要な変更を加えています。
- メモリ マップが再編成され、プロセッサ レジスタ ファイルのメモリ マッピングが削除され (I/O ポートは RAM アドレス 0 から始まるため)、I/O ポートの範囲が拡張されました。これで、最初の 4K は特殊機能レジスタ、次の 4K はデータ フラッシュ、通常の RAM は 8K から始まります。
- スタック ポインタ レジスタ (SPL および SPH) を調整する前に割り込みを明示的に無効にする必要はありません。SPL への書き込みは、SPH が更新される時間を与えるために、4 クロック サイクルの間割り込みを自動的に無効にします。
- その他のマルチバイト レジスタには、アトミックな読み取りと書き込みを可能にするシャドウ レジスタが用意されています。最下位バイトが読み取られると、上位バイトがシャドウ レジスタにコピーされるため、後でそれらを読み取ると、最初の読み取り時のレジスタのスナップショットが作成されます。下位バイトへの書き込みは、最上位バイトが書き込まれるまでバッファリングされ、最上位バイトが書き込まれると、マルチバイト レジスタ全体がアトミックに更新されます。
- 後期の XMEGA コア (具体的には、ATxmega16A4U などの B、C、AU モデル、ただしATxmega16D4 などの初期の A、D、E モデルは除く) には、exchange()、load-and-set、load-and-clear、load-and-toggle の 4 つのアトミック読み取り-変更-書き込み命令が追加されています。これらは、直接メモリ アクセス周辺機器、特にUSB
XCHコントローラとの連携に役立ちます。
「クラシック」CPU コアよりも性能が低いのは、「AVR1」コアと「AVR tiny」の 2 つのサブセットです。紛らわしいことに、「ATtiny」ブランドのプロセッサには、AVR1 (ATtiny11、ATtiny28)、クラシック (ATtiny22、ATtiny26)、クラシック + (ATtiny24)、AVRtiny (ATtiny20、ATtiny40) など、さまざまなコアがあります。
AVR1 サブセットは人気がなく、2000 年以降は新しいモデルは導入されていません。アドレス 0 ~ 31 にマップされた 32 個のレジスタとアドレス 32 ~ 95 の I/O ポートを除くすべての RAM が省略されています。スタックは 3 レベルのハードウェア スタックに置き換えられ、命令PUSHとPOP命令は削除されています。すべての 16 ビット操作は削除され、、、IJMPおよびICALLZ 経由の間接を除くすべてのロードおよびストア アドレッシング モードも削除されます。
AVR 命令セットをサブセット化する 2 番目の、より成功した試みは、「AVR tiny」コアです。
最も重要な変更点は、AVRtiny コアがレジスタ R0 ~ R15 を省略していることです。レジスタもメモリマップされておらず、I/O ポートは 0 ~ 63、汎用 RAM はアドレス 64 から始まります。16 ビット算術演算 ( ADIW、SBIW) は省略され、ディスプレースメント アドレッシング モードによるロード/ストア ( Y+d、Z+d) も省略されていますが、プリデクリメント アドレッシング モードとポストインクリメント アドレッシング モードは保持されています。LPM命令は省略され、代わりにプログラム ROM がデータ アドレス空間にマップされ、通常のロード命令でアクセスできます。
最後に、AVRtiny コアは、直接 RAM アドレス指定用の 2 ワードLDSおよびSTS命令を削除し、代わりに、ロード/ストアに以前に割り当てられたオペコード空間を、汎用 RAM の最初の 128 の位置 (アドレス 0x40 ~ 0xBF) にアクセスできる新しい 1 ワードLDSおよびSTS命令用の変位命令に使用します。(INおよびOUT命令は、0 ~ 0x3F の I/O 空間への直接アクセスを提供します。)
メモリアドレス指定命令
最小のコアには、データ アドレス空間が ≤256 バイト (つまり、I/O ポートとその他の予約済みアドレスを除いた後の RAM が ≤128 バイト)、プログラム ROM が ≤8192 バイト (8 KiB) あります。これらのコアには 8 ビットのスタック ポインタ (SPL 内) しかなく、12 ビットの相対ジャンプ/呼び出し命令RJMP/のみをサポートします。(AVR プログラム カウンタはバイトではなく 16 ビットのワードをカウントするため、12 ビットのオフセットで 2 13RCALLバイトの ROMをアドレス指定できます。)
利用可能なリソースにアクセスするために必要な追加のメモリ アドレス指定機能が存在します。
- データ アドレス空間が 256 バイトを超えるモデル (RAM が 256 バイト以上) には 16 ビットのスタック ポインタがあり、上位半分は SPH レジスタにあります。
- ROM が 8 KiB を超えるモデルでは、2 ワード (22 ビット) の命令が追加されます
JUMP。CALL(一部の初期モデルでは、スキップ命令の後に 2 ワード命令が続くとエラーが発生します。) - ROM が 64 KiB を超えるモデルでは、
ELPM命令と対応する RAMPZ レジスタが追加されます。LPM命令は、Z の ROM アドレスをゼロ拡張し、ELPM上位ビット用に RAMPZ レジスタを先頭に追加します。これは、より一般的な命令と同じではありませんLPM。ゼロ オペランド形式のみの「クラシック」モデル (ATmega103 および at43usb320) が存在しますELPM。自動増分が使用可能な場合 (ほとんどのモデル)、RAMPZ を含む 24 ビット アドレス全体が更新されます。 - (まれな) 128 KiB を超える ROM を搭載したモデルには、3 バイトのプログラム カウンターがあります。サブルーチンの呼び出しと戻りは、追加の 1 バイトのスタック スペースを使用し、間接ジャンプと呼び出しに追加の上位ビットを提供する新しい EIND レジスタがあり、宛先アドレスとして EIND:Z を使用する新しい拡張命令
EIJMPとがありますEICALL。(以前の命令IJMPとICALL命令は、ゼロ拡張 Z を使用します。) - RAM アドレス空間が 64 KiB を超える (まれな) モデルでは、RAMPX、RAMPY、RAMPZ、および RAMPD レジスタを使用して 16 ビット RAM アドレス指定の制限を拡張します。これらは、それぞれ X、Y、または Z レジスタ ペアを使用するアドレス指定モード、または直接アドレス指定命令
LDS/ に追加の上位ビットを提供しますSTS。ROM アクセスとは異なり、明確な「拡張」命令はなく、代わりに RAMP レジスタが無条件に使用されます。
オプション機能の説明
3つの命令は、対応するハードウェア機能を備えたモデルにのみ存在します。
SPMフラッシュROMに保存するためのもので、フラッシュROMを搭載したプロセッサ(ほとんど)にのみ存在します。BREAKオンチップデバッガを起動するためのもので、オンチップデバッガをサポートしていない一部の小型モデルでは省略されている。DESデータ暗号化標準ラウンドを実行するためのもので、DESアクセラレータをサポートするXMEGAモデルに搭載されています。
AVR1以外のアーキテクチャはavr-libc規則に従って命名されている。[2]
縮小レジスタセット はR16からR31までに制限されます。[1]
命令エンコーディング
ビット割り当て:
- rrrrr = ソースレジスタ
- rrrr = ソースレジスタ (R16 ~ R31)
- rrr = ソースレジスタ (R16~R23)
- RRRR = ソースレジスタペア (R1:R0~R31:R30)
- ddddd = 宛先レジスタ
- dddd = 宛先レジスタ (R16~R31)
- ddd = 宛先レジスタ (R16~R23)
- DDDD = 宛先レジスタペア (R1:R0~R31:R30)
- pp = レジスタペア、W、X、Y、または Z
- y = Y/Zレジスタペアビット(0=Z、1=Y)
- u = FMUL(S(U)) 符号付き、0=符号付き、1=符号なし
- s = ストア/ロード ビット (0=ロード、1=ストア)
- c = コール/ジャンプ (0=ジャンプ、1=コール)
- cy = キャリーあり (0=キャリーなし、1=キャリーあり)
- e = EIND による間接ジャンプ/呼び出しアドレスの拡張 (0=0:Z、1=EIND:Z)
- q = RAMPZでプログラムメモリアドレスを拡張 (0=0:Z、1=RAMPZ:Z)
- aaaaaa = I/O空間アドレス
- aaaaa = I/O 空間アドレス (最初の 32 のみ)
- bbb = ビット番号 (0~7)
- B = ビット値(0 または 1)
- kkkk = 4ビット符号なし定数(DESオペコード)
- kkkkk = 6 ビットの符号なし定数
- KKKKKKKK = 8ビット定数
Atmel AVR は、命令ワード内のビットが連続していない分割フィールドを多数使用します。オフセット命令によるロード/ストアは、6 ビットのオフセットが 3 つの部分に分割される最も極端な例です。
参考文献
- ^ abc 「AVR 命令セットマニュアル」(PDF)。Atmel。2016 年 11 月。Atmel-0856L。
- ^ 「GNU ツールの使用」。AVR Libc マニュアル。2018年5 月 6 日閲覧。
- ^ Atmel. アプリケーション ノート「AVR201: AVR ハードウェア乗算器の使用」。2002 年。引用: 「megaAVR は、AVR RISC マイクロコントローラ ファミリの新しいデバイス シリーズで、その他の新しい機能強化に加えて、ハードウェア乗算器が含まれています。」
外部リンク
- GNU 開発環境:
- Guido Socher による GCC を使用した AVR マイクロコントローラのプログラミング
- AVR マイクロコントローラ用の GNU 開発環境 (Rich Neswold 著)
- GCC-AVR の AVR オプション
- AVR 命令セット継承 (LLVM ノート)、このページと GCC および Binutils コードに基づく
