2

我了解到 8086 CPU 有 16 位数据总线,奔腾 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

Oups...事情与您所写的不完全一样-我说的是8086(我已经足够大了,可以使用它...)。你会在维基百科上找到更多的参考资料)

  • 数据总线为16 位宽,这意味着可以在一次操作中传输 2 个字节
  • 地址但为20 位宽,这意味着内存地址在 0 - 0xFFFFF 或 1M 范围内

8086 使用的基于寻址模式:地址由段(16 位寄存器)和偏移量表示,实际地址是segment * 16 + offset- 顺便说一句,地址有不同的表示,例如 0x20010 可以表示为 2000:0010 或 2001:0000 1FFF: 0020

而且... 8086 上没有 64 位寻址模式!

现在对于您的实际问题,C 指定最小的可寻址内存应为字符或字节,并且单个字符应包含使用的字母表中的任何字符是 C 源(大写和小写字母、数字和一些符号)至少 7 位)。通用处理器(我所知道的)使用 8 位字节寻址,与总线大小无关。这意味着连续地址是连续字节的地址。

数据总线为 16、32 或 64 位宽这一事实仅允许单个内存访问在单个操作中分别加载 2、4 或 8 个字节。某些处理器(例如 ARM)需要正确对齐多字节内存访问:例如,您只能在偶数地址上读取 16 位字,任何从奇数地址读取 16 位工作的尝试都将导致处理器陷阱.

请记住,没有什么(除了简单性)迫使处理器设计人员拥有相同大小的数据总线和地址总线。

于 2016-07-11T09:49:39.840 回答
2

在 x86 上,每个不同的地址寻址一个8 位字节

数据总线宽度意味着处理器可以并行获取那么多位。而且实际上奔腾处理器有一个 64 位数据总线(你可以安装到 486 母板上的过载处理器虽然有 32 位总线),所以它们可以同时获取 8 个连续的 8 位字节。

例如,如果处理器对地址 0x00001230 进行内存读取,它可以同时将地址 0x00001230 到 0x00001237(8 个字节)的字节提取到其内部缓存中。

于 2016-07-11T09:48:14.180 回答