第四章 8086汇编语言程序设计
? 几个概念
? 8086汇编语言的语句
? 8086汇编中的伪指令
? 8086汇编中的运算符
? 汇编语言程序设计
? 宏定义与宏调用
? 汇编语言程序设计实例
几个概念
? 汇编语言
? 汇编语言源程序
? 汇编
? 汇编程序
4,1 8086汇编语言的语句
汇编语言由指令性语句和指令性语句组成
? 一, 指令性语句格式
[标号,] 操作码 [操作数 1,] [操作数 2] ; [注释 ]
? 二, 指示性语句格式
[标识符 ( 名字 ) ] 指示符 ( 伪指令 ) 表达式
? 三, 有关属性
存储器操作数的属性有三种:段值, 段内偏移量
和类型 。
4,2 8086汇编中的伪指令
? 一,符号定义语句
? 1、等值语句
格式:符号名 EQU 表达式
例,⑴ PORT EQU 1234
⑵ BUFF EQU PORT+ 58
⑶ MEM EQU DS:[BP+ 20H]
⑷ COUNT EQU CX
⑸ ABC EQU AAA
2、等号语句
格式,NUM= 34
……
NUM= 34+ 1
?二、变量定义语句
格式,符号名 DB/DW/DD 表达式
?1、定义一组数据
例 1,BUFF DW 1234H,0ABCDH,8EH
DW –79DH,7B6AH
?2、定义一串字符
例 2,STR DB ‘ Welcome !’
?3、定义保留存储单元
例 3,SUM DW?,?
?4、复制操作
复制操作符 DUP( Duplication) 可预置重复的数值
例 4,ALL_ZERO DB 0,0,0,0,0
用复制操作可改为:
ALL_ZERO DB 5 DUP( 0)
? 5,将已定义的地址存入内存单元
例 5,LIT DD CYC

CYC,MOV AX,BX
? 三、段定义语句
? 1,段定义语句格式:
段名 SEGMENT [定位类型 ] [组合类型 ] [‘类别’ ]
……
段名 ENDS
只需要掌握
段名 SEGMENT
……
段名 ENDS
?2、段假设语句
ASSUME 段寄存器名:段名 [,…]
?3,ORG伪指令与地址计数器 $
ORG伪指令格式,ORG <表达式 >
?4,PUBLIC和 EXTRN伪指令
? 四、过程定义语句
过程名 PROC NEAR/FAR
……
RET
过程名 ENDP
4,3 8086汇编中的运算符
一, 常用运算符
1,算术运算符
+ ( 加 ), - ( 减 ), *( 乘 ), /
( 除 ), MOD( 求余 ) 。
2,逻辑运算符
AND,OR,XOR,NOT
3,关系运算符
EQ( 相等 ), NE( 不等, )
LT( 小于 ), GT( 大于 ),
LE( 小于等于 ), GE( 大于等于 ) 。
例,MOV DL,10H LT 16
例,AND AX,555 GT 222
二, 常用的操作符
4,分析操作符
1) SEG操作符
例,MOV AX,SEG BUFF
2) OFFSET操作符
例,MOV BX,OFFSET BUFF
3) TYPE操作符
对于变量有 3种,1 字节型;
2 字型;
4 双字型 ;
对于标号有 2种:- 1 NEAR( 段内 ),
- 2 FAR( 段间 ) 。
例,BUFF DB 20H
MOV BX,OFFSET BUFF ?
MOV BX,01
4) LENGTH操作符
5) SIZE操作符
SIZE= TYPE× LENGTH
例,BUFF DB 10DIP(?)
MOV CX,LENGTH BUF
? MOV CX,10
MOV CX,SIZE BUF
? MOV CX,20
5,综合运算符 ( 合成操作符 )
1) PTR运算符
格式,类型 PTR 表达式
例,INC WORD PTR [BX]
2) THIS操作符
格式,THIS 类型 (或属性 )
例,FIRST EQU THIS BYTE
SECOND DW 100 DUP (?)
4,4汇编语言程序设计
常用的汇编语言程序框架:
DATA SEGMENT ; 定义数据段
VAL1 DB 12H,8EH ; 定义变量
……
DATA ENDS ; 数据段结束
CODE SEGMENT ; 定义代码段
ASSUME DS:DATA,CS,CODE ; 段属性说明
START,MOV AX,DATA ; 初始化 DS
MOV DS,AX
……
MOV AX,4C00H ; 返回 DOS
INT 21H
CODE ENDS ; 代码段结束
END START ; 源程序结束
一、汇编语言程序设计基本步骤
分析问题- > 绘制流程图- >编写程
序- >检查和调试
二、汇编语言程序的基本结构
1,顺序结构
? 2、分支结构
3、循环结构
? 4、子程序
Call proc1
ret
4,5 宏定义与宏调用
1,宏定义
宏指令名 MACRO <形式参量表 >


