格式:
符号名 EQU 表达式
例:
COUNT EQU 100 ; 符号COUNT就代表常数100
BUFF_LEN EQU 4*COUNT ; COUNT是已定义的符号常数
HELLO EQU “HELLO WORLD!”
MOVE EQU MOV
COUNT EQU CX
用EQU可以用MOVE代替MOV,用COUNT代替寄存器CX.
注意:第一,等价语句不另外给符号分配存储单元;第二,等价语句定义的符号不能与其他符号相同,也不能被重新定义,否则汇编程序会认为出现符号重复定义错误。
等号语句用来定义符号常数、
格式:
符号名= 数值表达式
用符号语句定义的符号可被重新定义。
格式:
符号名 LABEL 类型
类型可以是BYTE WORD DWORD NEAR FAR等
该语句的功能是定义有符号名指定的符号,使该符号的段属性和偏移属性与下一个紧接着的存储单元的段属性和偏移属性相同,使该符号的类型为参数所规定的类型。
例:
BUFFER LABEL WORD
BUFF DB 100 DUP (0)
BUFFER的类型是WORD,段属性和偏移属性与BUFF相同。
例:
QUIT LABEL FAR
EXIT: MOV AH, 4CH
MOV AH, 4CH有两个标号QUIT和EXIT,但它们类型不同。
为了与存储器的分段结构相对应,汇编语言的源程序也是由若干个段组成。
格式:
段名 SEGMENT [定位类型][组合类型][‘类型’]
………
段名 ENDS
段名的命名方法与一般符号命名方法相同。
一个简单的数据段如下所示:
DSEG SEGMENT
MESS DB ‘HELLO’, 0DH, 0AH, ‘$’
DSEG ENDS
承上:
CSEG SEGMENT
MOV AX, DSEG
MOV DS, AX
MOV DX, OFFSET MESS
MOV AX, 9
INT 21H
MOV AH, 4CH
INT 21H
CSEG ENDS
汇编程序根据段开始语句和段结束语句判断出源程序的段划分,为了有效地产生目标代码,汇编程序还要了解各程序段与段寄存器的对应关系。段寄存器与程序段的对应关系由段设定语句说明。
ASSUME 段寄存器名:段名[,段寄存器:段名…]
段寄存器名可以是CS, DS ES,SS。
例:
CS对应CSEG段,DS对应DSEG段。
ASSUME CS: CSEG, DS: DSEG
ASSUME伪指令中的段名域也可以是一个特别的关键字NOTHING,它表示某个段寄存器不再与任何段有对应关系。
DESEG1 SEGMENT
VARW DW 12H
DESEG1 ENDS
DSEG2 SEGMENT
XXX DW 0
YYY DW 0
DSEG2 ENDS
CSEG SEGMENT
ASSUME CS: CSEG, DS:DSEG1, ES:DSEG2
MOV AX, DSEG1
MOV DS, AX
MOV AX, DSEG2
MOV ES, AX
MOV AX, VARW
MOV XXX, AX
ASSUME DS: DSEG2, ES:NOTHING
MOV AX, DSEG2
MOV DS, AX
MOV AX, XXX
MOV YYY, AX
CSEG ENDS
汇编程序在对源程序汇编的过程中,使用地址计数器来保存当前正在汇编指令或变量的地址偏移。
格式:
ORG 数值表达式
例:
TESTSEG SEGMENT
ORG 100H
BEGIN: MOV AX, 1234H
ORG 500H
VAR DW 1234H
…….
TESTSEG ENDS
汇编语言中用“$”表示地址计数器的值。
例:表示跳过8个字节的存储区
ORG $+8
当$用在伪指令的参数中时,它表示地址计数器的当前值。
例:
ARRAY DW 1, 2, $+4, 3, 4, $+4