ASM16

存储器组织与段寄存器

  • 寄存器是微处理器内部暂存数据的存储单元,以名称表示
  • 存储器则是微处理器外部存放程序及其数据的空间
  • 程序及其数据可以长久存放在外存,在程序需要时才进入主存
  • 主存需要利用地址区别

数据信息的表达单位

  • 计算机中信息的单位

    • 二进制位Bit:存储一位二进制数:0或1
    • 字节Byte:8个二进制位,D7~D0
    • 字Word:16位,2个字节,D15~D0
    • 双字DWord:32位,4个字节,D31~D0
  • 最低有效位LSB:数据的最低位,D0

  • 最高有效位MSB:数据的最高位,对应字节、字、双字分别指D7、D15、D31

存储单位及其存储内容

  • 每个存储单元都有一个编号,被称为存储器地址
  • 每个存储单位存放一个字节的内容

img

多字节数据存放方式

  • 多字节数据在存储器中占连续的多个存储单元:
    • 存放时,低字节存入低地址,高字节存入高地址;
    • 表达时,用它的低地址表示多字节数据占据的地址空间。

img

  • 80x86处理器采用“低对低、高对高”的存储形式,被称为“小端方式Little Endian”
  • 相对应还存在“大端方式Big Endian”

数据的地址对齐

  • 同一个存储器地址(视具体情况来确定)可以是字节单元地址、字单元地址、双字单元地址等等
  • 字单元安排在偶地址(xxx0B)、双字单元安排在模4地址(xx00B)等,被称为“地址对齐(Align)”
  • 对于不对齐地址的数据,处理器访问时,需要额外的访问存储器时间
  • 应该将数据的地址对齐,以取得较高的存取速度

存储器的分段管理

  • 8086CPU有20条地址线
    • 最大可寻址空间为220=1MB
    • 物理地址范围从00000H~FFFFFH
  • 8086CPU将1MB空间分成许多逻辑段(Segment)
    • 每个段最大限制为64KB
    • 段地址的低4位为0000B
  • 这样一个存储单元除具有一个唯一的物理地址外,还具有多个逻辑地址

物理地址和逻辑地址

  • 对应每个物理存储单元都有一个唯一的20位编号,就是物理地址,从00000H~FFFFFH。
  • 分段后在用户编程时,采用逻辑地址,形式为

img

逻辑地址

  • 段地址说明逻辑段在主存中的起始位置
  • 8086规定段地址必须是模16地址:xxxx0H
  • 省略低4位0000B,段地址就可以用16位数据表示,就能用16位段寄存器表达段地址
  • 偏移地址说明主存单元距离段起始位置的偏移量
  • 每段不超过64KB,偏移地址也可用16位数据表示

物理地址和逻辑地址的转换

  • 将逻辑地址中的段地址左移4位,加上偏移地址就得到20位物理地址
  • 一个物理地址可以有多个逻辑地址

image-20240725163513981

段寄存器和逻辑段

  • 8086有4个16位段寄存器
    • CS(代码段)指明代码段的起始地址
    • SS(堆栈段)指明堆栈段的起始地址
    • DS(数据段)指明数据段的起始地址
    • ES(附加段)指明附加段的起始地址
  • 每个段寄存器用来确定一个逻辑段的起始地址,每种逻辑段均有各自的用途

如何分配各个逻辑段

  • 程序的指令序列必须安排在代码段
  • 程序使用的堆栈一定在堆栈段
  • 程序中的数据默认是安排在数据段,也经常安排在附加段,尤其是串操作的目的区必须是附加段
  • 数据的存放比较灵活,实际上可以存放在任何一种逻辑段中

img

如何分配各个逻辑段

  • 程序的指令序列必须安排在代码段
  • 程序使用的堆栈一定在堆栈段
  • 程序中的数据默认是安排在数据段,也经常安排在附加段,尤其是串操作的目的区必须是附加段
  • 数据的存放比较灵活,实际上可以存放在任何一种逻辑段中

段超越前缀指令

  • 没有指明时,一般的数据访问在DS段;使用BP访问主存,则在SS段
  • 默认的情况允许改变,需要使用段超越前缀指令;8086指令系统中有4个:
    • CS:代码段超越,使用代码段的数据
    • SS:堆栈段超越,使用堆栈段的数据
    • DS:数据段超越,使用数据段的数据
    • ES:附加段超越,使用附加段的数据