8086存储器组织
8086/8088只工作于实模式。只允许CPU在1MB范围内对存储器进行存取操作,DOS操作系统也要求微处理器工作与实模式。
1.段地址和偏移地址
8086/8088共有20根地址总线,可直接寻址的内存空间为2的20次方=1MB字节单元,地址范围00000~FFFFFH,每个单元都有一个绝对地址,称为物理地址,CPU访问存储单元时,必须先确定物理地址,才能实现对该单元的存取操作。
两个寄存器形成一个20位的地址
段地址或段基地址 偏移地址或偏移量
表示形式 段地址:偏移地址 这种地址又叫做逻辑地址
16进制 16
在形成20位物理地址时,段寄存器16位数自动左移4位(1位16进制位)使最低的4位为0,然后与16位的偏移地址相加,形成20位物理地址
物理地址=段地址*10H+偏移地址
列如,段寄存器CS=1120H,指令指针IP=2008H,则逻辑地址表示为CS:IP=1120H:2008H,物理地址则为1120H*10H+2008H=13208H。
起始地址 结束地址
设段基地址为1000H,则该段的起始地址为1000H*16=10000H,偏移地址范围0000~FFFFH,表示段的起始位置到所选单元格的距离。由于一个段的长度为64KB,所以该段末地址为1000H*16+FFFFH=1FFFFH
在实模式中,在每个段基地址的最右边增加一个0H,形成一个20位物理地址,作为访问存储器的起点,在此后的64KB地址作为一个逻辑段。
如段基地址1200H,则从12000H处开始寻址64KB,
实模式的段只能从能被16整除的那些位置开始,也就是说从能被16整除的那些内存单元开始分段。
一个物理地址可以有不同逻辑地址来形成。
如:物理地址12560H 其逻辑地址有:
1200H:0560H
1250H:0060H
1000H:2560H
等
这说明12000H偏移560H单元和12500H偏移60H单元等。指向的是同一个内存单元。
2.默认段寄存器和偏移地址寄存器
8086cpu中有一套规则。
代码段寄存器CS总是和指令寄存器IP组合在一起,寻址下一条要执行指令的字节单元;
堆栈寄存器SS和SP(栈操作指针寄存器).BP(源地址)组合,寻址存储器堆栈段中的数据;
数据段寄存器DS和BX(基址寄存器).SI(源变址寄存器).DI(目标变址寄存器)组合,寻址数据段中的8位或16位数据;
附加段寄存器ES和DI组合寻址,目的串地址
通过段超越前缀可以对某些隐含规则进行修改。
3.堆栈的设置和操作
堆栈是在存储器里开辟出来的一个特定的数据区域,称为堆栈段。
用于存放暂时保存的数据。如:调用子程序时的返回地址,中断处理时的断点及现在信息等。
堆栈也采用段地址和偏移地址的组合来寻址。
堆栈的位置和长度由堆栈段寄存器ss和堆栈指针sp来设定。 给定一个ss:sp,就设置了一个堆栈,其最大容量为64KB.
堆栈的设置
SP始终指向当前堆栈的栈顶,当堆栈为空时,SP也指向栈底。栈底指向的单元不能存放堆栈数据
对堆栈的操作按先进后出的原则进行,操作方式有PUSH(压入)和POP(弹出)两种,以字为单位进行,但不能超出范围,如果超出将产生溢出错误。
PUSH操作压入一个字,SP<-SP-2.如AX=1234H,BX=5678H执行PUSH AX 和PUSH BX,并使得sp=12FCH(2.6(b)),再执行POP DX指令,则
DX=5678H SP=12FEH
通过BP指针也可在堆栈中获取数据,或向堆栈存入数据。
注意:堆栈中的数据要保证低字节数据在偶地址单元中,高字节数据在奇地址单元中。
堆栈操作中,堆内数据未变化变化的是sp指针的位置和内容。
4.段加偏移量寻址机制允许重定位
允许程序或数据在存储器内重定位。
重定位指的是一个程序或数据块可以放到存储器的任意有效区域。
可重定位程序是指一个可以存放在存储器的任意区域,不加修改就可以执行的程序。
可重定位的数据指一个可以存放在存储器的任意区域,不加修改就可以被程序引用的数据。