6.1.3 堆栈段的说明
优质
小牛编辑
134浏览
2023-12-01
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节中的叙述。