回答: 8086 CPU のアドレス範囲は 1MB です。これは、8086 CPU には 20 のアドレス ラインがあり、2^20 は 1024KB、つまり 1MB に相当するためです。ただし、8086 システムでは、命令は 16 ビットのアドレスのみを提供し、アドレス指定に関連するレジスタの長さは 16 ビットのみです。したがって、アドレス範囲は 64KB のみです。 1MB のメモリ空間をアドレス指定できるようにするために、8086 CPU はメモリを 4 つの論理セグメントに分割します。 CPU がメモリにアクセスすると、セグメント レジスタの内容 (セグメント ベース アドレス) が自動的に 4 ビット (バイナリ表現で) 左にシフトされ、セグメント内の 16 ビット アドレス オフセットに加算されて、20 ビットの物理アドレスが形成されます。住所。
セグメント構造メモリでは、各論理アドレスは 16 ビットのセグメント ベース アドレスとオフセット アドレスで構成されます。
物理アドレス: メモリの絶対アドレス (00000H ~ FFFFFH) は、メモリにアクセスする CPU の実際のアドレス指定アドレス (絶対アドレスとも呼ばれます)
16 ビットのセグメント ベース アドレスを 4 ビット左にシフトし (セグメント ベース アドレスの最下位ビットの後に 4 つの「0」を追加することに相当)、オフセット アドレスに加算して物理アドレスを取得します。
物理アドレス=セグメントベースアドレス*16オフセットアドレス
?
セグメント構造メモリでは、各論理アドレスは 16 ビットのセグメント ベース アドレスとオフセット アドレスで構成されます。
物理アドレス: メモリの絶対アドレス (00000H ~ FFFFFH) は、メモリにアクセスする CPU の実際のアドレス指定アドレス (絶対アドレスとも呼ばれます)
16 ビットのセグメント ベース アドレスを 4 ビット左にシフトし (セグメント ベース アドレスの最下位ビットの後に 4 つの「0」を追加することに相当)、オフセット アドレスに加算して物理アドレスを取得します。
物理アドレス=セグメントベースアドレス*16オフセットアドレス
(1/2)アセンブリ言語。 1. 8086/8088 CPU で許可される最大ストレージ容量は (1MB 65520) で、その物理アドレス番号は (00000) から (ffff0 ffff 1=10FFF0)H です。 2. 10 進数の -46 を 16 進数で表すと (0FFD2h または 0D2H)
となります。10 進数 46 の 16 進表現は 2EH
Microsoft Windows XP [バージョン 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\Administrator>デバッグ
-a
0AFE:0100 移動斧、2e
0AFE:0103 xor bx,bx
0AFE:0105 サブ bx、ax
0AFE:0107
-t
AX=002E BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AFE ES=0AFE SS=0AFE CS=0AFE IP=0103 NV UP EI PL NZ NA PO NC
0AFE:0103 31DB XOR BX,BX
-t
AX=002E BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AFE ES=0AFE SS=0AFE CS=0AFE IP=0105 NV UP EI PL ZR NA PE NC
0AFE:0105 29C3 サブ BX、AX
-t
AX=002E BX=FFD2 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AFE ES=0AFE SS=0AFE CS=0AFE IP=0107 NV UP EI NG NZ AC PE CY
0AFE:0107 0029 ADD [BX DI],CH DS:FFD2=00
-
レジスタは 16 ビットです。たとえば、AX、BX、SI、DI はすべて 16 ビットです。レジスタが表現できるアドレス コードは 16 ビットのみです。 2 の 16 乗は 64K に相当します。これは、プログラマがレジスタを介して直接アクセスできるメモリ空間です。 8086/8088 CPU が提供するアドレスバスは 20 ビットで、2 の 20 乗は 1M であり、これが CPU が単独でアクセスできる最大メモリ空間です。
矛盾があります。CPU は 1M のメモリにアクセスできますが、レジスタは 64K のメモリ サイズしか表現できません。したがって、セグメント アドレスとオフセット アドレスの概念が導入されます。この 1M メモリ空間を 64K サイズのセグメントに分割し、どのセグメントかを指定し、このセグメントの先頭に「オフセット アドレス」を追加すると、1M メモリ内の任意の空間にアクセスできるようになりませんか?
セグメントアドレスの取得方法:
たとえば、文字変数 STR
はアセンブリ データ セグメントのどこかで宣言されます。MOV DX、SEG STR
SEG ステートメントにより、STR のセグメントアドレスを取り出して DX に送信できます。
上記の内容がお役に立てば幸いです。以上が8086CPU には 20 のアドレス行があるのに、アドレス可能な最大記憶領域が 1MB しかないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。