組み込みシステム-レジスタ
レジスタはCPUで使用され、処理されるデータ、またはフェッチされるデータを指すアドレスなどの情報を一時的に格納します。8051では、MSB(最上位ビット)D7からLSB(最下位ビット)D0までの8ビットのデータ型が1つあります。8ビットデータ型では、8ビットより大きいデータ型は、処理する前に8ビットチャンクに分割する必要があります。
8051で最も広く使用されているレジスタは、A(アキュムレータ)、B、R0-R7、DPTR(データポインタ)、およびPC(プログラムカウンタ)です。DPTRとPCを除いて、これらのレジスタはすべて8ビットです。
8051のストレージレジスタ
ここでは、次のタイプのストレージレジスタについて説明します。
- Accumulator
- Rレジスタ
- Bレジスタ
- データポインタ(DPTR)
- プログラムカウンタ(PC)
- スタックポインタ(SP)
アキュムレータ
アキュムレータであるレジスタAは、すべての算術演算および論理演算に使用されます。アキュムレータが存在しない場合、各計算(加算、乗算、シフトなど)のすべての結果がメインメモリに格納されます。大容量のメインメモリに使用されるテクノロジは、レジスタに使用されるテクノロジよりも遅い(ただし安価である)ため、メインメモリへのアクセスはアキュムレータなどのレジスタへのアクセスよりも遅くなります。
「R」レジスタ
「R」レジスタは、R0、R1からR7の8つのレジスタのセットである。これらのレジスタは、多くの操作で補助または一時ストレージレジスタとして機能します。10と20の合計の例を考えてみましょう。変数10をアキュムレータに格納し、別の変数20をたとえばレジスタR4に格納します。加算演算を処理するには、次のコマンドを実行します-
ADD A,R4
この命令を実行した後、アキュムレータには値30が含まれます。したがって、「R」レジスタは非常に重要な補助または helper registers。これらの「R」レジスタがなければ、アキュムレータだけではあまり役に立ちません。「R」レジスタは、値を一時的に保存するためのものです。
別の例を見てみましょう。R1とR2の値を合計し、結果からR3とR4の値を減算します。
MOV A,R3 ;Move the value of R3 into the accumulator
ADD A,R4 ;Add the value of R4
MOV R5,A ;Store the resulting value temporarily in R5
MOV A,R1 ;Move the value of R1 into the accumulator
ADD A,R2 ;Add the value of R2
SUBB A,R5 ;Subtract the value of R5 (which now contains R3 + R4)
ご覧のとおり、R5を使用してR3とR4の合計を一時的に保持しました。もちろん、これは(R1 + R2)–(R3 + R4)を計算する最も効率的な方法ではありませんが、値を一時的に格納する方法として「R」レジスタを使用する方法を示しています。
「B」レジスタ
「B」レジスタは、8ビット(1バイト)の値を保持できるという意味でアキュムレータと非常によく似ています。「B」レジスタは、2つの8051命令でのみ使用されます。MUL AB そして DIV AB。Aを別の数値ですばやく簡単に乗算または除算するには、他の数値を「B」に格納して、これら2つの命令を利用できます。MULおよびDIV命令の使用とは別に、「B」レジスタは、9番目のRレジスタのように、さらに別の一時ストレージレジスタとして使用されることがよくあります。
データポインタ
データポインタ(DPTR)は、8051で唯一のユーザーアクセス可能な16ビット(2バイト)レジスタです。アキュムレータ、R0〜R7レジスタ、およびBレジスタは1バイトの値のレジスタです。DPTRは、データを指すためのものです。これは、DPTRによって示されるアドレスを使用して外部メモリにアクセスするために8051によって使用されます。DPTRは、使用可能な唯一の16ビットレジスタであり、2バイト値を格納するためによく使用されます。
プログラムカウンター
プログラムカウンタ(PC)は、次に実行する命令がメモリ内のどこにあるかを8051に通知する2バイトのアドレスです。PCは、8051が初期化される0000hから起動し、命令が実行されるたびにインクリメントされます。PCは常に1ずつインクリメントされるわけではありません。一部の命令では2バイトまたは3バイトが必要になる場合があります。このような場合、PCは2または3ずつ増加します。
Branch, jump、および interrupt操作は、次の順次位置以外のアドレスでプログラムカウンタをロードします。パワーオンリセットをアクティブにすると、レジスタ内のすべての値が失われます。これは、リセット時にPCの値が0であることを意味し、CPUがROMロケーション0000から最初のオペコードをフェッチするように強制します。これは、CPUがROMロケーション0000を見つけることを期待しているため、アップコードの最初のバイトをROMロケーション0000に配置する必要があることを意味します。最初の指示。
スタックポインタ(SP)
スタックポインタは、DPTRとPCを除くすべてのレジスタと同様に、8ビット(1バイト)の値を保持できます。スタックポインタは、次の値がスタックから削除される場所を示します。値がスタックにプッシュされると、SPの値がインクリメントされ、その値が結果のメモリ位置に格納されます。値がスタックからポップされると、SPによって示されるメモリ位置から値が返され、SPの値がデクリメントされます。
この操作の順序は重要です。8051が初期化されると、SPは07hに初期化されます。値が同時にスタックにプッシュされると、8051は最初にSPの値を(07hから08hに)インクリメントし、次にプッシュされた値をそのメモリに格納するため、値は内部RAMアドレス08hに格納されます。アドレス(08h)。SPは、PUSH、POP、ACALL、LCALL、RET、およびRETIの6つの命令によって8051によって直接変更されます。
8051のROMスペース
8051の一部のファミリメンバーには、4KバイトのオンチップROMしかありません(例:8751、AT8951)。AT89C52のように8KROMを搭載しているものもあれば、DallasSemiconductorのように32Kバイトと64KバイトのオンチップROMを搭載しているファミリもあります。覚えておくべきポイントは、8051のプログラムカウンタは16ビットレジスタ(0000からFFFFアドレス)であるため、8051ファミリのメンバーは64Kバイトを超えるオペコードにアクセスできないことです。
8051内のプログラムROMの最初の場所のアドレスは0000Hですが、最後の場所はチップ上のROMのサイズによって異なる場合があります。8051ファミリのメンバーの中で、AT8951には、0000(最初の場所)から0FFFH(最後の場所)のメモリアドレスを持つ$ kバイトのオンチップROMがあります。
8051フラグビットとPSWレジスタ
プログラムステータスワード(PSW)レジスタは、8ビットレジスタとも呼ばれます。 flag register。幅は8ビットですが、使用されるのは6ビットのみです。2つの未使用ビットはuser-defined flags。4つのフラグが呼び出されますconditional flags、これは、命令が実行された後に発生する状態を示すことを意味します。これらの4つはCY (運ぶ)、 AC (補助キャリー)、 P (パリティ)、および OV(オーバーフロー)。ビットRS0およびRS1は、バンクレジスタを変更するために使用されます。次の図は、プログラムステータスワードレジスタを示しています。
PSWレジスタには、CPUの現在のステータスを反映するステータスビットが含まれています。
CY | CA | F0 | RS1 | RS0 | OV | - | P |
---|
CY | PSW.7 | キャリーフラグ |
交流 | PSW.6 | 補助キャリーフラグ |
F0 | PSW.5 | ユーザーが汎用で使用できるフラグ0。 |
RS1 | PSW.4 | レジスタバンクセレクタビット1 |
RS0 | PSW.3 | レジスタバンクセレクタビット0 |
OV | PSW.2 | オーバーフローフラグ |
- | PSW.1 | ユーザー定義可能なフラグ |
P | PSW.0 | パリティフラグ。アキュムレータの1ビットの偶数/奇数を示すために、命令サイクル中にハードウェアによってセット/クリアされます。 |
RS0およびRS1ビットを使用して、対応するレジスタバンクビットを選択できます。
RS1 | RS2 | レジスターバンク | 住所 |
---|---|---|---|
0 | 0 | 0 | 00H-07H |
0 | 1 | 1 | 08H-0FH |
1 | 0 | 2 | 10H-17H |
1 | 1 | 3 | 18H-1FH |
CY, the carry flag−このキャリーフラグは、D7ビットからのキャリーが発生するたびにセット(1)されます。8ビットの加算または減算演算の後に影響を受けます。「SETBC」や「CLRC」などの命令で直接1または0にリセットすることもできます。「SETB」はセットビットキャリーを表し、「CLR」はクリアキャリーを表します。
AC, auxiliary carry flag− ADDまたはSUB操作中にD3およびD4からのキャリーがある場合、ACビットがセットされます。それ以外の場合はクリアされます。これは、2進化10進演算を実行する命令に使用されます。
P, the parity flag−パリティフラグは、アキュムレータレジスタの1の数のみを表します。Aレジスタに奇数の1が含まれている場合、P = 1; 偶数の1の場合、P = 0です。
OV, the overflow flag−このフラグは、符号付き数値演算の結果が大きすぎて上位ビットが符号ビットにオーバーフローするたびに設定されます。符号付き算術演算のエラーを検出するためにのみ使用されます。
例
次の手順で、9CHおよび64Hを追加した後のCY、AC、およびPフラグのステータスを表示します。
MOV A、#9CH
Aを追加、#64H
Solution: 9C 10011100
+64 01100100
100 00000000
CY = 1 since there is a carry beyond D7 bit
AC = 0 since there is a carry from D3 to D4
P = 0 because the accumulator has even number of 1's