第 3章 宏汇编语言
第 3章 宏汇编语言
3.1 宏汇编语言格式
3.2 汇编语句表达式
3.3 伪指令
3.4 DOS系统功能调用
3.5 综合举例
开 始
第 3章 宏汇编语言
3.1 宏汇编语言格式
3.1.1 指令语句格式
3.1.2 伪指令语句格式
返回本章首页
第 3章 宏汇编语言
3.1.1 指令语句格式
指令语句的一般格式如下:
[ 标号,] 指令助记符 操作数 ;注释
1,标号,标号是机器指令语句存放地址的符号表示, 代
表该指令目标代码的第一个字节地址, 后面必须紧跟冒
号,,, 。
2,指令助记符,指令助记符为语句的核心成分, 表示了
该语句的操作类型 。
3,操作数,操作数表示指令助记符的操作对象 。
4,注释,注释均以分号开始, 它可占一行或多行, 一般
放在一条语句的后面 。
返回本节
第 3章 宏汇编语言
3.1.2 伪指令语句格式
伪指令语句格式如下:
[符号名 ] 伪指令符 操作数 ;注释
1,符号名,符号名是伪指令语句的一个可选项 。
2,伪指令符,伪指令符指定汇编程序要完成的具体操作,
如数据定义伪指令 DB, DW,DD,段定义伪指令
SEGMENT,假定伪指令 ASSUME等 。
3,操作数,伪指令后面的操作数可以是常数, 字符串,
变量, 表达式等, 其个数由具体的伪指令决定, 各个操
作数之间必须以, 逗号, 分隔 。
4,注释,伪指令的注释必须以, ;, 开始, 其作用同指
令语句中的注释部分 。
返回本节
第 3章 宏汇编语言
3.2 汇编语句表达式
3.2.1 常量
3.2.2 变量
3.2.3 标号
3.2.4 表达式与运算符
3.2.5 运算符的优先级
返回本章首页
第 3章 宏汇编语言
3.2.1 常量
1,数值常量
2,字符串常量
第 3章 宏汇编语言
1.数值常量
表 3.1 各种形式数字常量格式对照表
第 3章 宏汇编语言
2,字符串常量
字符串常量是用单引号或双引号引起来的一个或
多个字符 。 字符串常量是以各字符的 ASCⅡ 码表
示的 。 如 ‘ A’用 41H 表示, 字符串 ‘ A1B2’用
41H,31H,42H,32H表示 。
返回本节
第 3章 宏汇编语言
3.2.2 变量
1,变量
2,变量的定义
第 3章 宏汇编语言
( 1) 段属性
( 2) 偏移地址属性
( 3) 类型属性
1.变量
第 3章 宏汇编语言
表达式项是给变量或指定存储单元赋予初值, 它
有以下几种形式:
( 1) 数值表达式
( 2) 字符串表达式
( 3) 地址表达式 ( 只适用 DW和 DD两个伪指令 )
( 4)? 表达式
( 5) 带 DUP的表达式
2.变量的定义
第 3章 宏汇编语言
数据定义伪指令可以为一个或连续的存储单元设置数值
初值 。
【 例 3.1】 为数据段分配存储单元 。
DATA SEGMENT
A DB 11H,12H,13H
B DW 1122H,3344H
C DD 12345678H
DATA ENDS
上述变量的存储单元分配及初始化情况如下图 3.1所示。
( 1)数值表达式
第 3章 宏汇编语言
图 3.1 数据段中数据存储分配图
第 3章 宏汇编语言
字符串表达式中的字符串必须用引号引起来 。 DB,DW、
DD伪指令将字符串中的各字符均以 ASCⅡ 码形式存放在
相应的存储单元, 但表示形式各不相同 。
【 例 3.2】 为字符串分配存储单元 。
DATA SEGMENT
STR1 DB ‘1234’
STR2 DW ‘AB’,‘ CD’,‘ A’
STR3 DD ‘AB’
DATA ENDS
其存储单元分配如下图 3.2所示 。
( 2) 字符串表达式
第 3章 宏汇编语言

