汇编语言 - 段的综述
以下内容摘自 汇编语言(第3版):
我们可以将一段内存定义为一个段, 用一个段地址指示段, 用偏移地址访问段内的单元. 这完全是我们自己的安排.
我们可以用一个段存放数据, 将他定义为"数据段";
我们可以用一个段存放代码, 将他定义为"代码段";
我们可以用一个段当做栈, 将他定义为"栈段".
我们可以这样安排, 但若要让CPU按照我们的安排来访问这些段, 就要:
对于数据段, 将他的段地址放在DS中, 用mov, add, sub等访问内存单元的指令时, CPU就将我们定义的数据段中的内容当做数据来访问.
对于代码段, 将他的段地址放在CS中, 将段中第一条指令的偏移地址放在IP中, 这样CPU就将执行我们定义在代码段中的指令;
对于栈段, 将他的段地址放在SS中, 将栈顶单元的偏移地址放在SP中, 这样CPU在需要进行栈操作的时候, 比如执行push, pop指令等, 就将我们定义的栈段当做栈空间来用.
可见, 不管我们如何安排, CPU将内存中的某段内容当做代码, 是因CS:IP指向了那里; CPU将某段内存当做栈, 是因为SS:SP指向了那里. 我们一定要清楚, 什么是我们的安排, 以及如何让CPU按我们的安排行事. 要非常清楚CPU的工作机理, 才能在控制CPU按照我们的安排运行的时候做到游刃有余.
比如我们将 10000H~1001FH 安排为代码段, 并在里面存储如下代码:
mov ax, 1000
mov ss, ax
mov sp, 0020
mov ax, cs
mov ds, ax
mov ax, [0]
add ax, [2]
mov bx, [4]
add bx, [6]
push ax
push bx
pop ax
pop bx
设置 CS=1000H, IP=0, 这段代码将得到执行. 可以看到, 在这段代码中, 我们又将10000H~1001FH安排为栈断和数据段. 10000H~1001FH这段内存, 即是代码段, 又是栈段和数据段.
一段内存, 可以即是代码的存储空间, 又是数据的存储空间, 还可以是栈空间, 也可以什么也不是. 关键在于CPU中寄存器的设置, 即 CS, IP, SS, SP, DS的指向.