web-dev-qa-db-ja.com

8086/8088にはいくつのレジスタがありますか?

コンピュータアーキテクチャのコースを受講しましたが、プロセッサには32ビットごとに32個のレジスタがあることがわかりました。今私は8086が 8レジスタのみ を持っていることを読んだコンピュータアーキテクチャコースを勉強しています。しかし、私が読んだ本と this ウェブサイトには多くの記録があります。 8086と8088のレジスタについて混乱しています。手伝ってください。

注意:

さまざまなプロセッサのさまざまなレジスタサイズをよく理解しています。レジスターの数に戸惑っています。

8
fuddin

8086および8088は16ビットプロセッサです。これらのレジスタの幅はそれぞれ16ビットです。 (いくつかの命令は、DXとAXの組み合わせをdiv入力やmul出力のように32ビット整数として扱います。)

8086には16ビットのデータバスがあることに注意してください。 8088には8ビットのデータバスがあります。 (したがって、16ビットワードのロード/保存には2バスサイクルかかります。アドレスは両方とも20ビットのままです。)

汎用レジスター

8086 CPUには8つの汎用レジスタがあり、各レジ​​スタには独自の名前があります。

AX-アキュムレータレジスタ(AH/ALに分割):

Generates shortest machine code: short-form encodings exist
Arithmetic, logic and data transfer
One number must be in AL or AX
Multiplication & Division
Input & Output

BX-ベースアドレスレジスタ(BH/BLに分割)。

Offset address relative to DS by default

CX-カウントレジスタ(CH/CLに分割):

The LOOP instruction uses it implicitly as a counter
Repetitive operations on strings with the REP command
Count (in CL) of bits to shift and rotate

DX-データレジスタ(DH/DLに分割):

DX:AX concatenated into 32-bit register for some MUL and DIV operations
Specifying ports in some IN and OUT operations

SI-ソースインデックスレジスタ:

Can be used for pointer addressing of data
Used as source in some string processing instructions
Offset address relative to DS by default

DI-宛先インデックスレジスタ:

Can be used for pointer addressing of data
Used as destination in some string processing instructions as ES:DI
Offset address relative to DS outside of string instructions

BP-ベースポインタ:

Primarily used to access parameters and locals on the stack
Offset address relative to SS

SP-スタックポインタ:

