欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

汇编语言 - 段的综述

程序员文章站 2024-02-01 19:02:22
...

以下内容摘自 汇编语言(第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的指向.