3.
2








第 3章 宏汇编语言
( 3) 地址表达式 ( 只适用 DW和 DD两个伪指令 )
如果该地址表达式为一变量 ( 或标号 ) 名, 用 DW
伪指令则是取它的偏移地址来初始化变量, 用 DD
伪指令则是取它的段首址和偏移地址来初始化变
量 。
例如:
BUF1 DW A
BUF2 DD B
第 3章 宏汇编语言
在表达式中使用重复数据操作符 DUP,可以为连续的存
储单元提供重复数据, 其格式为:
N DUP( 表达式 )
其中 N为重复因子, 只能取正整数, 表示定义了 N个重复
数据存储单元, 其类型由它前面的数据定义伪指令确定,
而每个数据存储单元中的初值由 DUP后面圆括号中的表
达式给定 。
例如,BUF DB 100 DUP( 0)
以上语句定义了以 BUF为首址, 大小为 100个字节, 初值
为 0的数据存储单元 。
( 5)带 DUP的表达式
返回本节
第 3章 宏汇编语言
3.2.3 标号
标号是一条指令语句的符号地址 。 在汇编源程序中, 只有在需要
转向一条指令语句时, 才为该指令语句设置标号, 以便在转移类
指令 ( 含子程序调用指令 ) 中直接引用这个标号 。 因此, 标号可
作为转移类指令的操作数, 即转移地址 。
【 例 3.3】 符号地址表示 。

NEXT,MOV AL,[SI] ;带标号 NEXT的指令

DEC CX
JNE NEXT ;标号 NEXT作转移指令的操作数
第 3章 宏汇编语言
1,段属性
2,偏移地址属性
3,类型属性
标号也具有三种属性
返回本节
第 3章 宏汇编语言
3.2.4 表达式与运算符
1,算术运算符
2,逻辑运算符
3,关系运算符
4,属性运算符
5,数值返回运算符
第 3章 宏汇编语言
算术运算符包括:+ ( 加 ), - ( 减 ), *
( 乘 ), / ( 除 ), MOD( 求模 ), SHL( 左
移 ), SHR( 右移 ) 几种, 它既可以用于数值表
达式又可用于地址表达式 。
1.算术运算符
第 3章 宏汇编语言

NUM1 EQU 25*4–50 ; NUM1=50
NUM2 EQU NUM1 / 7 ; NUM2=7
NUM3 DB NUM1 MOD 7 ; NUM3=1
VAR1 DB 1,2,3,4,5
VAR2 DB ‘12345’
NUM4 EQU VAR2-VAR1 ; NUM4=5
NUM5 EQU 0FH

