111111
精灵王
精灵王
  • 注册日期2010-12-08
  • 发帖数640
  • QQ
  • 火币1103枚
  • 粉丝120
  • 关注75
  • 社区明星
阅读:2245回复:0

经典汇编语言教程:6.1.3 堆栈段的说明

楼主#
更多 发布于:2013-01-25 15:09

堆栈段是一个特殊的段,在程序中可以定义它,也可以不定义。除了要生成COM型执行文件的源程序外,一个完整的源程序一般最好定义堆栈段。如果在程序中不定义堆栈段,那么,操作系统在装入该执行程序时将自动为其指定一个64K字节的堆栈段。
在程序没有定义堆栈段的情况下,在由连接程序生成执行文件时,将会产生一条如下的警告信息,但程序员可以不理会它,所生成的执行文件是可以正常运行的。
warning xxxx: no stack segment  (其中:xxxx是错误号)
在源程序中,可用以下方法来定义堆栈段。
方法1:
STACK1SEGMENT
DB 256 DUP(?) ;256是堆栈的长度,可根据需要进行改变
TOPLABEL  WORD
STACK1ENDS

以上堆栈段的定义如图6.1所示。由于堆栈是按地址从大到小的存储单元顺序来存放内容的,所以,在堆栈存储单元说明语句之后,再说明一个栈顶别名,这样,对栈顶寄存器SP的赋值就很方便。
在源程序的代码段中,还要添加如下程序段,才能把段STACK1当作堆栈段来使用。


图6.1 堆栈段定义示意图
ASSUMESS:STACK1;可在代码段的段指定语句中一起说明
CLI;禁止响应可屏蔽中断
MOVAX, STACK1
MOVSS, AX
MOVSP, offset TOP;给堆栈段的栈顶寄存器SP赋初值
STI;恢复响应可屏蔽中断
方法2:
STACK1SEGMENT STACK;定义一个堆栈段,其段名为STACK1
DB 256 DUP(?)
STACK1ENDS

上述段定义说明了该段是堆栈段,系统会自动把段寄存器SS和栈顶寄存器SP与该堆栈段之间建立相应的关系,并设置其初值,而不用在代码段对它们进行赋值。
除了以上二种方法外,还有一种更简洁的方法来定义堆栈段,有关内容请见第6.4.2节中的叙述。

喜欢0 评分0
游客

返回顶部