Atmel AVR命令セット
Atmel AVR命令セットは、1996年にAtmelによって開発された改良型ハーバードアーキテクチャ8ビットRISCシングルチップマイクロコントローラであるAtmel AVRの機械語です。Atmelは2016年にMicrochip Technologyに買収されました。 [ 1 ] 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演算のいくつかのバリエーションは、レジスタR16~R23の8つのレジスタに限定されます。
特殊目的レジスタ
これら 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命令はキャリーフラグを変更しないので、任意精度の算術オペランドをループするのに使用できます。[ 2 ]:84、101 CPC、SBCおよびSBCI(キャリー付き比較/減算)命令は、結果がゼロのときはZフラグを設定せず、結果がゼロ以外の場合のみクリアします。[ 2 ] : 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)は、アドレス指定可能なメモリが64KiB未満のマシンでは存在しない場合があります。
| 登録する | I/Oアドレス | データアドレス |
|---|---|---|
| スレグ | 0x3F | 0x5F |
| SP | 0x3E : 0x3D | 0x5E : 0x5D |
| アインド | 0x3C | 0x5C |
| ランプズ | 0x3B | 0x5B |
| ランピー | 0x3A | 0x5A |
| ランプクス | 0x39 | 0x59 |
| ランプド | 0x38 | 0x58 |
典型的な ATmegaメモリマップは次のようになります。
| データアドレス | I/Oアドレス | コンテンツ |
|---|---|---|
| 0x0000 – 0x001F | レジスタR0~R31 | |
| 0x0020 – 0x003F | 0x00 – 0x1F | I/Oレジスタ(ビットアドレス指定可能) |
| 0x0040 – 0x005F | 0x20 – 0x3F | I/Oレジスタ(ビットアドレス指定不可) |
| 0x0060 – 0x00FF | 拡張I/Oレジスタ(メモリマップI/Oのみ) | |
| 0x0100 – RAMEND | 内部SRAM |
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
- XYZ+は、XまたはYまたはZのポインタレジスタで、後置インクリメントされます。
- -XYZはポインタレジスタ(X、Y、Z)で、プリデクリメントされます。
- YZはポインタレジスタ(YまたはZ)です。
- Z+はポインタレジスタ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アドレス空間(範囲:0~63)をカバーする6ビットのI/Oアドレスです。
- D16は64KiBをカバーする16ビットのデータアドレスです 。64KiBを超えるデータ空間を持つ部分では、RAMPDセグメントレジスタの内容が先頭に追加されます。
- P22は22ビットのプログラムアドレスで、2 22 個の16ビットワード(つまり8 MiB)をカバーする。
- S7とS12は、プログラムカウンタに格納されているプログラムアドレスを基準とした、ワード単位の7ビットと12ビットの符号付き変位である。
| 算術 | ビット&その他 | 移行 | ジャンプ |
|---|---|---|---|
ADD Rd , Rr ADC Rd , Rr ADIW Rp + 1 : Rp , K6SUB Rd 、Rr SUBI Rdh 、K8 SBC Rd 、Rr SBCI Rdh 、K8 SBIW Rp + 1 : Rp 、K6INCロードDECロードAND Rd 、Rr ANDI Rdh 、K8 OR Rd 、Rr ORI Rdh 、K8 COM Rd NEG Rd CP Rd 、Rr CPC Rd 、Rr CPI Rdh 、K8 SWAP Rd LSR Rd ROR Rd ASR RdMUL Rd 、Rr MULS Rdh 、Rrh MULSU Rdq 、Rrq FMUL Rdq 、Rrq FMULS Rdq 、Rrq FMULSU Rdq 、Rrq | BSET s BCLR s SBI IO5 、b CBI IO5 、b BST Rd 、b BLD Rd 、bNOPブレイクスリープWDR | MOV Rd , Rr MOVW Rd + 1 : Rd , Rr + 1 : RrIN Rd 、IO6 OUT IO6 、Rr押すRrポップRrLDIロード、K8 LDSロード、D16LD Rd 、X LDD Rd 、YZ + K6 LD Rd 、- XYZ LD Rd 、XYZ +STS D16 、RrST X 、Rr STD YZ + K6 、Rr ST - XYZ 、Rr ST XYZ + 、RrLPM LPM Rd 、Z LPM Rd 、Z + ELPM ELPM Rd 、Z ELPM Rd 、Z +SPM | RJMP S12 IJMP EIJMP JMP P22 |
| 電話 | |||
RCALL S12 ICALL EICALL CALL P22レト・レティ | |||
| 支店 | |||
CPSE Rd 、RrSBRC Rr 、b SBRS Rr 、bSBIC IO5 、b SBIS IO5 、bBRBC s 、S7 BRBS s 、S7 |
命令セットの継承
すべての命令がすべての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モデルは除く)には、4つのアトミックなリード・モディファイ・ライト命令(exchange()、ロード・アンド・セット、ロード・アンド・クリア、ロード・アンド・トグル)が追加されています。これらの命令は、ダイレクト・メモリ・アクセス・ペリフェラル(特に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と命令は削除されています。すべての16ビット演算、、、、およびZ経由の間接を除くすべてのロードおよびストア・アドレッシング・モードも POP削除されています。IJMPICALL
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と命令に置き換えます。(命令と命令は、0~0x3FのI/O空間への直接アクセスを提供します。) STSINOUT
メモリアドレス指定命令
最小のコアは、データアドレス空間が256バイト以下(I/Oポートやその他の予約アドレスを除いたRAMが128バイト以下)で、プログラムROMが8192バイト以下(8KiB)です。これらのコアは8ビットのスタックポインタ(SPL)のみを備え、12ビットの相対ジャンプ/コール命令RJMP/のみをサポートします。(AVRプログラムカウンタはバイトではなく16ビットのワードをカウントするため、12ビットのオフセットで2 13RCALLバイトのROMをアドレス指定できます。)
利用可能なリソースにアクセスするために必要に応じて追加のメモリ アドレス指定機能が存在します。
- データ アドレス空間が 256 バイトを超えるモデル (RAM が 256 バイト以上) には 16 ビットのスタック ポインタがあり、上位半分は SPH レジスタにあります。
- 8 KiB を超える ROM を搭載したモデルでは、2 ワード (22 ビット)命令
JUMPと命令が追加されます。(初期モデルの一部では、スキップ命令の後に 2 ワード命令が続くとエラッタCALLが発生します。) - ROMが64KiBを超えるモデルでは、
ELPM命令と対応するRAMPZレジスタが追加されます。LPM命令はZのROMアドレスをゼロ拡張し、ELPM命令は上位ビットにRAMPZレジスタを付加します。これは、より一般的な命令とは異なりますLPM。ゼロオペランド形式のみを備えた「クラシック」モデルELPM(ATmega103およびat43usb320)も存在します。自動インクリメントが利用可能な場合(ほとんどのモデル)、RAMPZを含む24ビットアドレス全体を更新します。 - ROMが128KiBを超える(稀な)モデルには、3バイトのプログラムカウンタが搭載されています。サブルーチン呼び出しとリターンはスタック空間をさらに1バイト使用します。また、間接ジャンプと呼び出しのための上位ビットを追加するための新しいEINDレジスタが追加されました。さらに、EIND:Zを宛先アドレスとして使用する新しい拡張命令
EIJMPと命令が追加されました。(以前の命令と命令は、ゼロ拡張されたZを使用しています。)EICALLIJMPICALL - 64KiBを超えるRAMアドレス空間を持つ(稀な)モデルでは、RAMPX、RAMPY、RAMPZ、RAMPDレジスタによって16ビットRAMアドレス指定の制限が拡張されます。これらのレジスタは、それぞれX、Y、Zレジスタペアを使用するアドレッシングモード、または直接アドレッシング命令
LDS/ を使用するアドレッシングモードに、追加の上位ビットを提供STSします。ROMアクセスとは異なり、明確な「拡張」命令はなく、代わりにRAMPレジスタが無条件に使用されます。
オプション機能の説明
3つの命令は、対応するハードウェア機能を備えたモデルにのみ存在します。
SPMフラッシュROMに保存するためのもので、フラッシュROMを搭載したプロセッサ(ほとんど)にのみ存在する。BREAKオンチップデバッガを起動するための命令で、オンチップデバッガをサポートしていない一部の小型モデルでは省略されている。DESデータ暗号化標準ラウンドを実行するためのもので、DESアクセラレータをサポートするXMEGAモデルに搭載されています。
AVR1以外のアーキテクチャはavr-libcの規則に従って命名されている。[ 3 ]
| 家族 | メンバー | 算術 | 支店 | 転送 | ビット単位 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 最小限のAVR1コア |
|
|
|
|
| ||||||||||||
| 最大 8K プログラム空間のクラシック コア (「AVR2」) |
| 新しい指示:
| 新しい指示:
| 新しい指示:
| (新しいことは何もありません) | ||||||||||||
| AVR2、MOVWおよびLPM命令付き(「AVR2.5」) |
| (新しいことは何もありません) | (新しいことは何もありません) | 新しい指示:
| (新しいことは何もありません) | ||||||||||||
| 最大 128K のクラシック コア (「AVR3」) |
| (新しいことは何もありません) | 新しい指示:
| 新しい指示:
| (新しいことは何もありません) | ||||||||||||
| 最大8Kの拡張コア(「AVR4」) |
| 新しい指示:
| (新しいことは何もありません) | 新しい指示:
| (新しいことは何もありません) | ||||||||||||
| 最大 128K の拡張コア (「AVR5」、「AVR5.1」) |
| (新しいことは何もありません) | 新しい指示:
| (新しいことは何もありません) | 新しい指示:
| ||||||||||||
| 最大 4M の拡張コア (「AVR5」および「AVR6」) |
| (新しいことは何もありません) | 新しい指示:
| (新しいことは何もありません) | (新しいことは何もありません) | ||||||||||||
| XMEGA コア ("avrxmega" 2-6) | ATxmegaシリーズ | 新しい指示:
| (新しいことは何もありません) | 新しい手順(第 2 版シリコン - AU、B、C 部品から)
| (新しいことは何もありません) | ||||||||||||
| 縮小されたAVRtinyコア(「avrtiny10」) |
| (CPUレジスタセットaが削減されていることを除いて、最小コアと同一) | (CPU レジスタ セットaの削減を除いて、最大 8K のクラシック コアと同一) | 最大 8K のクラシック コアと同一ですが、次の例外があります。
| (CPUレジスタセットaの削減を除いて、最大128Kの拡張コアと同一) |
縮小 レジスタセットはR16からR31までに制限されます。 [ 2 ]
命令エンコーディング
ビット割り当て:
- rrrrr / ddddd = ソース/デスティネーションレジスタ
- rrrr / dddd = ソース/デスティネーション レジスタ (R16 ~ R31)
- rrr / ddd = ソース/デスティネーションレジスタ (R16~R23)
- RRRR / DDDD = ソース/デスティネーションレジスタペア (R1:R0~R31:R30)
- pp = レジスタペア、W、X、Y、またはZ
- y = Y/Zレジスタペアビット(0=Z、1=Y)
- u = FMULS(U) 符号なしビット (0=FMULS 符号付き、1=FMULSU 符号なし)
- s = ストア/ロードビット (0=LD Rd,mem、1=ST mem,Rd)
- 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は、命令ワード内のビットが連続していない分割フィールドを多数使用します。最もよく見られるのは、ビット9とビット3~0の5ビットのソースレジスタフィールドです。最も極端な例は、オフセット付きロード/ストア命令で、6ビットのオフセットを3つの部分に分割します。
| 1 5 | 1 4 | 1 3 | 1 2 | 1 1 | 1 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 命令 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | いいえ |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | DDDD | RRRR | MOVW Rd,Rr レジスタペアの移動 | ||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | dddd | うーん | MULS Rd、Rr | ||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | ddd | 0 | rrrr | MULSU Rd、Rr | ||||
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | ddd | 1 | rrrr | FMUL Rd、Rr | ||||
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | ddd | あなた | rrrr | FMULS(U) Rd、Rr | ||||
| 0 | 0 | オペコード | r | dddddd | うーん | 2オペランド命令 | ||||||||||
| 0 | 0 | 0 | c̅y̅ | 0 | 1 | r | dddddd | うーん | CPC/CP ロード、レール | |||||||
| 0 | 0 | 0 | c̅y̅ | 1 | 0 | r | dddddd | うーん | SBC/SUB 道路、Rr | |||||||
| 0 | 0 | 0 | サイ | 1 | 1 | r | dddddd | うーん | ADD/ADC Rd,Rr (Rd=Rr の場合、LSL/ROL Rd) | |||||||
| 0 | 0 | 0 | 1 | 0 | 0 | r | dddddd | うーん | CPSE 道路、Rr | |||||||
| 0 | 0 | 1 | 0 | 0 | 0 | r | dddddd | うーん | および Rd、Rr | |||||||
| 0 | 0 | 1 | 0 | 0 | 1 | r | dddddd | うーん | EOR 道路、Rr | |||||||
| 0 | 0 | 1 | 0 | 1 | 0 | r | dddddd | うーん | または Rd、Rr | |||||||
| 0 | 0 | 1 | 0 | 1 | 1 | r | dddddd | うーん | MOV ロード、Rr | |||||||
| 0 | 0 | 1 | 1 | KKKK | dddd | KKKK | CPI ロード、K | |||||||||
| 0 | 1 | OPCC | KKKK | dddd | KKKK | レジスタ即時操作 | ||||||||||
| 0 | 1 | 0 | c̅y̅ | KKKK | dddd | KKKK | SBCI/SUBI Rd、K | |||||||||
| 0 | 1 | 1 | 0 | KKKK | dddd | KKKK | ORI ロード、K SBR ロード、K | |||||||||
| 0 | 1 | 1 | 1 | KKKK | dddd | KKKK | ANDI Rd、K CBR Rd、K | |||||||||
| 1 | 0 | け | 0 | ええと | s | dddddd | y | ククク | LDD/STD RdからZ+kまたはY+kまで | |||||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | dddddd | オペコード | ロード/ストア操作 | |||||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | dddddd | 0 | 0 | 0 | 0 | LDS Rd,i/STS i,Rd | ||||
| 16ビット即値SRAMアドレス i | ||||||||||||||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | dddddd | 1 | 0 | 0 | 0 | (予約済み) | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | dddddd | y | 0 | 0 | 1 | LD/ST RdからZ+/Y+まで | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | dddddd | y | 0 | 1 | 0 | LD/ST Rdから−Z/−Yまで | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | dddddd | y | 0 | 1 | 1 | (予約済み) | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | 0 | dddddd | 0 | 1 | q | 0 | LPM/ELPM ロード、Z | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | 0 | dddddd | 0 | 1 | q | 1 | LPM/ELPM 道路、Z+ | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | dddddd | 0 | 1 | 0 | 0 | XCH Z、Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | dddddd | 0 | 1 | 0 | 1 | LAS Z、Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | dddddd | 0 | 1 | 1 | 0 | LAC Z、Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | dddddd | 0 | 1 | 1 | 1 | LAT Z、Rd | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | dddddd | 1 | 1 | 0 | 0 | LD/ST RdからXまで | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | dddddd | 1 | 1 | 0 | 1 | LD/ST RdからX+まで | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | dddddd | 1 | 1 | 1 | 0 | LD/ST Rdから−Xまで | ||||
| 1 | 0 | 0 | 1 | 0 | 0 | s | dddddd | 1 | 1 | 1 | 1 | ポップ/プッシュロード | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | dddddd | 0 | オペコード | 1オペランド命令: | ||||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | dddddd | 0 | 0 | 0 | 0 | COM ロード | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | dddddd | 0 | 0 | 0 | 1 | NEGロード | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | dddddd | 0 | 0 | 1 | 0 | スワップロード | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | dddddd | 0 | 0 | 1 | 1 | INCロード | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | dddddd | 0 | 1 | 0 | 0 | (予約済み) | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | dddddd | 0 | 1 | 0 | 1 | ASRロード | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | dddddd | 0 | 1 | 1 | 0 | LSRロード | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | dddddd | 0 | 1 | 1 | 1 | RORロード | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | B̅ | bbb | 1 | 0 | 0 | 0 | SEx/CLx ステータスレジスタのクリア/セットビット | ||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | オペコード | 1 | 0 | 0 | 0 | ゼロオペランド命令 | |||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | RET |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | レティ |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | ≠ 00 | × | 1 | 0 | 0 | 0 | (予約済み) | |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 寝る |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 壊す |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | WDR |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | (予約済み) |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | q | 1 | 0 | 0 | 0 | LPM/ELPM |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | SPM |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | SPM Z+ |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | c | 0 | 0 | 0 | e | 1 | 0 | 0 | 1 | Z または EIND:Z への間接ジャンプ/呼び出し |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | c | ≠ 000 | e | 1 | 0 | 0 | 1 | (予約済み) | ||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | dddddd | 1 | 0 | 1 | 0 | DECロード | ||||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | クックッ | 1 | 0 | 1 | 1 | DESラウンドk | |||
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | クックッ | 1 | 1 | c | け | JMP/CALL abs22 | ||||
| かっ、かっ、かっ、かっ、かっ、かっ | ||||||||||||||||
| 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | ええと | pp | クックッ | ADIW Rp、uimm6 | |||||
| 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | ええと | pp | クックッ | SBIW Rp、uimm6 | |||||
| 1 | 0 | 0 | 1 | 1 | 0 | B | 0 | ああああ | bbb | CBI/SBI a,b (I/Oビットのクリア/セット) | ||||||
| 1 | 0 | 0 | 1 | 1 | 0 | B | 1 | ああああ | bbb | SBIC/SBIS a,b (I/Oビットテスト) | ||||||
| 1 | 0 | 0 | 1 | 1 | 1 | r | dddddd | うーん | MUL、符号なし: R1:R0 = Rr × Rd | |||||||
| 1 | 0 | 1 | 1 | s | ああ | dddddd | ああ | I/O空間へのIN/OUT | ||||||||
| 1 | 1 | 0 | c | 12ビット符号付きオフセット | RJMP/RCALL から PC + simm12 へ | |||||||||||
| 1 | 1 | 1 | 0 | KKKK | dddd | KKKK | LDI ロード、K | |||||||||
| 1 | 1 | 1 | 1 | 0 | B̅ | 7ビット符号付きオフセット | bbb | ステータスレジスタビットの条件分岐 | ||||||||
| 1 | 1 | 1 | 1 | 1 | 0 | s | dddddd | 0 | bbb | BLD/BSTレジスタビットをSTATUS.Tへ | ||||||
| 1 | 1 | 1 | 1 | 1 | 1 | B | dddddd | 0 | bbb | レジスタビットがBの場合、SBRC/SBRSはスキップします。 | ||||||
| 1 | 1 | 1 | 1 | 1 | × | × | dddddd | 1 | bbb | (予約済み) | ||||||
参考文献
- ^ Assis, Claudia (2016年1月19日). 「Microchip Technology、チップメーカーAtmelを35億6000万ドルで買収」 . MarketWatch . 2025年12月10日閲覧。
- ^ a b c「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コードに基づく