MOV AL,NUM5 SHL 4 ; ( AL) =11110000B
MOV BL,NUM5 SHR 4 ; ( BL) =00000000B
【 例 3.4】 用算术运算符进行数值表达式运算。
第 3章 宏汇编语言
逻辑运算符包括:逻辑乘 ( AND), 逻辑加 ( OR), 按位加
( XOR), 逻辑非 ( NOT) 四种运算 。 由于逻辑运算是按位操作,
且在汇编过程中完成, 因而运算的结果仍为整数常量 。
【 例 3.5】 用逻辑运算符进行运算 。
MOV AL,34H AND 0FH ; 04H→AL
MOV BL,05H OR 30H ; 35H→BL
MOV CX,NOT 00FFH ; 0FF00H→CX
MOV DX,789AH XOR 000FH ; 7895H→DX
2.逻辑运算符
第 3章 宏汇编语言
关系运算符包括:相等( EQ),不等( NE),小于( LT),大于
( GT),小于等于( LE)及大于等于( GE)。
【 例 3.6】 用关系运算符进行数值表达式运算 。
NUM1 DB 10 LT 5 ; NUM1=0
NUM2 DB 0AAAAH GT 7FFFH ; NUM2=0FFFFH
MOV AX,‘ A‘EQ 41H ; 0FFFFH→AX
MOV BX,NUM2 LT NUM1 ; 0→BX
3.关系运算符
第 3章 宏汇编语言
( 1) PTR运算符
格式,类型 PTR 地址表达式
② PTR与 EQU连用, 可定义与 PTR右边地址表
达式类型不同的新变量名或新标号, 但不另分配
存储单元 。
4.属性运算符
第 3章 宏汇编语言
( 1) SEG 运算符
( 2) OFFSET运算符
( 3) TYPE运算符
( 4) LENGTH运算符
( 5) SIZE运算符
( 6) 字节分离运算符
5.数值返回运算符
第 3章 宏汇编语言
( 1) SEG运算符
格式,SEG 变量或标号
功能:分离出其后变量或标号所在段的段首址 。 例如:
MOV AX,SEG ARR
MOV DS,AX
( 2) OFFSET运算符
格式,OFFSET 变量或标号
功能:分离出其后变量或标号的偏移地址 。 例如:
MOV BX,OFFSET BUF
第 3章 宏汇编语言
( 3) TYPE运算符
格式,TYPE 变量或标号
功能:分离出其后变量或标号的类型 。 如果是变量, 将
返回该变量的类型对应字节数;如果是标号, 则返回代
表标号类型的数值 。 它们之间的关系见表 3.2所示 。
第 3章 宏汇编语言
( 4) LENGTH运算符
格式,LENGTH 变量
功能:取出变量所含的数据存储单元个数。 【 例 3.12】 取出变量占
存储单元个数。
DATA SEGMENT
A DB ‘ABCDEF’
B DW 10 DUP( 1,2DUP( 2))
C DB 3,20 DUP( 0)
DATA ENDS

MOV AX,LENGTH A ; 1→AX
MOV BX,LENGTH B ; 10→BX
MOV CX,LENGTH C ; 1→CX

第 3章 宏汇编语言
( 5) SIZE运算符
格式,SIZE变量
功能:取出变量所含的数据存储区大小 。 其返回值
为:
LENGTH 变量 * TYPE 变量
例如:上例中 A,B,C三变量:
SIZE A = LENGTH A*TYPE A = 1
SIZE B = LENGTH B*TYPE B = 20
SIZE C = LENGTH C*TYPE C = 1
第 3章 宏汇编语言
( 6) 字节分离运算符
字节分离运算符包括,HIGH和 LOW。
格式,HIGH 常量或地址表达式
LOW 常量或地址表达式
功能,HIGH 用来分离出其后 16位常量或地址表
达式的偏移量的高字节; LOW用来分离出其后
16位常量或地址表达式偏移量的低字节 。
返回本节
第 3章 宏汇编语言
3.2.5 运算符的优先级
表 3.3 运算符的优先级 返回本节
第 3章 宏汇编语言
3.3 伪指令
3.3.1 数据定义伪指令
3.3.2 符号定义伪指令
3.3.3 段定义伪指令 SEGMENT/ENDS
3.3.4 假定伪指令 ASSUME
3.3.5 置汇编地址计数器伪指令 ORG
3.3.6 源程序结束伪指令
返回本章首页
第 3章 宏汇编语言
3.3.1 数据定义伪指令
常用的数据定义伪指令有 DB,DW,DD,DQ,
DT。
格式,[变量名 ] 数据定义伪指令 表达式
[,… ]
功能:定义数据存储区,类型由数据定义伪指令
确定,初值由表达式给定。
返回本节
第 3章 宏汇编语言
3.3.2 符号定义伪指令
1,等价伪指令
2,等号伪指令
3,定义符号名伪指令
第 3章 宏汇编语言
1.等价伪指令
格式:符号名 EQU 表达式
功能:为常量, 表达式及其他各种符号定义一个等价的
符号名, 但它不申请存储单元 。
用途,① 用符号表示常量, 数值表达式, 即定义符号常
量 。 使用符号常量可使程序简单明了, 增强程序的可读
性和通用性 。
② EQU与属性运算符P TR或 THIS联合使用, 可以给变
量或标号定义新的类型属性并重新命名, 但保持其段偏
移地址属性不变 。
③ 利用 EQU可以用一个符号名替代一个复杂的地址表达
式和其他一些符号,如指令助记符、变量名、标号、段
名、寄存器名、宏定义名等。
第 3章 宏汇编语言
2.等号伪指令
格式:符号名 = 表达式
功能:为常量, 表达式及其他各种符号定义一个等价的
符号名, 并能对所定义的符号多次重复定义, 且以最后
一次定义的值为准 。
【 例 3.17】 定义等价符号名 。

