Embedded-systems-es-registers
組み込みシステム-レジスタ
CPUは、処理するデータやフェッチするデータを指すアドレスなどの情報を一時的に保存するためにCPUでレジスタを使用します。 8051には、MSB(最上位ビット)D7からLSB(最下位ビット)D0までの8ビットのデータタイプが1つあります。 8ビットデータ型では、8ビットを超えるデータ型は、処理する前に8ビットチャンクに分割する必要があります。
8051の最も広く使用されているレジスタは、A(アキュムレータ)、B、R0-R7、DPTR(データポインタ)、およびPC(プログラムカウンタ)です。 これらのレジスタはすべて、DPTRとPCを除く8ビットです。
8051のストレージレジスタ
ここでは、次のタイプのストレージレジスタについて説明します-
- アキュムレータ
- Rレジスタ
- Bレジスタ
- データポインター(DPTR)
- プログラムカウンター(PC)
- スタックポインター(SP)
アキュムレータ
アキュムレータであるレジスタAは、すべての算術演算および論理演算に使用されます。 アキュムレータが存在しない場合、各計算の結果(加算、乗算、シフトなど)はすべてメインメモリに格納されます。 メインメモリへのアクセスは、アキュムレータのようなレジスタへのアクセスよりも遅くなります。これは、大きなメインメモリに使用されるテクノロジがレジスタに使用されるテクノロジよりも遅い(ただし安価)ためです。
「R」レジスタ
「R」レジスタは、8つのレジスタ、つまりR0、R1〜R7のセットです。 これらのレジスタは、多くの操作で補助または一時記憶レジスタとして機能します。 10と20の合計の例を考えてみましょう。 アキュムレータに変数10を、レジスタR4などに別の変数20を格納します。 追加操作を処理するには、次のコマンドを実行します-
ADD A,R4
この命令の実行後、アキュムレーターには値30が含まれます。 したがって、「R」レジスタは非常に重要な補助または*ヘルパーレジスタ*です。 これらの「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は、データを指すためのものです。 8051は、DPTRで指定されたアドレスを使用して外部メモリにアクセスするために使用します。 DPTRは、使用可能な唯一の16ビットレジスタであり、2バイト値を格納するためによく使用されます。
プログラムカウンター
プログラムカウンタ(PC)は2バイトのアドレスで、8051にメモリ内の次の実行命令の場所を伝えます。 PCは、8051が初期化されると0000hから始まり、命令が実行されるたびにインクリメントされます。 PCは常に1ずつ増加するわけではありません。 命令によっては2または3バイトが必要な場合があります。そのような場合、PCは2または3ずつ増加します。
分岐、ジャンプ、および*割り込み*操作は、次の連続する場所以外のアドレスでプログラムカウンターをロードします。 パワーオンリセットをアクティブにすると、レジスタ内のすべての値が失われます。 これは、リセット時にPCの値が0になり、CPUがROMロケーション0000から最初のオペコードをフェッチすることを強制することを意味します。 これは、CPUが最初の命令を見つけることを期待する場所であるため、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の一部のファミリーメンバーは、オンチップROMが4Kバイトのみです(例: 8751、AT8951); AT89C52のような8K ROMを搭載しているものもあります。また、ダラスセミコンダクタなどの32Kバイトと64KバイトのオンチップROMを搭載したファミリメンバーもいます。 覚えておくべき点は、8051のプログラムカウンターは16ビットレジスタ(0000からFFFFアドレス)であるため、8051ファミリのメンバーは64Kバイトを超えるオペコードにアクセスできないことです。
8051内のプログラムROMの最初の場所は0000Hのアドレスを持ちますが、最後の場所はチップ上のROMのサイズによって異なる場合があります。 8051ファミリメンバのうち、AT8951には、メモリアドレスが0000(最初の場所)から0FFFH(最後の場所)の$ kバイトのオンチップROMがあります。
8051フラグビットとPSWレジスタ
プログラムステータスワード(PSW)レジスタは、フラグレジスタ*とも呼ばれる8ビットのレジスタです。 8ビット幅ですが、使用されるのは6ビットのみです。 2つの未使用ビットは*ユーザー定義フラグ*です。 4つのフラグは*条件付きフラグ*と呼ばれます。これは、命令が実行された後に生じる条件を示すことを意味します。 これら4つは、 *CY (キャリー)、 AC (補助キャリー)、 P (パリティ)、および OV (オーバーフロー)です。 ビットRS0およびRS1は、バンクレジスタを変更するために使用されます。 次の図は、プログラムステータスワードレジスタを示しています。
PSWレジスタには、CPUの現在のステータスを反映するステータスビットが含まれています。
CY | CA | F0 | RS1 | RS0 | OV | - | P |
---|
CY | PSW.7 | Carry Flag |
AC | PSW.6 | Auxiliary Carry Flag |
F0 | PSW.5 | Flag 0 available to user for general purpose. |
RS1 | PSW.4 | Register Bank selector bit 1 |
RS0 | PSW.3 | Register Bank selector bit 0 |
OV | PSW.2 | Overflow Flag |
- | PSW.1 | User definable FLAG |
P | PSW.0 | Parity FLAG. Set/cleared by hardware during instruction cycle to indicate even/odd number of 1 bit in accumulator. |
RS0およびRS1ビットを使用して、対応するレジスタバンクビットを選択できます。
RS1 | RS2 | Register Bank | Address |
---|---|---|---|
0 | 0 | 0 | 00H-07H |
0 | 1 | 1 | 08H-0FH |
1 | 0 | 2 | 10H-17H |
1 | 1 | 3 | 18H-1FH |
- * CY、キャリーフラグ*-このキャリーフラグは、D7ビットからのキャリーアウトがあるたびに(1)セットされます。 8ビットの加算または減算操作後に影響を受けます。 また、「SETB C」および「CLR C」などの命令によって直接1または0にリセットできます。「SETB」はセットビットキャリーを表し、「CLR」はクリアキャリーを表します。
- * AC、補助キャリーフラグ*-ADDまたはSUB操作中にD3およびD4からキャリーがある場合、ACビットが設定されます。それ以外の場合はクリアされます。 これは、2進化10進算術演算を実行する命令に使用されます。
- * P、パリティフラグ*-パリティフラグは、アキュムレータレジスタ内の1の数のみを表します。 Aレジスタに奇数の1が含まれている場合、P = 1。偶数の1の場合、P = 0です。
- * OV、オーバーフローフラグ*-このフラグは、符号付き数値演算の結果が大きすぎて、上位ビットが符号ビットにオーバーフローするたびに設定されます。 符号付き算術演算のエラーを検出するためにのみ使用されます。
例
次の命令で9CHと64Hを追加した後、CY、AC、およびPフラグのステータスを表示します。
MOV A、#9CH
ADD 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