目录
老是记不住,摘自杨季文老师的《80X86汇编语言程序设计教程》
段的完整定义
1. 一般格式
完整段定义的一般格式如下:
段名 SEGMENT [定位类型] [组合类型] ['类别']
语句
......
段名 ENDS
段开始语句SEGMENT
中的可选项定位类型
、组合类型
和类别
2. 定位类型
定位类型表示出当前段对起始地址的要求,从而指示连接程序如何衔接相邻两段。
一般情况下(80386以下)缺省的定位类型是PARA,即段起始地址位于可用的第一个节(每节为16个字节)的边界处。
3. 组合类型
组合类型就是用于通知连接程序,如何把不同模块内段名相同的段组合到一起。C里面,默认都是PUBLIC
(1) PUBLIC
组合类型PUBLIC表示当前段与其它模块中组合类型为PUBLIC的同名段组合成一个段。
(2) COMMON
组合类型COMMON表示当前段与其它模块中的同名段重叠,即起始地址相同。地址重叠部分,数据会被覆盖
(3) STACK
组合类型STACK表示当前段是堆栈段,组合情况与PUBLIC相同。
当把某个段的组合类型指定为STACK时,这个段就被指定为堆栈段了。也就是说,组合类型STACK不仅是某种组合类型,而且能够表示当前段是堆栈段。
LINK程序会把组合类型为STACK的段的有关信息写入可执行程序文件中。于是在执行该程序时,操作系统的装入程序就能根据这些信息自动设置寄存器SS和SP,从而构成物理堆栈。设置的SS值是组合类型为STACK的段的段值,设置的SP值是堆栈段的大小,即SS:SP指向堆栈尾。
无论在程序中是否说明堆栈段,只要需要,都可通过重置寄存器SS和SP来切换堆栈,从而建立合适的新堆栈。
(4) MEMORY
组合类型MEMORY与组合类型PUBLIC相同,为兼容而设。
(6) PRIVATE
组合类型PRIVATE表示不与其它段组合。宏汇编程序MASM不识别此关键字。
4. 类别
类别用于表示段的分类。LINK程序总是使类别相同的段相邻。实际上只有类别相同的同名段才根据组合类型进行组合。
类别是一个由程序员指定的字符串,但必须用单引号括起。如果一个段没有给出类别,那么这个段的类别就为空。
段的简化定义
1.存储模型说明伪指令
存储模型说明伪指令的简单格式如下:
MODEL 存储模型
注意该伪指令以符号点.
引导。例如,为了说明采用SMALL存储模型,只要在源程序首使用如下伪指令:
.MODEL SMALL
到32位CPU后,默认的都是FLAT(平坦)模型,即所有的数据都在一个段内
2.简化的段定义伪指令
(1) 定义代码段的伪指令
定义代码段的伪指令如下,它表示一个代码段的开始:
.CODE
伪指令.CODE说明代码段的开始,伪指令END说明段结束。
简化的段定义伪指令说明一个段的开始,同时也表示上一个段的结束。伪指令END说明最后一个段的结束。
(2) 定义堆栈段的伪指令
定义堆栈段的伪指令一般格式如下,它表示一个堆栈段的开始
.STACK [大小]
可选的“大小”说明堆栈的字节数,若没有指定堆栈大小,则采用缺省值1024。如下的伪指令就表示定义一个2KB的堆栈。
.STACK 2048
通常只有在编写纯粹的汇编语言程序时才需要定义堆栈。
(3) 定义数据段的伪指令
定义(初始化)数据段的伪指令如下,它表示数据段的开始:
.DATA
2. 缺省段名
在使用简化的段定义伪指令说明各段后,程序员一般不需要知道这些段的段名和它们的定位类型、组合类型等。但如果想把简化的段定义伪指令与标准的段定义伪指令混合使用,那么就需要知道这些内容了。
3.存储模型说明伪指令的隐含动作
1.隐含的段组和段设定
存储模型说明伪指令,.MODEL
,除了说明程序采用的存储模型外,还起着相当于如下语句的作用:
DGROUP GROUP DATA,CONST,BSS,STACK
ASSUME CS:TEXT,DS:DGROUP,SS:DGROUP
它指示汇编程序把可能有的段_DATA、段CONST、段BSS和段STACK集合成一个名为DGROUP的段组,同时指示汇编程序把数据段寄存器DS和堆栈段寄存器SS与段组DGROUP对应,使代码段寄存器CS与代码段对应。
由于伪指令.MODEL
的上述隐含动作,所以在使用伪指令.MODEL后,可以直接引用段组DGROUP,而且多数情况下也可以不使用伪指令ASSUME
2. 有关的预定义符
在上述程序片段中使用的符号@CODE等是汇编程序提供的若干预定义符。它们类似于用伪指令EQU所定义的符号。与简化的段定义伪指令相关的一些预定义符号有:
- 符号@CODE表示代码段的段名。
- 符号@DATA表示由.DATA段和.STACK段等集合而成段组的组名。
- 符号@FARDATA表示独立数据段的段名。
完整定义参数的直观展示
定位类型
byte:使用下一个可用字节的地址
para:使用下一个可用字地址
组合类型
pubilc:同名段组合成一个段
common:当前段与其它模块中的同名段重叠,即起始地址相同。地址重叠部分,数据会被覆盖