COST = 20
M = MOV
LOST = LOST+10 ; 30→LOST
M = ADD; M=ADD

第 3章 宏汇编语言
3.定义符号名伪指令
3,定义符号名伪指令
格式:变量名或标号 LABEL 类型
功能:定义与原有变量类型不同的新变量或为指令语句定义有指定
类型的标号 。 通常与数据定义伪指令连用, 其功能类似语句, 变量
名或标号 EQU THIS 类型, 。
【 例 3.18】 定义新类型的变量 。

DDBUFLABEL DWORD
BUF DB 200 DUP( 0)

A LABEL FAR
B,LEA DX,BUF

返回本节
第 3章 宏汇编语言
3.3.3 段定义伪指令 SEGMENT/END
1,段名
2,定位方式
3,类别
4,组合方式
第 3章 宏汇编语言
1,段名
段名是为该段起的名字,用来指出汇编程序为该段分配
的存储区起始位置。
2,定位方式
( 1) PARA:表示本段必须从能被 16整除的地址处开始
存放, 即段起始地址最低四位必须是 0。
( 2) WORD:表示本段要从一个偶数地址处开始存放,
即段起始地址的最低一位必须是 0。
( 3) BYTE:表示本段起始地址可以从任一地址处开始
存放 。
( 4) PAGE:表示本段要从能被 256整除的地址处开始存
放, 即起始地址的最低八位必须是 0。
第 3章 宏汇编语言
【 例 3.19】 对连接程序进行连接后存储区各段相对位置分布。
DATA1 SEGMENT ‘DATA’
CODESEGMENT ‘CODE’
STACK1 SEGMENT ‘STACK’
DATA2 SEGMENT ‘DATA’
STACK2 SEGMENT ‘STACK’
经连接程序连接后,各段的相对位置如下:
DATA1 SEGMENT ‘DATA’
DATA2 SEGMENT ‘DATA’
STACK1 SEGMENT ‘STACK’
STACK2 SEGMENT ‘STACK’
CODESEGMENT ‘CODE’
3.类别
第 3章 宏汇编语言
组合方式有六种类型可供选择。
( 1)“不选择”
( 2) PUBLIC
( 3) STACK
( 4) COMMON
( 5) MEMORY
( 6) AT表达式
4.组合方式
第 3章 宏汇编语言
【 例 3.20】 有两个模块,各模块段定义如下:
模块 1:

DATA1 SEGMENT PARA PUBLIC ‘DATA1’
M1 DB 45H DUP( 0)
DATA1 ENDS
DATA2 SEGMENT PARA COMMON‘DATA2’
N1 DB 102H DUP( 0)
DATA2 ENDS
END
第 3章 宏汇编语言
模块 2:

DATA1 SEGMENT PARA PUBLIC ‘DATA1’
M2 DB 104H DUP( 11H)
DATA1 ENDS
DATA2 SEGMENT PARA COMMON‘DATA2’
N2 DB 105H DUP( 0)
DATA2 ENDS
DATA3 SEGMENT
T1 DB 50 DUP( 20H)
DATA3 ENDS
END
第 3章 宏汇编语言
该段的定位组合方式示意图如图 3.3所示。

3.
3


1



2














