灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2427回复:0

堆栈段的说明

楼主#
更多 发布于:2012-09-10 18:57

堆栈段是一个特殊的段,在程序中可以定义它,也可以不定义。除了要生成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
游客

返回顶部