6.1.3 堆栈段的说明

堆栈段是一个特殊的段,在程序中可以定义它,也可以不定义。除了要生成COM型执行文件的源程序外,一个完整的源程序一般最好定义堆栈段。如果在程序中不定义堆栈段,那么,操作系统在装入该执行程序时将自动为其指定一个64K字节的堆栈段。

在程序没有定义堆栈段的情况下,在由连接程序生成执行文件时,将会产生一条如下的警告信息,但程序员可以不理会它,所生成的执行文件是可以正常运行的。

warning xxxx: no stack segment  (其中:xxxx是错误号)

在源程序中,可用以下方法来定义堆栈段。

方法1:

STACK1 SEGMENT
DB 256 DUP(?)  ;256是堆栈的长度,可根据需要进行改变
TOP LABEL  WORD
STACK1 ENDS

以上堆栈段的定义如图6.1所示。由于堆栈是按地址从大到小的存储单元顺序来存放内容的,所以,在堆栈存储单元说明语句之后,再说明一个栈顶别名,这样,对栈顶寄存器SP的赋值就很方便。

在源程序的代码段中,还要添加如下程序段,才能把段STACK1当作堆栈段来使用。

图6.1 堆栈段定义示意图

ASSUME SS:STACK1 ;可在代码段的段指定语句中一起说明
CLI ;禁止响应可屏蔽中断
MOV AX, STACK1
MOV SS, AX
MOV SP, offset TOP ;给堆栈段的栈顶寄存器SP赋初值
STI ;恢复响应可屏蔽中断

方法2:

STACK1 SEGMENT STACK ;定义一个堆栈段,其段名为STACK1
  DB 256 DUP(?)
STACK1 ENDS

上述段定义说明了该段是堆栈段,系统会自动把段寄存器SS和栈顶寄存器SP与该堆栈段之间建立相应的关系,并设置其初值,而不用在代码段对它们进行赋值。

除了以上二种方法外,还有一种更简洁的方法来定义堆栈段,有关内容请见第6.4.2节中的叙述。