第 5章 汇编语言与汇编程序
【 本章重点 】 本章重点在于介绍汇编语言的指令格
式和伪指令格式, 汇编程序的上机调试过程等等,
为后面学习微型计算机接口的编程打好基础 。
【 本章难点 】 本章难点是汇编程序的上机调试过
程,它是掌握汇编语言的关键。
汇编语言
源程序
汇编程序
目标程序
(机器语言)
汇编
汇编程序的执行过程
§ 5.1 汇编语言的语句格式
一条汇编语言指令中最多包含 4个区段, 如下所示:
[标号 ],操作码 [目的操作数, 源操作数 ] [;注释 ]
其中用方括号括起来的部分, 可以有, 也可以没有 。
标号与操作码之间,,, 隔开;
操作码与操作数之间用, 空格, 隔开;
目的操作数和源操作数之间有,,, 分隔;
操作数与注释之间用, ;, 隔开 。
§ 5.2 汇编语言中的常数与表达式
5.2.1常数
常数可以分数值常数和字符串常数两类 。 数值常数按其基数
的不同, 可有二进制数, 八进制数, 十进制数, 十六进制数
等几种不同的表示形式, 汇编语言中采用不同的后缀加以区
分 。
B:表示二进制数 。 例如, 10100101B。
D:表示十进制数 。 例如, 278D或 278。
Q:表示八进制数 。 例如, 567Q,263Q。
H:表示十六进制数 。 例如, 9AH,5678H。
字符串常数是由单引号括起来的一串字符 。 例如:
‘ THIS IS A STUDENT!’
‘12345’
要指出的是, 此处的 ’ 12345’其值并非是十进制数 12345,
而是代表它们所对应的 ASCⅡ 码, 即 31H,32H,33H,
34H,35H。
5.2.2表达式和运算符
在表达式中,运算符充当着重要的角色。 8086宏汇编有
算术运算符、逻辑运算符、关系运算符、分析运算符和
综合运算符共 5种。
算术运算符 逻辑运算符 关系运算符 分析运算符 综合运算符
+ ( 加法 ) AND( 与 ) EQ( 相等 ) SEG( 求段基值 ) PTR
- ( 减法 ) OR( 或 ) NE( 不相等 ) OFFSET( 求偏移量 ) THIS
× ( 乘法 ) XOR( 异或 ) LT( 小于 ) TYPE( 求变量类型 ) SHORT
÷ ( 除法 ) NOT( 非 ) GT( 大于 ) LENGTH( 求变量长度 ) HIGH
MOD( 求余 ) LE( 小于或等于 ) SIZE( 求字节数 ) LOW
SHL ( 左移 ) GE( 大于或等于 )
SHR ( 右移 )
8086汇编语言中的运算符
分析运算符共有 5个,SEG( 求段基值 ), OFFSET(求偏移量 )、
TYPE(求变量类型 ),LENGTH( 求字节数 ) 和 SIZE( 求字节数 ) 。 其
中 LENGTH和 SIZE只对数据存储器地址操作数有效 。
1) SEG运算符:利用运算符 SEG可以得到一个标号或变量的段基址
使用格式,SEG变量名或标号名
例如:已知数据段 DATA从存储器实际地址 03000H开始, 作如下定义
后, 用 SEG运算符求变量所在的段基址 。
DATA SEGMENT ;定义数据段
VARl DB 10H,18H,25H,34H ;定义字节数据
VAR2 DW 2300H,1200H ;定义字数据
VAR3 DD 11002200H,33004400H,定义双字数据
DATA ENDS ;数据段结束
MOV BX,SEG VARl 汇编成,MOV BX,0300H
MOV CX,SEG VAR2 汇编成,MOV CX,0300H
MOV DX,SEG VAR3 汇编成; MOV DX,0300H
2) OFFSET运算符:利用运算符 OFFSET可以得到一
个标号或变量的偏移量 。
使用格式,OFFSET 变量名或标号名
例如:对于上例中所定义的数据段,采用 OFFSET运算符求出变
量 VARl和 VAR2的偏移量。则:
MOV BX,OFFSET VAR1 汇编成,MOV BX,0000H
MOV CX,OFFSET VAR2 汇编成,MOV CX,0004H
MOV DX,OFFSET VAR3 汇编成,MOV DX,0008H
3) TYPE运算符,TYPE运算符可加在变量、结构或标
号的前面,所求出的是这些存储器操作数的类型部分。
运算符 TYPE的运算结果是一个数值,这个数值与存储
器操作数类型属性的对应关系
存储释操作数类型 TYPE返回值
字节数据 BYTE( DB定义) 1
字数据 WORD( DW定义) 2
双字数据 DWORD( DD定义) 4
DATA SEGMENT ;定义数据段
VARl DB 10H,18H,25H,34H ;定义字节数据
VAR2 DW 2300H,1200H ;定义字数据
VAR3 DD 11002200H,33004400H,定义双字数据
DATA ENDS ;数据段结束
下列指令:
MOV BX,TYPE VAR1 汇编成,MOV BX,1
MOV CX,TYPE VAR2 汇编成,MOV CX,2
MOV DX,TYPE VAR3 汇编成,MOV DX,4
4) LENGTH运算符,LENGTH运算符放在数组变量
的前面,可以求出该数组中所包含的变量的个数。
ARRAY1 DB 100DUP(?)
ARRAY2 DW 10DUP(?)
ARRAY3 DD 10DUP(?)
下列指令:
MOV BX,LENGTH ARRAY1 汇编后,MOV BX,100
MOV CX,LENGTH ARRAY2 汇编后,MOV CX,10
MOV DX,LENGTH ARRAY3 汇编后,MOV DX,10
5) SIZE运算符:如果一个变量已经用重复操作符
DUP加以说明,则利用 SIZE运算符可以得到分配给
该变量的字节总数。
ARRAY1 DB 100DUP(?)
ARRAY2 DW 10DUP(?)
ARRAY3 DD 10DUP(?)
下列指令:
MOV BX,SIZE ARRAY1 汇编后,MOV BX,100
MOV CX,SIZE ARRAY2 汇编后,MOV CX,20
MOV DX,SIZE ARRAY3 汇编后,MOV DX,40
( 5) 综合运算符
综合运算符可以用来建立和临时改变变量或标号的类
型以及存储器操作数的存储单元类型, 而忽略当前的
属性, 所以又称为属性修改运算符 。
有 6个综合运算符,即 PTR、段属性前缀,SHORT、
THIS,HIGH和 LOW
1) PTR运算符
VARl DB 10H,18H,25H,34H
VAR2 DW 1223H,1200H
MOV AX,WORD PTR VARl 执行后,AX=1810H
MOV BL,BYTE PTR VAR2 执行后,BL=23H
2) SHORT运算符 。
运算符 SHORT用来修饰 JMP指令中跳转地址的属性,
指出跳转地址是在下一条指令地址的- 128~+ 127个字
节范围之内。
例如:在 JMP指令中使用 SHORT运算符来进行短距离跳转 。