ENDM
2,宏调用
宏指令名 实元表
例,
MULTY MACRO OPR1,OPR2,RESULT ;宏定义
PUSH AX
MOV AL,OPR1
MOV AH,OPR2
IMUL OPR2
MOV RESULT,AX
POP AX
ENDM
……
DATA SEGMENT
XX DB 12
YY DB 34
ZZ DW?
……
MULTY XX,YY,ZZ ;宏调用, 实参替代虚参
……
4.6汇编语言程序设计实例
1、算术运算例题
例 1:在偏移首地址为 ARRAY的内存储区,有
100个字型数据,要求将数组的每个元素加 1,
试编写汇编语言程序完成该要求。
DATA SEGMENT
ARRAY DW 100 DUP (?) ;定义 100个字型随机数
DATA EDNS
CODE SEGMENT
ASSUME DS,DATA,CS,CODE
……
LEA BX,ARRAY ; 设数组首地址指针
MOV CX,LENGTH ARRAY ;数组数据长
AA1,INC WORD PTR [BX],1 ;指定为字型数加 1
ADD BX,2 ;移动地址指针
LOOP AA1 ; 循环操作
……
完整程序请参看教材
例 2,有两个无符号字节型数组,设数组元素个
数相等,编程将数组中的对应元素相加,结
果存入另一内存区。
DATA SEGMENT
M1 DB 20 DUP (?)
M2 DB 20 DUP(?)
M3 DW 20 DUP (0)
DATA ENDS
CODE SEGMENT
……
……
LEA SI,M1 ; 设数组 1的地址指针
LEA DI,M2 ; 设数组 2的地址指针
LEA BX,M3 ; 设结果区的地址指针
MOV CX,20
AA1,MOV AL,[SI]
ADD AL,[DI]
MOV [BX],AL
ADC BYTE PTR[BX+1],0 ; 存结果的进位
INC SI
INC DI
ADD BX,2
LOOP AA1
……
2,逻辑处理题
例 1:将寄存器 AL中高, 低 4位交换
……
MOV AL,0ABH
MOV CL,4
ROL AL,CL ; 移出位补充移空位 4次
……
例 2:将 AX中的内容按相反顺序存入 BX