返回本节
第 3章 宏汇编语言
3.3.4 假定伪指令 ASSUME
格式,ASSUME 段寄存器:段名 [,段寄存器:段名 ]
功能:建立段寄存器与段之间的对应关系 。 该伪指令一般出现在代
码段中 。
【 例 3.21】 用 ASSUME伪指令建立代码段, 堆栈段与 CS和 SS的对应
关系 。
DATA1 SEGMENT
A DB 1,2,3
DATA1 ENDS
STACKSEGMENT STACK
DB 200 DUP( 0)
STACKENDS
DATA2 SGEMENT
B DB‘123ABC
第 3章 宏汇编语言
DATA2 ENDS
DATA3 SEGMENT
C DB?,?,?
DATA3 ENDS
CODESEGMENT
ASSUME DS,DATA1,ES,DATA2,CS:
CODE,SS,STACK
START,MOV AX,DATA1
MOV DS,AX ; DATA1→DS
MOV AX,DATA3
MOV ES,AX ; DATA3→ES

第 3章 宏汇编语言
Q1,MOV AL,A
Q2,MOV C,AL
ASSUME DS,DATA2 ;建立 DS与 B段的对
应关系
MOV AX,DATA2
MOV DS,AX
MOV AL,B
MOV C,AL

CODEENDS
END START
返回本节
第 3章 宏汇编语言
3.3.5 置汇编地址计数器伪指令 ORG
格式,ORG 数值表达式
功能:将数值表达式的值赋给汇编地址计数器 。 数值表
达式的值须为 0~65535之间的非负整数 。
【 例 3.22】 给汇编地址计数器赋值 。
DATA SEGMENT
ORG 10 ; 置 $ 值为 10
VAR1 DW 100H,200H
ORG $ +5 ; 置 $ 的值为 14+5,即为 19
VAR2 DB 1,2,$ +1,$ +2
N EQU $ -VAR2 ; ( $ ) =23
DATA ENDS
返回本节
第 3章 宏汇编语言
3.3.6 源程序结束伪指令
格式,END [表达式 ]
功能:该语句标志整个程序的结束, 是
源程序的最后一条语句 。
返回本节
第 3章 宏汇编语言
3.4 DOS系统功能调用
3.4.1 概述
3.4.2 常用的 DOS系统功能调用
返回本章首页
第 3章 宏汇编语言
3.4.1 概述
对 8086系列机来说,MS-DOS操作系统是最主要的操作
系统。 MS-DOS操作系统除了具有较为完整的文件管理
功能之外,同时还为各种应用程序、外围设备等提供软
件接口。它由三部分组成,IO.SYS,MSDOS.SYS以及
COMMAND.COM。
DOS系统功能调用的方法一般可分为以下几步:
① 设置所要调用功能的入口参数 。
② 在 AH寄存器中存入所要调用功能的功能号 。
③ INT 21H指令自动转入中断子程序入口 。
④ 相应中断子程序运行完毕, 可按规定取得出口参数 。
返回本节
第 3章 宏汇编语言
3.4.2 常用的 DOS系统功能调用
1,单字符输入 ( 1号调用 )
2,单字符显示 ( 2号调用 )
3,打印输出 ( 5号调用 )
4,结束调用 ( 4CH号调用 )
5,显示字符串 ( 9号调用 )
6,字符串输入 ( 10号调用 )
第 3章 宏汇编语言
1,单字符输入 ( 1号调用 )
格式,MOV AH,1
INT 21H
功能:从键盘输入字符的 ASCII码送入寄存器 AL中,并
送显示器显示。
2.单字符显示( 2号调用)
格式,MOV DL,待显示字符的 ASCII码
MOV AH,2
INT 21H
功能:将 DL寄存器中的字符送显示器显示, 如果 DL中为
〈 CTRL〉 +〈 BREAK〉 的 ASCII码, 则退出 。
第 3章 宏汇编语言
3,打印输出 ( 5号调用 )
格式,MOV DL,待打印字符的 ASCII码
MOV AH,5
INT 21H
功能:将 DL寄存器中的字符送打印机打印 。
4,结束调用 ( 4CH号调用 )
格式,MOV AH,4CH
INT 21H
功能:终止当前程序并返回调用程序 。
第 3章 宏汇编语言
5,显示字符串 ( 9号调用 )
格式,LEA DX,待显示字符串首偏移地址
MOV AH,9
INT 21H
功能:将当前数据区中以‘$’结尾的字符串送显示器
显示。
6,字符串输入 ( 10号调用 )
格式,LEA DX,缓冲区首偏移地址
MOV AH,10
INT 21H
功能:从键盘上输入一字符串到用户定义的输入缓冲区
中, 并送显示器显示 。
第 3章 宏汇编语言
DATA SEGMENT
STR DB 0DH,0AH,‘ Example of string display!
$ ’
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP( 0)
STACK ENDS
CODESEGMENT
ASSUME DS, DATA,CS, CODE,SS:
STACK
【 例 3.25】 若要在屏幕上显示字符串,Example of
string display!”,则程序如下:
第 3章 宏汇编语言
BEGIN,MOV AX, DATA
MOV DS,AX
LEA DX,STR
MOV AH, 9
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
返回本节
第 3章 宏汇编语言
3.5 综合举例
【 例 3.27】 已知一数据段中的数据为:
DATA SEGMENT
A DW M
BUF DB ‘AB’,0DH,0AH
C EQU 500H
B DW 0FFAAH
D DD BUF
M DB 2DUP( 1), 2DUP( 2,’ B’)
DATA ENDS
请画出该数据段数据存储的形式。 返回本章首页
第 3章 宏汇编语言



















