汇编语言的汇编处理过程 -...

55
第四章 汇编语言程序设计 几个概念 8086汇编语言的语句 8086汇编中的伪指令 8086汇编中的运算符 汇编语言程序设计 系统调用

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. 十进制到二进制