JMP SHORT NEXT

NEXT,…,

该例中, 使用 SHORT运算符后, 跳转标号 NEXT与 JMP指令的距
离不能大于 127个字节 。
§ 5.3伪指令
5.3.1定义数据伪指令
该类伪指令用来定义存贮空间及其所存数据的长度 。
DB:定义字节, 即每个数据是 1个字节 。
DW:定义字, 即每个数据占 1个字 ( 2个字节 ) 。
DD:定义双字, 即每个数据占 2个字 。 低字部分在低地址,
高字部分在高地址 。
DQ:定义 4字长, 即每个数据占 4个字 。
DT:定义 10个字节长, 用于压缩式十进制数据 。
例如,DATA1 DB 10H,6,78H,100
表示从 DATA1单元开始连续存放 10H,6,78H,100,共
占 4个字节地址。
DATA1 DB 20H DATA1
DATA2
DATA3
DATA4
DATA5
DATA6
20H
04H
02H
00H
10H
FDH
05H
45H
23H
01H
00H
30H
31H
32H
33H
42H
41H
43H
00H
44H
00H
DATA7
DATA8
DATA9
DATA10
00
00
00
00
00
DATA2 DW 0204H,1000H
DATA3 DB ( - 1*3), ( 15/5)
DATA4 DD 12345H
DATA5 DB ‘0123’
DATA6 DW ‘AB’,’ C’,’ D’
DATA7 DB?
DATA8 DD?
DATA9 DB 5DUP(00)
DATA10 DW 3DUP(?)
5.3.2符号定义伪指令 EQU
EQU伪指令给符号定义一个值。在程序中,凡是出现
该符号的地方,汇编时均用其值代替,如:
COUNT EQU 100 ; COUNT代替常数 100
SUM EQU 30*25 ; SUM代替数值表达式
C EQU CX ; C代替寄存器 CX
M EQU MOV ; M代替指令助记符 MOV
需要注意的是,一个符号一经 EQU伪指令赋值后,在整个程序
中,不允许再对同一符号重新赋值。
5.3.3段定义伪指令
段定义伪指令的用途是在汇编语言程序中定义逻辑
段, 用它来指定段的名称和范围, 并指明段的定位
类型, 组合类型及类别 。
常 用 的 段 定 义 为 指 令 有 SEGMENT, ENDS 和
ASSUME等 。
( 1) SEGMENT和 ENDS伪指令
使用格式:段名 SEGMENT [定义类型 ][组合类
型 ][‘类别 ’ ]
… ( 段内语句系列 )
段名 ENDS
DATA SEGMENT