……
MOV AL,1234H
MOV CX,16
AA1,SHL AX,1 ;移出的位进到 CF
RCR BX,1 ; AX中移出的位进入 BX
LOOP AA1
……
3、代码转换例题
例 1:编程将以 $结束的字符串中的小写
字母改为大写字母 。
DATA SEGMENT
STR DB ‘heLLo,eveRyboBY !’,’$’
DATA ENDS
……
LEA BX,STR
A1,MOV AL,[BX]
CMP AL,‘$’ ;是 $符, 则结束
JE DONE
CMP AL,‘a’
JB NEXT ; 低于, 则为大写字母
CMP AL,’z’
JA NEXT ; 高于, 则不是字母
SUB AL,20H ; 将小写字母改为大写
MOV [BX],AL
NEXT,INC BX
JMP A1
……
例 2:十六进制数到十进制数的转换 。
除 10取余法
……
MOV AX,4B6CH
MOV CX,0 ;统计除法次数
MOV BX,10 ;
A1,MOV DX,0 ; 被除数扩展为 32位
DIV BX
PUSH DX ; 将转换好的数存入堆栈
INC CX
OR AX,AX ;转换直到商为 0
JNZ A1
……
?4,表格处理题
例 1:编程序将 0- 9的数字转换成所要求的密码
明码和密码的映射关系为:
0 1 2 3 4 5 6 7 8 9
2 7 1 6 9 0 8 3 4 5
DATA SEGMENT
TABLE DB 2,7,1,6,9,0,8,3,4,5 ; 密码表
VAL1 DB 8,4,1,7,5 ; 被加密码 ( 明码 )
VAL2 DB 5 DUP(?)
DATA ENDS
……
……
MOV SI,OFFSET VAL1
MOV DI,OFFSET VAL2
MOV CX,5
LEA BX,TABLE ; 表格首地址指针
A1,MOV AL,[SI ] ;取明码
XLAT ; 转换为密码
MOV [DI],AL
INC SI
INC DI
LOOP A1
……
6、按数据大小排序题
例 1:编程序实现, 从一串带符号字
型数据中找出最大值 。
DATA SEGMENT
BLOCK DW 762EH,6A8BH,- 664AH,0B945H,
- 85DH
COUNT EQU ( $- BLOCK) / 2
DATA ENDS
……
LEA SI,BLOCK
MOV CX,COUNT
MOV AX,[SI] ;取第 1个数
DEC CX ;准备与下个数比较
AA1,ADD SI,2
CMP AX,[SI] ; 与下个数比较
JG AA2 ; 前一个数大, 则保留下次再比
MOV AX,[SI] ; 否则, 取后一个数下次再比
AA2,LOOP AA1
……
4.7 DOS功能调用与子程序设计
调用过程为:
⑴ DOS功能调用号送 AH寄存器;
⑵ 如果需要, 按要求给定输入参数 ( 有的不需
要输入参数 ) ;
⑶ 写入中断指令 INT 21H。
调用结束, 按功能使用其输出参数 。
1,单字符输入- 1号
功 能:从键盘输入 1个字符
输入参数:无
输出参数,AL=ASCII码
2,单字符输出- 2号
功 能:在屏幕上显示 1个字符 ( ASCII码 )
输入参数,DL=ASCII码
输出参数:无
例,从键盘输入两个 1位十进制数,求两
数之和并在屏幕上显示结果。
MOV AH,1 ; DOS调用输入第一个数
INT 21H
MOV BL,AL ;保存输入的第一个数
MOV AH,1
INT 21H
ADD AL,BL ;两个 ASCII码相加
AAA ; 调整加法结果为非压缩 BCD数
MOV DL,AL
ADD DL,30H ; 加法结果转换成 ASCII码
MOV AH,2 ; DOS调用输出到屏幕
INT 21H
3、多字符输入- 0AH
功 能,多个字符输入到缓冲区
输入参数,DS:DX=输入缓冲区首地址
输出参数,DS:DX=输入字符串所在缓冲区
地址
4、多字符输出- 9号
功 能:多个字符输出到屏幕显示
输入参数,DS:DX=输出字符缓冲区首地址
输出参数:无
例 1:在屏幕上显示一串字符 。
DATA SEGMENT
BUFF DB ‘How do you do?’,0DH,0AH,’$’
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START,MOV AX,DATA
MOV DS,AX
LEA DX,BUFF
MOV AH,9
INT 21H
……
5、单字符输入 /输出- 6号
6号 DOS功能实际上是 1号和 2号功能的
组合,当 DL寄存器的内容为 0FFH时,6
号功能与 1号功能同,即从键盘输入单个
字符;而当 DL寄存器中放入字符的
ASCII值,它就是 2号功能。
6、过程终止- 4CH号
该调用的功能是结束当前程序,并返
回调用它的程序,如在 DEBUG状态下运
行,则返回 DEBUG;如果在 DOS下运行,
则返回 DOS。在汇编语言程序结束处放
上 MOV AX,4C00H和 INT 21H两条指令,
以利于程序执行完毕,返回操作系统控
制。
7、子程序设计
设计子程序要提供以下信息:
⑴ 子程序的功能
⑵ 调用时需要的输入参数 ( 入口参数 )
⑶ 调用后提供的输出参数 ( 出口参数 )
⑷ 子程序中所使用的寄存器 ( 以便调用
前做必要的保护 )
例 1:编写一子程序, 完成一个 2位十六进
制数到对应的 ASCII码的转换 。
子程序名, CONHA
功 能,将 2位十六进制数转换成对应
的 ASCCII码
输入参数,AL= 待转换的数
输出参数,BX= 转换好的 ASCII码
使用寄存器,AL,AH,BX,CL
CONHA PROC FAR
MOV AH,AL ;保存待转换的数
AND AL,0FH ;处理十六进制数低位
CMP AL,0AH ;是 16进制中的字母吗?
JB ASC1 ;否, 转移
ADD AL,07 ;是, 先加 7
ASC1,ADD AL,30H ;转换为 ASCII码
MOV BL,AL ;保存转换好的低位
MOV CL,4 ; 移位控制
SHR AH,CL ;将原数右移,处理高位
CMP AH,0AH ;是 16进制中的字母吗?
JB ASC2 ;否, 转移
ADD AH,07 ;是, 先加 7
ASC2,ADD AH,30H
MOV BH,AH ; 保存转换好的高位
RET
CONHA ENDP
例 2:用子程序调用形式,编写从键盘输入
4位 16进制数的程序。
? 子程序名, ZH
? 功 能:检查键盘输入错误,将键入值转换成
16进制数
? 输入参数,AL
? 输出参数,AL
? 使用寄存器,BX,CX
CODE SEGMENT
ASSUME CS,CODE
START,MOV CX,4 ;输入 4次
MOV DX,CX ; 转换 4次
MOV BX,0 ;用 BX保存输入数
RE1,MOV AH,1 ; 从键盘输入
INT 21H
CALL ZH ;通过子程序转换
SHL BX,CL ;组合成 16进制数
ADD BL,AL
DEC DX
JNZ RE1 ;循环输入 4个数
MOV AX,4C00H
INT 21H
ZH PROC
CMP AL,‘9’;将 ASCII码转换为 16进制
JBE A2;键入值 ≤’9’(’ 0’-‘9’)则减 30H
CMP AL,‘a’;键入值<’ a’(‘A’-‘F’) 则减 37H
JB A1
SUB AL,20H;值在’ a’ -‘f’则先减 20H,再减 37H
A1,SUB AL,7
A2,SUB AL,30H
RET
ZH ENDP
CODE ENDS
END START