# 内存和内存分段

todo: 字节-位-kb等转换方式 各种进制在汇编中的表示方法 各种进制在代码中的表示方法 bit

总线

cun_01

地址线: 用来寻址 控制线: 告诉内存读还是写 数据线: 用来CPU和内存间传递具体数据(双向,根据读写的不同)

CPU从内存的3号单元读取数据步骤: CPU通过地址线将3传递给内存, 在将读的命令通过控制线传递给内存, 内存最终通过数据线将内存中的3号单位的内容读取出来给CPU cun_02

cun_03

地址总线

  • 内存的最小单元为字节
  • 寻址能力, 比如内存为1M, 就需要地址总线宽度为20, (2的20次方), 内存为4G, 就需要更大的宽度
  • 1个宽度相当于一个导线, 导线只能够传递电信号, 高电平代表1, 低电平代表0, 所以一个导线只能传递1或者0
  • 2^10 = 1KB, 2^20 = 1M (最小为字节)

数据总线

  • 数据总线宽度为16, 16个0或1, 即16位, 一个字节=8位, 所以单次最大传输为2个字节的数据

cun_04

89D8H为16进制, 89D8为2个字节大小, 向内存中写入89D8H

  • 8088数据总线宽度为8, 则它一次性最多传输1个字节(8位)的数据, 所以它第一次传输D8, 第二次传输89
  • 而8086CPU的总线宽度为16, 它一次就可以传输2个字节, 89D8一次性传输就完成了

寻址

  • 一个CPU的寻址能力为8KB, 那么他的地址总线的宽度为 13
  • 8080, 8088, 80286, 80386的地址总线宽度分别为16根, 20根, 24根, 32根, 则它们的寻址能力分别为: 64kb, 1MB, 16MB, 4GB (字节来算) -> 16根:16位的内存地址,即0xFFFF(一个16进制=4个二进制)
  • 8080, 8088, 8086, 80286, 80386的数据总线的宽度分别为8根, 8根, 16根, 16根, 32根, 则他们一次可以传输的数据为1B, 1B, 2B, 2B, 4B(8根=8位=1个字节B)
  • 比如CPU的地址总线的宽度为3, 那么它的传输的排列组合为(000,001,010,011,100,101,110,111), 可以看做内存地址编号(代表一个字节), 所以宽度为3的CPU,最大寻址能力为2^3=8个字节 think

cun_05 RAM(random access memory)即随机存储内存,这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序。ROM(Read-Only Memory)即只读内存,是一种只能读出事先所存数据的固态半导体存储器。

下图为8086CPU的内存图, 最下面的ROM地址空间为只读,向该内存空间中写数据是没有反应的 cun_06 cun_07

8086CPU特殊性

  • 8086CPU最特殊, 后续的所有CPU的CPU位数=地址总线宽度, 没有特殊性
  • 8086CPU是16位结构, 但是地址总线宽度为20位, 就是因为有16位要转成20位,所以只有8086CPU才有段地址和偏移地址的概念, 其他的CPU没有段地址和偏移地址的概念
  • 20为总线宽度, 所以寻址最大的内存为20位即0xFFFFF(20个二进制位), 但是CPU内部存储16位的地址, 所以8086CPU内部有个地址加法器, 产生20位的内存地址 cun_08 cun_09

cun_8086

cun_10

cun_11 cun_12 cun_13

results matching ""

    No results matching ""