汇编语言的汇编处理过程 -...
Transcript of 汇编语言的汇编处理过程 -...
-
第四章 汇编语言程序设计
几个概念
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. 十进制到二进制