第 3章 宏汇编语言
DATA SEGMENT
NUM DB 01000101B
BUF DB 0DH,0AH,‘ ( NUM) =’
STR DB 4 DUP(? )
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP( 0)
STACK ENDS
CODESEGMENT
ASSUME DS,DATA,SS,STACK,CS,CODE
【 例 3.28】 阅读下列程序,指出此程序所完成的功能以
及在显示器上显示的内容。
第 3章 宏汇编语言
START,MOV AX,DATA
MOV DS,AX
LEA DI,STR
MOV AL,NUM
MOV CL,4
SHR AL,CL
OR AL,30H
MOV [DI],AL
INC DI
MOV AL,NUM
AND AL,0FH
OR AL,30H
MOV [DI],AL
第 3章 宏汇编语言
INC DI
MOV BYTE PTR [DI],‘ H’
INC DI
MOV BYTE PTR [DI],‘ $ ’
LEA DX,BUF
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODEENDS
END START
第 3章 宏汇编语言
DATA SEGMENT
INFO1 DB 0DH,0AH,‘ INPUT STRING,$ ’
INFO2 DB 0DH,0AH,‘ OUTPUT STRING,$ ’
BUFA DB 81
DB?
【 例 3.29】 从键盘上输入一串字符到输入缓冲区,然后
将输入的字符串在显示器上以相反的顺序显示。
第 3章 宏汇编语言
DB 80 DUP( 0)
BUFB DB 81 DUP( 0)
DATA ENDS
STACK SEGMENT
DB 200 DUP( 0)
STACK ENDS
CODESEGMENT
ASSUME DS,DATA,SS,STACK,CS:
CODE
START,MOV AX,DATA
MOV DS,AX
第 3章 宏汇编语言
LEA DX,INFO1
MOV AH,9 ; 9号调用, 显示输入提示信息
INT 21H
LEA DX,BUFA
MOV AH,10; 10号调用, 键盘输入字符串到缓
冲区 BUFA
INT 21H
LEA SI,BUFA+1
MOV CH,0 ; 取字符长度 → CX
MOV CL,[SI]
ADD SI,CX; SI 指向字符串尾部
LEA DI,BUFB ; DI指向字符串变量 BUFB
第 3章 宏汇编语言
NEXT,MOV AL,[SI]
MOV [DI],AL
DEC SI
INC DI
LOOP NEXT
MOV BYTE PTR [DI],‘ $ ’
LEA DX,INFO2
MOV AH,9 ; 9号调用, 显示输出
提示信息
INT 21H
第 3章 宏汇编语言
LEA DX,BUFB
MOVAH,9 ;反向显示字符串
INT 21H
MOVAH,4CH
INT 21H
CODE ENDS
END START
返回本节