2.8段的概念

内存并没有分段,短的划分来自于CPU,由于8086CPU用“段地址16+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。
l4rd58.jpg
看需要我们可以将若干地址连续的内存单元看作一个段
(1)段地址
16必然是16的倍数,所以一个段的起始地址也一定是16的倍数
(2)偏移地址为16位,16位地址的寻址能力为64k,所以一个段的长度最大为64k
寻址范围:
偏移地址16位,变化范围为0FFFFH,仅用偏移地址来寻址最多可寻64K个内存单元。
给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000H
1FFFFH
数据在21F60H内存单元中,对于8086PC机的两种描述:
1.数据存在内存2000:1F60单元中
2.数据存在内存的2000段中的1F60H单元中

2.9段寄存器

段寄存器就是提供段地址的
8086CPU有4个段寄存器:
CS,DS,SS,ES
CS 代码段地址寄存器
DS 数据段
SS 堆栈段
ES 附加段

当8086CPU要访问内存时,由这4个寄存器提供内存单元的段地址
IP为指令指针寄存器(与上网的不同)
CS和IP时8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。
** CS存放指令的段地地址 **
** IP存放指令的偏移地址 **
l4r0PS.jpg
B8是mov ax的意思
23 01是存储的数据 线性上低下高
有的是3个字节,有的是2个字节
步骤一、从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲区;
步骤二、IP=IP+所读指令的长度(图中mov ax,0123H为三字节),从而指向下一条指令;
步骤三、执行指令。转到步骤一
8086CPU启动或复位后CS和IP被设置为CS=FFFFH,IP=0000H
8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行
FFFF0H单元中的指令是8086PC机开机后执行的第一条指令

2.10

内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过

2.11修改CS、IP的指令

jmp 段地址:偏移地址
jmp 2AE3:3 (2AE33)
jmp 3:0B16 (00B46H)
jmp 某一合法寄存器
jmp ax (类似 mov IP,ax)
jmp bx
功能:用寄存器中的值修改IP

2.12代码段

对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。
可以将长度为N(N<=64KB)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。
要执行代码段,需要CPU认CS:IP指向的内存单元中的内容为指令
所以要将CS:IP指向所定义的代码段中的第一条指令的首地址

蓝屏一般是内存问题

sub ax,ax相当于对ax清零。这种减法操作比直接用mov ax,0更快。