DATA ENDS
STACK SEGMENT STACK

STACK ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA,SS,STACK
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX

CODE ENDS
5.3.4过程定义伪指令
在程序设计中, 经常将一些重复出现的语句组定义为
子程序 。 子程序又称为过程, 可以用 CALL指令来调
用 。
( 1) 过程定义伪指令 PROC和 ENDP
使用格式:过程名 PROC [类型 ]
┇ 过程体
RET
过程名 ENDP
DELAY PROC
MOV BL,10
DELY,MOV CX,2801
WAIT,LOOP WAIT
DEC BL
JNZ DELY
RET
DELAY ENDP
一个延时 100ms子程序,其过程可定义如下
5.3.5汇编结束伪指令 END
该伪指令表示源程序的结束, 将汇编程序停止汇
编 。 因此, 任何一个完整的源程序均应有 END指令,
其一般格式为
END [表达式 ]
其中表达式表示该汇编程序的启动地址 。 例如:

END START
则表明该程序的启动地址为 START。
§ 5.4汇编语言程序上机操作过程
5.4.1汇编语言程序上机调试步骤
1,编写源程序
在弄清问题的要求, 确定方案后, 汇编语言程序设计
者便可依据前面的指令系统和汇
编语言的规定, 逐个模块地编写汇编语言源程序 。
2,源程序输入微型机
在编辑软件 EDIT.EXE或其他编辑软件的支持下, 将
源程序输入到计算机中 。 通常, 汇编语言源程序的扩展
名为 ASM。
3,汇编
利用汇编程序(或宏汇编程序)( ASM或 MASM)
对汇编语言源程序进行汇编,产生扩展名为 OBJ的可
重定位的目的代码。
4,连接
利用连接程序( LINK)可将一个或多个扩展名为 OBJ
文件进行连接,生成扩展名为扩展名为 EXE的可执行
文件。
5,调试
对于稍大一些的程序来说,经过上述步骤所获得
的, EXE可执行文件,在运行过程中难免无错。
调试汇编程序最常用的工具是动态调试程序 DEBUG。
汇编语言
源程序
编辑程序
汇编程序
A S M 或M A S M
连接程序
LINK
调试程序
DEBUG
修 改
出错 出错
.ASM,OBJ,EXE
EDIT.EXE
汇编语言源程序的上机调试过程
5.4.2 汇编语言源程序的建立
当启动系统后, 进入 DOS状态, 输入 EDIT命令, 就可
以进入 EDIT屏幕编辑软件, 然后输入汇编语言源程序 。
C:\ >EDIT↙
下面是将 ASCⅡ 码转换成二进制数的程序。设定源程
序的文件名为 ABC。
DATA SEGMENT
ASC
DB ’5’,’ A’,’ 6’,’ 1’
BIN DB 2DUP( 0)
DATA ENDS
STACK SEGMNT STACK ‘STACK’
DB 100DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA,
SS,STACK
START,MOV AX,DATA
MOV DS,AX
MOV CL,4
MOV CH,CL
MOV SI,OFFSET ASC
CLD
XOR AX,AX
XOR DX,DX
B1,LODS ASC
AND AL,7FH
CMP AL,’ 0’
JL ERROR
CMP AL,’ 9’
JG B2
SUB AL,30H
JMP SHORT B3
B2,CMP AL,’ A’
JL ERROR
CMP AL,’ F’
JG ERROR
SUB AL,37H
B3,OR DL,AL
ROR DX,CL
DEC CH
JNZ B1
MOV WORD PTR BIN,DX
MOV AH,4CH
INT 21H
CODE ENDS
END START
键入以下命令:
C:\>EDIT ABC.ASM↙
此时屏幕的显示状态如图 5-4所示。
5.4.3将源程序文件汇编成目标程序文件
在对源程序文件进行汇编时, 汇编程序将对,ASM文件进
行二遍扫描 。 如果源程序文件中出现语法错误, 则汇编结
束后将指出源程序中的错误, 这时可用编辑程序再次修改
源程序中的错误, 然后再次汇编, 直到最后得到没有错误
的目标程序, 即扩展名为,OBJ文件 。
一般情况下, 汇编程序的主要功能有以下 3点:
( 1) 检查源程序中存在语法错误, 并给出错误信息 。
( 2) 源程序经汇编后没有错误, 则产生目标程序文
件, 扩展名为,OBJ。
若程序中使用了宏指令,则汇编程序将展开宏指令。
5.4.4用连接程序生成可执行程序文件
经汇编以后产生的目标程序文件 (OBJ文件 )并不是可执
行程序文件, 必须经过连接以后, 才能成为可执行文件
(即扩展名为 EXE)。
连接程序 LINK并不是专为汇编语言程序设计的,如果一
个程序是由若干个模块组成的,也可以通过连接程序把
它们连接在一起,这些模块可以是汇编产生的目标文件,
也可以是高级语言编译程序产生的目标文件。
5.4.5程序的执行
当我们建立了正确的可执行文件以后, 就可以直接在 DOS状态下
执行该程序 。
如,C:\>ABC↙
本程序当中没有用到 DOS中断调用指令, 所以在屏幕上看不到程
序执行的结果,
我们可以采用调试程序 DEBUG来进行检查。
5.4.6程序的调试
在编写汇编语言程序时产生的错误, 除了一般语法错误和格式错
误可以用汇编和连接
程序发现和指出外,逻辑上的错误都必须用调试程序 (DEBUG,COM)
来排除。 DEBUG,COM文件用于试验和检测用户程序
1,DEBUG程序的调用
在 DOS的提示符下, 可以直接键入命令, 如图 5-7所示
C:\>DEBUG ABC.EXE↙
命令