Always points to top item on the stack
Offset address relative to SS (but can't be used in 16-bit addressing modes)
Should always points to Word (byte at even address)
An empty stack will have SP = FFFEh

セグメントレジスタ

  • CS-現在のプログラムを含むセグメントを指します。
  • DS-通常、変数が定義されているセグメントを指します。
  • ES-追加のセグメントレジスタ。使用法を定義するのはコーダー次第です。
  • SS-スタックを含むセグメントを指します。

セグメントレジスタに任意のデータを格納することは可能ですが、これは決して良い考えではありません。セグメントレジスタには、アクセス可能なメモリブロックを指すという非常に特別な目的があります。

セグメントレジスタは、汎用レジスタと連携して任意のメモリ値にアクセスします。たとえば、物理アドレス12345h(16進数)のメモリにアクセスする場合は、DS = 1230hおよびSI = 0045hに設定できます。このようにして、20ビットの線形アドレスを形成できます。単一のレジスタで16ビットだけではなく(これは実モードで適用されます。プロテクトモードではセグメンテーションが異なります)。

CPUは、セグメントレジスタに10hを乗算し、それに汎用レジスタを追加することにより、物理アドレスの計算を行います(1230h * 10h + 45h = 12345h)。

2つのレジスタで構成されるアドレスを実効アドレスと呼びます。
デフォルトでは、BX、SI、およびDIレジスタはDSセグメントレジスタ;
BPおよびSP SSセグメントレジスタで動作します。
他の汎用レジスタは実効アドレスを形成できません。
また、BXは有効なアドレスを形成できますが、BHとBLはできません。

特別な目的の登録者

IP-命令ポインタ:

Always points to next instruction to be executed
Offset address relative to CS

IPレジスタは常にCSセグメントレジスタと連動し、現在実行中の命令を指します。

FLAGS REGISTER

フラグレジスタ-プロセッサの現在の状態を決定します。これらは、数学演算の後にCPUによって自動的に変更されます。これにより、結果のタイプを判別し、プログラムの他の部分に制御を移す条件を判別できます。通常、これらのレジスタに直接アクセスすることはできません。

Carry Flag (CF) - this flag is set to 1 when there is an unsigned overflow. For example when you add bytes 255 + 1 (result is not in range 0...255). When there is no overflow this flag is set to 0.
Parity Flag (PF) - this flag is set to 1 when there is even number of one bits in (the low 8 bits of a) result, and to 0 when there is odd number of one bits. 
Auxiliary Flag (AF) - set to 1 when there is an unsigned overflow (carry-out) for low nibble (4 bits).
Zero Flag (ZF) - set to 1 when result is zero. For non-zero result this flag is set to 0.
Sign Flag (SF) - set to 1 when result is negative. When result is positive it is set to 0. (This flag takes the value of the most significant bit.)
Trap Flag (TF) - Used for on-chip debugging.
Interrupt enable Flag (IF) - when this flag is set to 1 CPU reacts to interrupts from external devices.
Direction Flag (DF) - this flag is used by some instructions to process arrays.  When this flag is set to 0 the processing is done forward, when this flag is set to 1 the processing is done backward.
Overflow Flag (OF) - set to 1 when there is a signed overflow. For example, when you add bytes 100 + 50 (result is not in range -128...127). 
30
KevinDTimm

8086には14個の16ビットレジスタがあります。 AX、BX、CX、DX、SI、DI、BP、SP、CS、DS、SS、ES、IP、およびフラグレジスタ。最後の2つは、間接的にのみアクセスされます。

3
user1157391

コンピュータアーキテクチャのコースを受講しましたが、プロセッサには32ビットごとに32個のレジスタがあることがわかりました。

これはあなたの質問に答えませんが、他のエンジニアと通信したい場合は、適切な言語を使用する必要があります。 「(一部の)プロセッサには32ビットサイズの32個のレジスタがある」と言っても、どこにも行き着きません。プロセッサの数は無数にあります。

8086には、スタックポインタを含むが、命令ポインタ、フラグレジスタ、およびセグメントレジスタを除く8つの(多かれ少なかれ一般的な)16ビットレジスタがありました。それらのうちの4つ(AX、BX、CX、DX)も2倍の8ビットレジスタ(図を参照)にアクセスでき、他の4つ(BP、SI、DI、SP)は16ビットのみでした。

混乱はウィキペディアのこの文から来ていると思います。あなたが読んだ両方の情報源は正しいです。 8つの一般的な目的のレジスタがあります(記事では「多かれ少なかれ一般的」と記載されていますが、誰がそれを書くことができるかわかりません)、それらはAX BX CXDXとSIDI BPSPです。セグメントレジスタ、特別な目的のレジスタ、フラグレジスタもあります(これらは「除外」ワードの後に​​記載されています。これは、「レジスタがあります。これらを除外すると、8つあります」と読み替えられると思われます。 3グループ」、あいまいです)。

問題は文言にあります。引用された文は紛らわしく、あなたの質問がどこから来ているのかわかります。質問するのは決して痛いことではありませんが、ウィキペディアは信頼できる知識源ではないことを理解する必要があります。混乱した場合は、本を手に取ってください。

3
dreta

コンピュータアーキテクチャの本は、MIPSがかなり単純で教育的であるため、例としてMIPSを使用することがよくあります。 MIPSには32個のレジスタがありますが、これはnotであり、他の32ビットアーキテクチャにも32個のレジスタがあることを意味します。 32ビットは、コンピュータに 2ビットアドレス/ 32ビット整数レジスタ があることを意味するだけです。レジスタの数とはまったく関係ありません。

最も人気のある32ビットアーキテクチャであるARMには16個のレジスタがあります(ただし、ARMv8 64ビットはこの数を2倍の32に増やしました)。 Motoroka68kやSuperHv2/3/4など、他の多くの32ビットアーキテクチャにも32以外のレジスタ番号があり、すべてに16個のレジスタがあります。アーキテクチャのリストについては、 ここ を参照してください。ご覧のとおり、64ビットアーキテクチャに64レジスタがあることはめったにありません。これは、レジスタファイルのサイズが大幅に増加し、コンテキストスイッチが悪化するためです。それらのほとんどには32個のレジスタがあります。

x86は、何十年も前に8086と下位互換性があり、8つの可視整数レジスタしかありません。しかし実際、最近のx86 CPUには数百のレジスタがあり、 レジスタの名前変更 を使用してレジスタ数の制限を克服しています。

2
phuclv