第四章 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,END 表示源代码结束格式为,END 常数或表达式,
四、过程定义语句过程名 PROC NEAR/FAR
……
RET
过程名 ENDP
4,3 8086汇编中的运算符一,常用运算符
1,算术运算符
+ ( 加 ),- ( 减 ),*( 乘 ),/
( 除 ),MOD( 求余 ) 。
2,逻辑运算符
AND,OR,XOR,NOT
3,关系运算符
EQ( 相等 ),NE( 不等,)
LT( 小于 ),GT( 大于 ),
LE( 小于等于 ),GE( 大于等于 ) 。
关系成立,全 1
关系不成立,全 0
例,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,TYPE 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,由已有的操作数建立新的操作数;
2,新操作数和已有的操作数类型不一样
1) PTR运算符格式,类型 PTR 表达式例,INC WORD PTR [BX]
wx dw 1234h
mov al,byte ptr wx
mov ah,byte ptr wx+1
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,编写程序?
5,检查和调试二、汇编语言程序的基本结构
1,顺序结构举例
完成
x1*x2?x3 x1:byte x2:word x3 34bit
2、分支结构举例
实现
10
00
10
x
yx
x



用查表法确定分支
a,对 8种产品进行编号 0,1,……7
b,每一个编号对应一个入口地址
proc0,proc1,……proc7
步骤:
a,把入口地址放在 Table开始的内存单元;
b,根据 key内容进行查表实现分支转移
3、循环结构举例
例 1、计算 y= 0+ 2+ 4+ …… + 1998
y?dxax
查找数组中是否由关键字,
有:变量 dd1= 1; dd2,关键字偏移量无:变量 dd1= 0
方法一、用 loopnz( loopne) 指令
方法二、用 loop指令
Call proc1
ret
实现方法
主程序有调用指令 call
子程序有返回指令 ret
特点
Call指令与 ret缺一不可
现场保护
入口出口参数设置
举例编写 AX*10?AX子程序
子程序编写
1、子程序组成
使用说明
a,子程序功能
b,使用寄存器情况
c,入口出口参数
程序体
入口出口参数传递
现场保护
功能程序段
2、现场保护和入口出口参数传递
( 1)、现场保护
方案一:在子程序中保护
方案二:在主程序中保护
( 2)、参数传递
寄存器传递
变量传递
堆栈传递
举例
1、数组元素求和
2、计算 N!
4.4 系统调用
一,PCDOS执行流程键盘命令命令处理程序文件管理基本输入 /输出
BIOS
用户程序用户程序
ROM
IBMBIO
IBMDOS
BIOS
IBMBIO
IBMDOS
二,DOS系统子程序功能
1、磁盘管理
2、内存管理
3、系统输入 /输出共 87个子程序
三、系统功能调用对 87个子程序进行编号,根据编号进行相关处理格式
1、入口参数
2、编号?ah
3,INT 21H
编号?ah
INT 21
ah=1
1号调用
ah=2
2号调用
常用的系统调用
1,1号调用-键盘输入
2,8号调用
3,5号调用-打印
4,6号调用-显示及输入
5,9号调用-输出字符
6,10号调用-输入字符串
4.5 宏定义与宏调用
一、宏定义和宏调用
1、格式宏指令名 macro [参数表 ]
… ;宏定义体
endm
2、优点
缩短源程序长度,但不减少代码长度;
程序易读
3、参数可以是多种形式
二、宏定义取消伪操作格式
purge 宏命令名 1,宏命令名 2,…
三、重复伪操作格式
rept <表达式 >;重复块
endm
四、不定重复伪操作格式
irp 形参,<参数表 >;重复块
endm
五、串重复伪操作格式
irpc 形参,<字符串 >;重复块
endm
条件汇编格式
if 表达式

else

endif
常用的汇编程序举例
1、找数组中的最大值
2、中值滤波
3、把一字节十六进制数转换为 ASCII码
4、排序
5、乘法
6、除法
7、二进制到十进制
8、十进制到二进制
编写子程序 bcddiv10,把 dx中的四位 bcd
码除 10,并四舍五入。