简化段定义伪指令
简化段定义伪指令在说明一个新段即将开始的同时,也说明了上一个段的结束。在本段定义结束时,也不必用伪指令“ENDS”来标识。
具体的伪指令说明形式及其功能描述如下:
1、代码段定义
.CODE
作用:说明其下面的内容是代码段中内容。
2、堆栈段定义
.STACK [堆栈字节数]
其中,“堆栈字节数”可以不写,其缺省值为1024B。
3、数据段定义
.DATA / .DATA? / .CONST
作用:说明其下面的内容是数据段中的变量定义。
在一个源程序中,可以有多个伪指令.DATA定义的数据段,这就好象在源程序中定义多个同段名的数据段一样。
伪指令.DATA?说明下面是一个未初始化数据段的开始,伪指令.CONST说明下面是一个常数数据段的开始。这二条伪指令很少使用,除非在与高级语言编写的程序相结合时,为了遵守高级语言的某些约定,而需要特殊说明时才使用。
汇编程序在处理简化的堆栈段和数据段定义时,它会自动地把伪指令.STACK、.DATA、.DATA?和.CONST所定义的段组合成一个段组。如果想定义一个独立的、不与其它段组合在一起的数据段的话,那么,就可选用下面的数据段定义方式。
4、远程数据段定义
.FARDATA [段名] / .FARDATA? [段名]
其中:“段名”是可选项,如果不指定的话,则该段名就取其缺省段名。
作用:说明一个独立的数据段。
伪指令.FARDATA?说明下面是一个未初始化的、独立数据段的开始。通常情况下,很少使用该伪指令。
6.4.3 简化段段名的引用
当使用简化的段定义时,一般情况下,程序员可以不知道这些段的段名、段地址堆齐类型和组合类型等。但当把简化定义的段和标准定义的段混合使用时,就需要知道简化定义段的基本属性。表6.3是在小模式下段的基本属性对应表。
表6.3 小模式下简化段定义的缺省属性表
伪指令 |
缺省段名 |
对齐类型 |
组合类型 |
类别 |
段组名 |
.CODE |
_TEXT |
WORD |
PUBLIC |
'CODE' |
|
.FARDATA |
FAR_DATA |
PARA |
NONE |
'FAR_DATA' |
|
.FARDATA? |
FAR_BSS |
PARA |
NONE |
'FAR_BSS' |
|
.STACK |
STACK |
PARA |
STACK |
'STACK' |
DGROUP |
.DATA |
DATA |
WORD |
PUBLIC |
'DATA' |
DGROUP |
.DATA? |
BSS |
WORD |
PUBLIC |
'BSS' |
DGROUP |
.CONST |
CONST |
WORD |
PUBLIC |
'CONST' |
DGROUP |
在其它存储模型下,由伪指令".CODE"说明的代码段段名在"_TEXT"之前还要加上其模块名(源程序名)。假设,某模块名为ABC,则其缺省的代码段段名就为ABC_TEXT。因此,在这种情况下,程序的模块名或源程序名不要以数字开头。
例6.15 简化段定义的方法
|
.MODEL SMALL |
|||
.STACK 128 |
||||
.DATA |
||||
|
MSG |
DB "Simplified Segment Directives.$" |
||
.CODE |
||||
|
MOV |
AX, @DATA |
;取数据段的段值 |
|
MOV |
DS, AX |
;把给段寄存器DS赋值 |
||
MOV |
DX, offset MSG |
|||
MOV |
AH, 9H |
|||
INT |
21h |
|||
MOV |
AX, 4C00H |
|||
INT |
21h |
|||
END |
另外,在汇编程序MASM中,还提供了二组简化的代码伪指令:.STARTUP和.EXIT。
、.STARTUP——在代码段的开始,用于自动初始化寄存器DS、SS和SP;
、.EXIT——用于结束程序的运行,它等价于下列二条语句:
MOV AH, 4CH
INT 21h
当使用汇编程序TASM时,以上二条伪指令分别改为:STARTUPCODE和EXITCODE。假设使用汇编程序MASM,那么,例6.15可改写成例6.16的形式。
例6.16
|
.MODEL SMALL |
||
.STACK 128 |
|||
.DATA |
|||
|
MSG |
DB "Simplified Segment Directives.$" |
|
.CODE |
|||
|
.STARTUP ;自动初始化寄存器DS、SS和SP |
||
MOV |
DX, offset MSG |
||
MOV |
AH, 9H |
||
INT |
21h |
||
.EXIT |
|||
END |
6.5 源程序的辅助说明伪指令
除了以上一些使用率较高的伪指令外,还有一些使用频率不太高的其它伪指令。下面仅列举几个这样的伪指令。
6.5.1 模块名定义伪指令NAME
模块名定义伪指令NAME说明该源程序的模块名。该伪指令的一般格式如下:
NAME [模块名字符串]
6.5.2 页面定义伪指令PAGE
在源程序的开始,可用伪指令PAGE说明每页的最大行数、每行的字符数。该伪指令的一般格式为:
PAGE [[行数], 宽度]
其中:“行数”的取值范围为[10, 255],“宽度”的取值范围为[60, 132]。
如:伪指令“PAGE 60, 80”说明每页最多有60行,每行最多有80个字符。
如果要在某指定行之后强行换页的话,那么,可在该行的下面书写不带操作数的伪指令PAGE。