我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元,可以用分段的方式来管理内存。
用一个段存放数据,将它定义为“数据段”;
用一个段存放代码,将它定义为“代码段”;
用一个段当作栈,将它定义为“栈段”。
注意:
一个段的起始地址一定是16的倍数;
偏移地址为16位,变化范围为0-FFFFH,所以一个段的长度最大为64KB。
CPU可以用不同的段地址和偏移地址形成同一个物理地址。
段寄存器:8086CPU有4个段寄存器:CS、DS、SS、ES,提供内存单元的段地址。
1、CS和IP
CS为代码段寄存器,IP为指令指针寄存器,
CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,
CPU将CS:IP指向的内容当作指令执行。(即PC)
8086CPU的工作过程简要描述
从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
IP=IP+所读取指令的长度,从而指向下一条指令;
执行指令。转到步骤1,重复这个过程。
在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC机刚启动时,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。
8086CPU提供转移指令修改CS、IP的内容。
jmp 段地址:偏移地址:用指令中给出的段地址修改CS,偏移地址修改IP。如:jmp 2AE3:3
jmp 某一合法寄存器:仅修改IP的内容。如:jmp ax。在含义上好似:mov IP,ax
8086CPU不支持将数据直接送入段寄存器的操作,这属于8086CPU硬件设计
2、DS 和 [address]
DS寄存器:通常用来存放要访问数据的段地址
[address]表示一个偏移地址为address的内存单元,段地址默认放在ds中
通过数据段段地址和偏移地址即可定位内存单元。
mov bx, 1000H ;8086CPU不支持将数据直接送入段寄存器的操作
mov ds, bx ;ds存放数据段地址
mov [0], al ;将al数据(1字节)存到1000H段的0偏移地址处,即10000H
mov ax, [2] ;将数据段偏移地址2处的一个字(8086为2字节)存放到ax寄存器
add cx, [4] ;将偏移地址4处的一个字数据加上cx寄存器数据放到cx寄存器
sub dx, [6] ;dx寄存器数据减去数据段偏移地址6处的字数据存到dx
例子:
mov ax, 1000H
mov ss, ax
mov sp, 0010H ;初始化栈顶
mov ax, 001AH
mov bx, 001BH
push ax
push bx ;ax、bx入栈
sub ax, ax ;将ax清零,也可以用mov ax,0,
;sub ax,ax的机器码为2个字节,
;mov ax,0的机器码为3个字节。
sub bx, bx
pop bx ;从栈中恢复ax、bx原来的数据
pop ax ;