Upload
others
View
21
Download
0
Embed Size (px)
Citation preview
第四章 汇编语言程序设计
几个概念
8086汇编语言的语句
8086汇编中的伪指令
8086汇编中的运算符
汇编语言程序设计
系统调用
几个概念
1. 汇编语言
2. 汇编语言源程序
3. 汇编
4. 汇编程序
5. 什么是汇编语言(Assembly Language)?
6. 使用指令的助记符、符号地址和标号等编写的程序设计语言。
7. 每条指令都有对应的机器码,不同的CPU使用不同的汇编语言。
汇编语言的汇编处理过程
4.1 8086汇编语言格式
汇编语言由指令性语句和指令性语句组成
一、指令性语句格式
[标号:] 操作码 [操作数1,] [操作数2] ;[注释]
二、指示性语句格式
[标识符(名字)] 指示符(伪指令) 表达式
三、有关属性
标号/标识符:属性有三种:段值SEG、段内偏移量OFFSET和类型 (byte/word/dword/near/far… )
伪指令不象机器指令那样在程序运行期间由计算机来执行,它是在汇编程序对源程序汇编期间由汇编程序处理的操作。
4.2 8086汇编中的伪指令
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
4.2 8086汇编中的伪指令
二、变量定义语句
格式: 符号名 DB/DW/DD 表达式
符号名:
4.2 8086汇编中的伪指令
1、定义一组数据
例1: BUFF DW 1234H, 0ABCDH, 8EH
DW –79DH, 7B6AH
2、定义一串字符
例2: STR DB ‘ Welcome !’
3、定义保留存储单元
例3: SUM DW ? , ?
4.2 8086汇编中的伪指令
4、复制操作
复制操作符DUP(Duplication)可预置重复的数值例4: ALL_ZERO DB 0,0,0,0,0
用复制操作可改为:
ALL_ZERO DB 5 DUP(0)
5、将已定义的地址存入内存单元例5: LIT DD CYC ;此时存放的是cyc的地址
…
CYC: MOV AX , BX
4.2 8086汇编中的伪指令
三、段定义语句
1、 段定义语句格式:段名 SEGMENT [定位类型] [组合类型] [‘类别’]
……
段名 ENDS
只需要掌握
段名 SEGMENT
……
段名 ENDS
4.2 8086汇编中的伪指令
2、段假设语句
ASSUME 段寄存器名:段名[,…]
3、 ORG伪指令、地址计数器 $
ORG伪指令格式: ORG
4、END 表示源代码结束
格式为: END 常数或表达式
4.2 8086汇编中的伪指令
四、过程定义语句
过程名 PROC NEAR/FAR
……
RET
过程名 ENDP
4.2 8086汇编中的伪指令
4.3 8086汇编中的运算符
一、常用运算符
1、算术运算符
+(加)、-(减)、*(乘)、/(除)、MOD(求余)。
2、逻辑运算符
AND、OR、XOR、NOT
4.3 8086汇编中的运算符
3、关系运算符
EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)。
关系成立,全1
关系不成立,全0
例: MOV DL , 10H LT 16
MOV DL,0
例: AND AX , 555 GT 222
AND AX,0FFFFH
4.3 8086汇编中的运算符
二、 常用的操作符
4、分析操作符
1)SEG操作符
例: MOV AX , SEG BUFF
2)OFFSET操作符
例:MOV BX , OFFSET BUFF
4.3 8086汇编中的运算符
3)TYPE操作符
对于变量有3种:
1:字节型;2:字型; 4:双字型;
对于标号有2种:
-1:NEAR(段内),-2:FAR(段间)。
例: BUFF DB 20H
MOV BX ,TYPE BUFF
MOV BX,01
4.3 8086汇编中的运算符
4)LENGTH操作符
5)SIZE操作符
SIZE=TYPE×LENGTH
例:BUFF DB 10DIP(?)
MOV CX,LENGTH BUF
MOV CX,10
MOV CX,SIZE BUF
MOV CX,20
4.3 8086汇编中的运算符
5、综合运算符(合成操作符)
功能:1、由已有的内存操作数建立新的内存操作数
2、新操作数和已有的操作数类型不一样
1)PTR运算符
格式: 类型 PTR 表达式
例:INC WORD PTR [BX]
4.3 8086汇编中的运算符
5、综合运算符(合成操作符)
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 ;源程序结束
特点
程序分段
语句由指令性和指示性语句组成
两种程序框架
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 ;源程序结束
4.4 汇编语言程序设计
框架二:DATA SEGMENT ;定义数据段
VAL1 DB 12H , 8EH ;定义变量
……
DATA ENDS ;数据段结束
CODE SEGMENT ;定义代码段
MAIN PROC FAR
ASSUME DS:DATA , CS: CODE;段属性说明
START: PUSH DS
MOV AX , 0
PUSH AX
MOV AX,DATA
MOV DS,AX
…… ;填写代码
RET
MAIN ENDP
CODE ENDS ;代码段结束
END START ;源程序结束
4.4 汇编语言程序设计
一、汇编语言程序设计基本步骤
分析问题,确定模型
确定算法
绘制流程图
编写程序
检查和调试
4.4 汇编语言程序设计
1、顺序结构
4.4 汇编语言程序设计
举例
把al内容除2,并四舍五入
完成
x1*x2x3 x1:byte x2:word x3:32bit
4.4 汇编语言程序设计
2、分支结构
4.4 汇编语言程序设计
例:实现1 0
0 0
1 0
x
y x
x
4.4 汇编语言程序设计
用查表法确定分支
a、对8种产品进行编号0,1,……7
b、每一个编号对应一个入口地址
proc0,proc1,……proc7
步骤:
a、把入口地址放在Table开始的内存单元;
b、根据key内容进行查表实现分支转移
4.4 汇编语言程序设计
3、循环结构
4.4 汇编语言程序设计
3、循环结构
4.4 汇编语言程序设计
例1、计算y=0+2+4+……+1998
ydxax
查找数组中是否由关键字,
有:变量dd11;dd2关键字偏移量
无:变量dd10
方法一、用loop指令
方法二、用loopnz(loopne)指令
4.4 汇编语言程序设计
4、子程序
实现方法
主程序有调用指令call
子程序有返回指令ret
要求
Call指令与ret缺一不可
现场保护
入口出口参数设置
4.4 汇编语言程序设计
子程序编写
1、子程序组成
使用说明
a、子程序功能
b、使用寄存器情况
c、入口出口参数
程序体
入口出口参数传递
现场保护
功能程序段
4.4 汇编语言程序设计
;这是一个乘10子程序
;使用寄存器AX
;入口:AX,出口:AX
mul10 proc far
push bx ;保护现场
pushf
add ax,ax ;2ax
mov bx,ax ;2axbx
add ax,ax ;4ax
add ax,ax ;8ax
add ax,bx ;10ax
popf ;恢复现场
pop bx
ret
mul10 endp
4.4 汇编语言程序设计
2、现场保护和入口出口参数传递(1)、现场保护
方案一:在子程序中保护
灵活,不方便
方案二:在主程序中保护
方便,不灵活
(2)、参数传递
寄存器传递
变量传递
堆栈传递(一个例子)
4.4 汇编语言程序设计
一、PCDOS执行流程
4.5 DOS系统调用和BIOS中断调用
中断处理程序分类
1 8086 CPU可处理256类中断,利用INT n指令,可直接调用256个系统已编写好的中断处理程序。INT n指令中的类型号n=00~FFH;
2 n=00~04H为专用中断,处理除法错、单步、不可屏蔽中断NMI、断点、溢出中断;
3 n=10H~1AH、2FH、31H、33H为BIOS中断,即保存在系统ROM BIOS中的BIOS功能调用。
4 n=20H~2EH为DOS中断,应用DOS提供的功能程序来控制硬件,可对显示器、键盘、打印机、串行通信等字符设备提供输入输出服务。
4.5 DOS系统调用和BIOS中断调用
键盘命令
命令处理程序
文件管理
基本输入/输出
BIOS
用户程序
用户程序
ROM
IBMBIO
IBMDOS
4.5 DOS系统调用和BIOS中断调用
4.5 DOS系统调用和BIOS中断调用
二、DOS系统子程序功能
1、磁盘管理
2、内存管理
3、系统输入/输出
4.5 DOS系统调用和BIOS中断调用
4.5 DOS系统调用和BIOS中断调用
三、系统功能调用
调用过程为:⑴ DOS功能调用号送AH寄存器;
⑵ 如果需要,按要求给定输入参数(有的不需要输入参数);
⑶ 写入中断指令INT 21H。
调用结束,按功能使用其输出参数。
常用的系统调用
1、1号调用-键盘输入
2、8号调用-键盘输入
3、6号调用-显示及输入
4、9号调用-输出字符
5、10号调用-输入字符串
4.5 DOS系统调用和BIOS中断调用
1、单字符输入-1号
功能:从键盘输入1个字符
输入参数:无
输出参数:AL=ASCII码
4.5 DOS系统调用和BIOS中断调用
2、单字符输出-2号
功能:在屏幕上显示1个字符(ASCII码)
输入参数:DL=ASCII码
输出参数:无
4.5 DOS系统调用和BIOS中断调用
例:从键盘输入两个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
4.5 DOS系统调用和BIOS中断调用
3、多字符输出-9号
功能:多个字符输出到屏幕显示
输入参数:DS:DX=输出字符缓冲区首地址(‘$’结尾)
输出参数:无
4.5 DOS系统调用和BIOS中断调用
4、多字符输入-0AH
功能: 多个字符输入到缓冲区
输入参数:DS:DX=输入缓冲区首地址
输出参数:DS:DX=输入字符串所在缓冲区地址
4.5 DOS系统调用和BIOS中断调用
例:在屏幕上显示一串字符
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
……
4.5 DOS系统调用和BIOS中断调用
5、单字符输入/输出-6号
6号DOS功能实际上是1号和2号功能的组合,当DL寄存器的内容为0FFH时,6号功能与1号功能同,即从键盘输入单个字符;而当DL寄存器中放入字符的ASCII值,它就是2号功能。
4.5 DOS系统调用和BIOS中断调用
6、过程终止-4CH号
该调用的功能是结束当前程序,并返回调用它的程序,如在DEBUG状态下运行,则返回DEBUG;如果在DOS下运行,则返回DOS。在汇编语言程序结束处放上MOV AX ,4C00H和INT 21H两条指令,以利于程序执行完毕,返回操作系统控制。
4.5 DOS系统调用和BIOS中断调用
4.5 DOS系统调用和BIOS中断调用
ROM BIOS中断调用的方法与DOS系统功能调用法类似,不过每个中断调用可能会包含多个子功能,用功能号来区分它们。BIOS中断调用的基本步骤为:
1)功能号送AH2)设置入口参数3)执行INT n指令4)分析出口参数及状态
1.键盘中断调用INT 16H
2.打印机中断调用INT 17H
3.显示中断调用INT 10H
4.鼠标中断功能调用INT 33H
4.5 DOS系统调用和BIOS中断调用
编程举例
1. 找最大值
2. 中值滤波
3. 排序
4. 乘法
5. 除法
6. 二进制到十进制
7. 十进制到二进制