含义 使用格式 功能
D 显示存储单元命令 - D[address] 按指定地址范围显示存储单元内容
E 修改存储单元内容命令 - E address [list]- E address 按指定首地址显示存储单元内容逐个单元修改存储单元内容
F 填写存储单元内容命令 - F range list 将指定内容填写到存储单元
R 检查和修改寄存器内容命令 - R- R register name
- RF
显示 CPU内所有寄存器内容
显示和修改某个寄存器内容
显示和修改标志位状态
G 运行命令 - G[=address1][address2] 按指定地址运行
T 跟踪命令 - T[=address]
- T[=address][value]
逐条指令跟踪
多条指令跟踪
A 汇编命令 - A[address] 按指定地址开始汇编
U 反汇编命令 - U[address]
- U[range]
按指定地址开始反汇编
按指定范围的存储单元开始反汇编
L 装入命令 - L address drive sector
- L [address]
装入磁盘上指定内容到存储器
装入指定文件
W 写命令 - W address drive sector
- W [address]
把数据写入磁盘指定的扇区
把数据写入指定的文件
Q 退出命令 - Q 退出 DEBUG
§ 5.5 汇编语言程序运行实例
本节中通过一个汇编语言源程序的实际例子, 来了解汇
编语言源程序的建立, 汇编, 连接, 运行的过程 。
给出的程序是将键盘输入的小写字母转换成大写字母的
程序并显示在屏幕上。设定源程序名为 WANG.ASM。
DATA SEGMENT
BUF DB 82 DUP(?)
DATA ENDS
STACK SEGMENT
STA DB 50 DUP(?)
TOP EQU LENGTH STA
STACK ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA,ES,DATA,SS,STACK
START,MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK ;段寄存器和堆栈初始化
MOV SS,AX
MOV SP,TOP
MOV BX,OFFSET BUF ; BX指向字符行缓冲区首地址
KKK,MOV SI,0000H ;偏移指针 SI清 0
GGG,MOV AH,01H
INT 21H ;接收键入字符
CMP AL,03H
JZ PPP ;是 CTRL- C键则转结束
CMP AL,0DH
JZ BBB ;是回车键则转 BBB
CMP AL,61H
JB TTT
CMP AL,7AH
JA TTT ;不是小写字符转 TTT
SUB AL,20H ;小写字母转化为大写字母
TTT,MOV [BX+ SI],AL ;存入字符行缓冲区中
INC SI ;偏移指针加 1
JMP GGG
BBB,MOV [BX+ SI],AL
MOV AL,0AH
MOV [BX+ SI+ 1],AL ;加入换行符
MOV AL,’ $’
MOV [BX+ SI+ 2],AL ;再加入一个’ $’标志字符
MOV AH,09H
MOV DX,BX
INT 21H ;显示转换后的字符串
JMP KKK ;循环
PPP,MOV AX,4C00H
INT 21H ;返回 DOS
CODE ENDS
END START
5.5.1 用 EDIT建立汇编语言源程序
在 DOS状态下, 调用 EDIT编辑程序建立文件名为
WANG.COM的汇编源程序, 如图 5-8所示 。
C:\>EDIT WANG.ASM↙
5.5.2用 MASM汇编生成目标文件
源程序文件建立完毕后, 调用宏汇编程序 MASM对
WANG.ASM进行汇编, 过程如图 5-9所示 。
C:\>MASM WANG.ASM
源程序可以不加扩展名,但必须加分号,文件名黙认
原文件名。
5.5.3用 LINK进行连接生成可执行文件
汇编完毕, 程序正确, 则可调用 LINK进行连接, 以生
成可执行文件 WANG.EXE,过程如图 5-10所示 。
C:\>LINK WANG.OBJ
目标文件可以不加扩展名,但必须加分号,文件名黙
认原文件名。
5.5.4程序的运行
在 DOS状态下, 直接键入可执行的程序文件名 WANG,
然后从键盘输入小写字母并将其转换成大写输出 。 过程
如图 5-11所示 。
C:\>WANG↙