代码之家  ›  专栏  ›  技术社区  ›  Jeungwoo Park

数据总线与寻址内存混淆

  •  2
  • Jeungwoo Park  · 技术社区  · 8 年前

    我了解到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位?

    2 回复  |  直到 8 年前
        1
  •  5
  •   Serge Ballesta    8 年前

    哎哟…事情并不是你写的那样-我说的是8086(我已经长大了,可以用它工作了…)。您将在上找到更多参考资料 wikipedia )

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

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

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

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

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

        2
  •  2
  •   Antti Haapala -- Слава Україні    8 年前

    在x86上,每个不同 住址 地址a 字节 共8位。

    实际上,奔腾处理器有一条64位数据总线(可以安装到486个主板上的超速处理器有32位总线),因此它们可以同时获取8个连续的8位字节。

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