汇编学习笔记50
二、段的简化定义
新版汇编语言提供了段的简化定义方法,从而使程序员可以方便地定义段。
无论是编写独立的汇编语言程序还是编写供高级语言程序调用的函数,简化的段定义伪指令几乎总是使程序设计更容易。
本节介绍段的简化定义
(一) 存储类型说明伪指令
在程序员使用段简化定义伪指令之前,必须首先使用存储类型说明伪指令描述程序采用的存储类型。
存储类型说明伪指令的格式如下:
.MODEL 存储模型
常用的存储模型有:
(1) SMALL (小型模型)
全部数据限制在单个64KB段内,全部代码也限制在单个64KB段内,这是独立的汇编语言程序最常用的模型。在这种存储模型下,数据段寄存器可保持不变,所有转移均可变为是段间转移。
(2) MIDDLE (中型模型)
全部数据限制在单个64K段内,但代码可大于64KB,在这种存储模型下,数据段寄存器可保持不变,但会出现段间转移情形。
(3) COMPACT (紧凑模型)
全部代码限制在单个64KB段内,数据总量可大于64KB,但一个数组不能大于64KB
(4) LARGE (大型模型)
代码可超过64KB,数据也可以超过64KB,但一个数组不能大于64KB。
(5) HUGE (巨型模型)
代码可超过64KB,数据也可以超过64KB,并且一个数组也能大于64KB.
独立的汇编程序可选用任一种存储类型,对大多数完全用汇编语言编写的程序来说,小(SMALL)模型就足够了。
(二) 简化段定义伪指令
1. 简化的段定义伪指令
简化的段定义伪指令均以符号点引导。
常用的简化段定义伪:
(1)代码段简化定义伪指令
.CODE
例1:
写一个使系统喇叭发出嘟的一声的程序
.MODEL SMALL
.CODE
START: MOV DL, 7
MOV AH, 2
INT 21H
MOV AX, 4C00H
INT 21H
END START ; 结束代码段
伪指令.CODE说明代码段的开始,伪指令END说明段结束。
简化段定义伪指令说明一个段的开始,同时也表示上一个段的结束,伪指令END说明是一个段的结束。
(2) 定义堆栈段伪指令
.STACK [大小]
它表示一个堆栈段开始,若没有指令堆栈段的大小,则采用缺省值1024
(3) 定义数据段的伪指令
.DATA
例2:
如下伪指令定义了一个数据段
.DATA
VAR3 DB 5
LARRAY DW 50DUP( 0 )
MESS DB 'HELLO', 0DH, 0AH, '$'
例3:
增加一个大小为1024字节的堆栈段
.MODEL SMALL
.STACK 1024
.DATA
MESS DB 'HELLO' 0DH, 0AH, '$'
.CODE
START: MOV AX, DGROUP
MOV DS, AX
MOV DX, OFFSET MESS
MOV AH, 9
INT 21H
MOV AH, 4C00H
INT 21H
END START
在一个源程序模块中可定义多个由伪指令.DATA开始的数据段,如同在一个源程序模块中定义多个同名的数据段
(4) 定义远程(独立)数据段指令
定义独立数据段伪指令的一般格式如下:
它表示一个独立数据段的开始
.FARDATA [名字]
名字是可选项,如果使用,则设成该数据段的段名
例: 如下伪指令定义了一个独立数据段
.FARDATA
BUFF DB 1024(?)
此外,还有伪指令.DATA?和伪指令.CONST, .FARDATA?等。它们分别用于说明未初始化数据段的开始和常规数据的开始,未初始化的独立数据段,在编写纯粹的汇编语言程序时,一般不使用这些伪指令
2. 有关的预定义符
在上述程序片断中使用符号@CODE等是汇编程序提供的若干骑了定义符,它们类似于用伪指令EQU所定义的符号。
与简化的段定义伪指令相关的一些预定义符号有:
(1) 符号@CODE表示代码段的段名
(2) 符号@DATA表示DATA段和STACK段等集合而成的段组的组名
(3) 符号@FARDATA表示独立数据段的段名