一. 段地址
段表示某个范围 / 区间,可以理解为一段地址。更规范的说法是一块地址连续且起始地址为16倍数的存储单元定义为一个段。
之所以是16倍数是因为:物理地址=段地址 * 16 +偏移地址
假设有两个段:10000H ~ 1007FH (段地址为1000H)、10080H ~ 100FFH,段地址为(1008H)。这两个段大小均为80H。-----段地址1000H和1008H,它们之间有什么关系?注意1000H * 10H = 10000H,1008H * 10H = 10080H。所以第二个段起始于10080H,正好是第一个段结束后的下一个字节,第一个段结束于1007FH,1007FH + 1 = 10080H,所以是的,两个段是连续。的。注意10H就是16D
这段我们在编程时就可以根据需要将一块地址连续的存储单元看成一个段,通过 物理地址=段地址 * 16+ 偏移地址 来定位段中的内存。
注意:段地址一定是16的倍数,且段的最大长度为64kb。具体一个段使用多大的长度,是由程序来定义的,上面段的长度为80H (128 字节)
在x86架构中,段地址和偏移地址一起形成物理地址。物理地址的计算是段地址乘以16(或左移4位)加上偏移地址。
段地址的根本作用是:扩展寻址空间,因为早期CPU8086的寄存器是16位的,如果直接使用,只能寻址 2^16 = 64KB 的内存,这远远不够。所以段地址 × 16 + 偏移地址就使CPU的寻址能力从64KB提升到了 2^20 = 1MB。
段地址的核心功能是:组织和隔离内存,段地址为程序提供了一种逻辑上的内存划分方式,使得内存管理更加有序( CS, DS,SS, ES)。
段地址是由CPU的相关部件提供,大多寄存器中有4个段寄存器: CS, DS,SS, ES。当CPU要访问内存时,由他们提供段地址,通过分段来管理内存
---CS (Code Segment):代码段,存放当前正在执行的指令。
---DS (Data Segment):数据段,存放程序的主要数据。
---SS (Stack Segment):堆栈段,存放堆栈数据。
---ES (Extra Segment):附加段,通常用作数据操作的备用段。
二. CS与IP
CS与IP是8086CPU中最关键的两个寄存器。它们指示CPU当前要读取的指令的地址。 CS称之为代码段寄存器,IP为指令指针寄存器。
在8086CPU中,任意时刻设CS中的值为M,IP中的值为N,则CPU将从 M *16 +N地址单元中取出一条指令并执行。也就是说当前指令在哪由CS和IP来决定,表示为CS:IP,下图为CPU通过CS、IP寄存器进行指令操作

上图说明如下:
1)CS的内容为2000H,IP内容为0000H, 说明物料地址为20000H(2000H *10H=20000H 或者2000H * 16=20000H),20000H去寻址对应内存为B8H,通过指令计数器把B8 23 01通过数据总线送到指令缓冲器中,再执行控制器(对应的汇编指令 mov ax,0123H)。
2)内存20000H ~ 20009H内存单元中存放着可执行的机器码
那么上述的状态下程序又是如何执行的呢?
1)CPU从CS:IP指向的存储单元中读取指令,读取的指令进入指令缓冲区。
2)IP=IP + 所读取指令的长度,从而指向下一条指令。 如下一次IP为0003H, 通过地址加法器组成20003H再去寻址对应内存为BBH
3)执行指令。重复1、2步
总结:
1)CS(Code Segment,代码段寄存器):
--- 用于存放当前代码段的段地址。
--- 代码段是内存中存储程序指令的区域。
--- 段地址是20位物理地址的高16位,实际物理地址由CS左移4位(相当于乘以16)加上IP的值得到。
2)IP(Instruction Pointer,指令指针寄存器):
--- 用于存放下一条要执行的指令在代码段内的偏移地址。
--- 它总是与CS寄存器一起使用,形成20位的物理地址,即:物理地址 = (CS << 4) + IP。
--- 当CPU执行一条指令后,IP会自动增加,指向下一条指令。增加的大小取决于已执行指令的长度。
上面讲到了CS段用途是取指令,默认的偏移地址是IP。而其它三个段寄存器不再这里介绍: DS段用途是访问数据,SS段用途是堆栈操作,ES段用途是串操作目标, 它们的默认的偏移地址都不同。