2

8086 CPU には 16 ビットのデータ バスがあり、Pentium CPU には 32 ビットのデータ バスがあることを知りました。これは、各メモリ アドレスがデータ バスのサイズを保持することを意味します。

例えば:

16bit = 2^16 = 65,536 
binary 0000 0000 0000 0000 ~ 1111 1111 1111 1111
hex    0000 0000 ~ FFFF FFFF
dec    000,000 ~ 65,535

65,536 / 1024 = 64 so can be 64kbyte of maximum memory address.
like 0x 0000,0000 ~ 0x FFFF,FFFF  


32bit = 2^32 = 4,294,967,296
binary 0000 0000 0000 0000 0000 0000 0000 0000 
~ 1111 1111 1111 1111 1111 1111 1111 1111
hex    0000 0000 0000 0000 ~ FFFF FFFF FFFF FFFF
dec    0,000,000,000 ~ 4,294,967,296

4,294,967,296 / 1024 / 1024 = 4 so can be 4mb of maximum memory address 
like 0x 0000,0000,0000,0000 ~ 0x FFFF,FFFF,FFFF,FFFF

私は正しいですか?そう思います。しかし、C プログラミングでは:

int arr[2];
printf("%p %p \n", &arr[0],&arr[1]);
-----------------------------------
0x 7fff5c474b20,  0x 7fff5c474b24  (this is 64bit addressing)

整数が4バイトであることは知っています。のサイズは、&arr[1]-&arr[0]すべての0x4アドレスが 8 ビットのデータ バスのみを保持することを意味します。

CPU が 8 ビット以上を保持できるのに、なぜ C は 8 ビットしか保持できないのですか?

4

2 に答える 2

5

おっと... 物事はあなたが書いたものと正確には異なります.8086について話します. あなたはウィキペディアでそれに関するより多くの参照を見つけるでしょう)

  • データバスは 16 ビット幅です。つまり、1 回の操作で 2 バイトを転送できます。
  • アドレスですが、20 ビット幅です。つまり、メモリ アドレスの範囲は 0 ~ 0xFFFFF または 1M です。

8086 はベースのアドレッシング モードを使用しました。アドレスはセグメント (16 ビット レジスタ) とオフセットで表され、実際のアドレスはsegment * 16 + offset- ところで、アドレスは異なる表現を持っていました。 0020

そして... 8086 には 64 ビットのアドレス指定モードがありませんでした!

あなたの実際の質問のために、Cはアドレス指定可能な最小のメモリが文字またはバイトであること、および単一の文字がCソースで使用されるアルファベットの任意の文字を含むことを指定します(大文字と小文字、数字、およびいくつかの記号など)少なくとも 7 ビット)。一般的なプロセッサ (私が知っている限り) は、バス サイズに関係なく、8 ビットのバイト アドレッシングを使用します。つまり、連続したアドレスは、連続したバイトのアドレスです。

データ バスが 16、32、または 64 ビット幅であるという事実により、1 回のメモリ アクセスで 1 回の操作でそれぞれ 2、4、または 8 バイトをロードできます。一部のプロセッサ (ARM など) では、複数バイトのメモリ アクセスを正しく配置する必要があります。たとえば、偶数アドレスでのみ 16 ビット ワードを読み取ることができ、奇数アドレスから 16 ビットを読み取ろうとすると、プロセッサ トラップが発生します。 .

また、プロセッサの設計者がデータ バスとアドレス バスを同じサイズにすることを強制するものは何もないこと (単純さを除いて) を覚えておいてください。

于 2016-07-11T09:49:39.840 に答える
2

x86 では、個別の各アドレスが 8 ビットのバイトをアドレス指定します。

データ バス幅は、プロセッサがその数のビットを並行してフェッチできることを意味します。実際、Pentium プロセッサには 64 ビット データ バスがあります (ただし、486 マザーボードにインストールできるオーバードライブ プロセッサは 32 ビット バスです)、8 つの連続する 8 ビット バイトを同時にフェッチできます。

たとえば、プロセッサがアドレス 0x00001230 のメモリ読み取りを発行した場合、アドレス 0x00001230 から 0x00001237 (8 バイト) のバイトを同時に内部キャッシュにフェッチできます。

于 2016-07-11T09:48:14.180 に答える