《微机原理汇编语言程序设计ppt课件.ppt》由会员分享,可在线阅读,更多相关《微机原理汇编语言程序设计ppt课件.ppt(63页珍藏版)》请在三一办公上搜索。
1、微机原理与接口技术,第四章 汇编语言程序设计,本章内容,4.1 概述4.2 汇编语言的格式与语法4.3 DOS与BIOS中断调用4.4 汇编语言程序设计和上机过程,4.1 概述-程序设计语言,机器语言:每种CPU都有自己独立的一套指令系统,其能直接理解和执行的是二进制机器码形式,这种二进制编码格式语言称为机器语言。特点是占内存少、执行速度快,但难以记忆、容易出错,实际中很少使用。例:89H,DCH汇编语言:用指令的助记符来表示二进制机器码的语言称为汇编语言,即是机器语言的符号表示。它是一种面向机器的程序设计语言,通常是为特定计算机或计算机系列专门设计的。特点是允许直接调用CPU内部资源,代码精
2、简,占内存少,执行速度快,但通用性差,编写、调试周期长。常用来编制系统软件、实时控制程序、实时通信程序及接口的驱动程序等。例:MOV SP,BX高级语言:是面向过程的语言(如:BASIC语言、C语言等),不依赖于具体的计算机结构和指令系统。特点是通用性强,可移植,但目标程序长,执行速度慢。,4.1 概述-汇编程序,用汇编语言编写的程序不能由机器直接执行,而必须经汇编程序(Assembler)翻译成机器语言程序常使用的汇编程序是Microsoft公司的宏汇编MASM,它可以将源程序翻译成对应的目标程序,并且: 检查语句语法 自动分配存储区 将其他进制转换为二进制数 计算表达式的值 展开宏命令,4
3、.2 汇编语言的格式与语法,4.2.1 源程序的结构4.2.2 语句的格式与构成元素4.2.3 语句的操作数4.2.3.1 常量4.2.3.2 变量和标号4.2.3.3 表达式4.2.4 伪指令4.2.5 宏指令,4.2.1 源程序的结构,汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由三种逻辑段组成: 数据段、附加段定义和存放数据、变量 堆栈段堆栈区域 代码段存放程序指令,4.2.1 源程序的结构,NAMEPROGRAM MOV AX, EXTRASTACKSEGMENT STACK MOV ES, AXSTA DB 100 DUP(?)STACKENDSMOV AX, OFFSE
4、T SDAT; -CALL P1DATASEGMENTSDATDB 1,2,3,4,5MOV AH, 4CHDATAENDSINT 21H; -MAINENDPEXTRASEGMENT; -DDATDB 5 DUP(?)P1PROCEXTRAENDS; -RETCODESEGMENTP1ENDPASSUME CS:CODE, SS:STACK; -ASSUME DS:DATA, ES:EXTRACODEENDSMAINPROC FAR; -MOV AX, DATAENDMAINMOV DS, AX,堆栈段,数据段,扩展段,代码段,代码段,4.2.1 语句的格式,汇编语言的语句有两种:指令性语句
5、:由8086指令构成的语句指示性语句:由伪指令构成的语句指令性语句由CPU执行,每一条指令性语句都有一条机器码指令与其对应,指令性语句汇编时生成机器码。指示性语句由汇编程序执行,它指示汇编程序应如何对源程序进行汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应,在汇编时不生成机器码。,标号:指令的符号地址,用来代表指令在存储器中的地址符号:段、过程、变量的名字,用来代表它们在存储器中的地址指令助记符:8086指令助记符、伪指令助记符操作数:即指令的操作对象对指令性语句:0,1,2个对指示性语句:根据需要而定操作数之间以逗号分隔操作数可以由标号、常量、变量
6、、表达式、寄存器操作数和存储器操作数等构成 例如:AX,DI+BX+10,DATA,200,16*8+TABLE,等等,4.2.2 语句的构成元素,注释:以分号开头,可放在指令后,也可单独一行。注意注释的写法,要写指令(或程序段)在程序中的作用,而不要写指令的操作。例如:以下为同一条指令写的注释 1)MOV CX, 100 ;传送100到CX 2)MOV CX, 100 ;循环计数器置初值显然,第二种写法要比第一种写法要好,4.2.2 语句的构成元素,4.2.3 语句的操作数,4.2.3.1 常量4.2.3.2 变量和标号4.2.3.3 表达式,4.2.3.1 常量,常量操作数:数值常数:11
7、001000B,0FA21H,329D(329)字符常数:ABCD (41H 42H 43H 44H)例:MOV AX, 0FA21H VAR DB 329STR DB ABCD,变量:指存储器存储单元中的数据,数据运行时可改变变量名:是存储单元的符号地址变量在程序中作为存储器操作数被引用变量有三个属性:段地址:变量所在段的段地址偏移地址:变量所在存储单元的偏移地址类 型:有BYTE、WORD和DWORD等例:MOV AX,VAR PUSH VAR,4.2.3.2 变量与标号-变量,标号:指令所在存储单元的符号地址 标号的三个属性:段地址:即标号所在段的段地址;偏移量:标号所代表存储单元的段内
8、偏移地址;类 型: NEAR或FAR:NEAR:段内转移或段内调用FAR: 段间转移或段间调用 标号通常作为转移指令的转移地址 JMP label JNZ non_zero,4.2.3.2 变量与标号-标号,组成:A-Z(不分大小写), 0-9, ? . _ $不能以数字开头,句号(.)只能作为首字符长度小于31个字符不能与保留字(指令助记符、伪指令、预定义符号等)重名不能重复定义 例如: 正确的:LP1, AGAIN, NEXT, _GO, OK_1 错误的:4M, LOOP, AAA, #HELP, +ONE,4.2.3.2 变量与标号-命名规则,4.2.3.3 表达式,表达式由标号、常量
9、、变量等加上必要的运算符构成有数字表达式和地址表达式两种汇编时按优先规则对表达式进行计算,计算出具体的数值或地址,运行时不能改变表达式中的运算符包括:算术、逻辑、关系、分析以及属性运算符等,算术运算符包括:加:,减:,乘:*,除: /,取模: MOD 例: MOV AX, 4*1024 汇编后的形式为: MOV AX, 4096 逻辑运算符包括: 与:AND、或:OR、异或:XOR、非:NOT例:MOV CL, 36H AND 0FH 经汇编后:MOV CL, 06H逻辑运算符只能用于数字表达式中。注意,不要把逻辑运算符与逻辑运算指令混淆:例:AND AX, 3FC0H AND 0FF00H
10、汇编后源操作数被翻译为:3F00H, 所以上述指令与以下指令等价: AND AX, 3F00H,4.2.3.3 表达式算术运算符,分析运算符包括:SEG、OFFSETSEG:取变量/标号的段地址OFFSET:取变量/标号的偏移地址 例:VAR DB 12H MOV BX,OFFSET VAR ;取变量VAR的偏移地址 MOV AX,SEG VAR ;取变量VAR的段地址SEG 、OFFSET运算符在汇编过程取相应地址,4.2.3.3 表达式分析运算符,4.2.3.3 表达式属性运算符PTR,属性运算符PTR用来指定地址操作数的类型 格式: PTR 类型BYTE, WORD, DWORD, NE
11、AR, FAR BYTE、WORD、DWORD 用于描述数据存储单元(变量)地址 例: MOV WORD PTRBX,03H NEAR、FAR 用于描述转移、调用的目的地址 例:JMP FAR PTR LABEL1,例: MOV DI, 0 ;类型不定 MOV BYTE PTRDI, 0 ;字节类型 MOV WORD PTRDI, 0 ;字类型,4.2.3.3 表达式属性运算符PTR,4.2.3.3 表达式属性运算符PTR,PTR也可用来进行强制类型转换例:VAR DW 1234H ;VAR定义为字类型 MOV AX, VAR1 ;合法 MOV AL, VAR1 ;非法 MOV AL, BYT
12、E PTR VAR1 ;合法,4.2 汇编语言的格式与语法,4.2.1 源程序的结构4.2.2 语句的格式与构成元素4.2.3 语句的操作数4.2.3.1 常量4.2.3.2 变量和标号4.2.3.3 表达式4.2.4 伪指令4.2.5 宏指令,4.2.4 伪指令,伪指令由汇编程序执行的指令,它本身不被汇编成机器指令。常用的伪指令有:数据定义伪指令符号定义伪指令段定义伪指令过程定义伪指令程序模块定义伪指令定义模块连接标号和变量的伪指令,4.2.4 伪指令数据定义伪指令,用于对程序中使用的变量进行定义通过变量定义指明变量的类型,并为其分配存储单元。数据定义伪指令的格式为: 变量名 数据定义伪指令
13、 操作数, 操作数, VAR DW 1234H常用的数据定义伪指令有如下几种: DB 定义字节 DW 定义字 DD 定义双字 DQ 定义4字型变量 (占8字节存储空间) DT 定义10字节变量(表示BCD码,或用于浮点运算)数据定义伪指令中的操作数可以是常数、变量或表达式,DATA1_B DB 10DATA2_B DB 5DATA3_B DB 10HDATA1_W DW 100HDATA2_W DW -4DATA_D DD 0FFFBH汇编后的内存分配情况如右图所示。,Q,数据定义伪指令-例1,操作数可以是字符串,使用DB,DW 例 STR_DB DB HELLO STR_DW DW AB,C
14、D 汇编后的情况如图:,注意下面两个定义的不同之处: STR_DB DB AB ;41H在低字节,42H在高字节 STR_DW DW AB ;42H在低字节,41H在高字节,数据定义伪指令-例2,? 用来分配存储空间,但不置初值 例1:RSV DB ? 复制操作符 DUP: 重复的数据可以使用复制操作符DUP,如上面RSV亦可写成: 例2: STR DB 10 DUP (A) DATA DB 10 DUP( 30H,9 DUP (20H) ) 若操作数中若使用$, 则表示的是地址计数器的当前值。 例3 BUF DW 0A32H, $, $+3 数据元素的初值: ADDR+1, (ADDR+2)
15、+3,4.2.4 伪指令数据定义伪指令:?、DUP、$,例: TABLE DB 10 DUP(?) BUFFER DW TABLE, $+3设TABLE的偏移地址为0080H,则汇编后如下图所示:,数据定义伪指令-例3,4.2.4 伪指令符号定义伪指令:EQU,将一个表达式用一个符号表示,以后凡出现该表达式的地方都可用这个符号表示类似于C语言中的#define汇编时,符号被符号代表的内容替换 例: COUNT EQU CX TEN EQU 10 MOV COUNT,TEN 汇编后: MOV CX,10,4.2.4 伪指令段定义伪指令,汇编语言程序是按段来组织程序和数据的,段的划分与存储器的物理
16、段相对应。汇编语言程序中的段称为逻辑段,汇编连接后被映射到相应的物理段中。逻辑段共分为:代码段、堆栈段、数据段和附加段段定义伪指令:SEGMENT、ENDS、ASSUME、ORG定义一个段的基本格式: 段名 SEGMENT 定位类型组合方式类别 段名 ENDS,SEGMENT和ENDS成对出现,二者前面的段名应一致伪指令SEGMENT说明了一个段的开始伪指令ENDS说明了一个段的结束数据段用于对程序中使用的变量进行定义,堆栈段用于对堆栈进行定义,数据段和堆栈段由指示性语句构成;代码段由指令性语句构成。 例如: data_seg SEGMENT data_seg ENDS,4.2.4 伪指令SE
17、GMENT和ENDS,4.2.4 伪指令ASSUME伪指令,ASSUME伪指令用于明确段和段寄存器的关系,例如 ASSUME CS:code_seg, DS:data_seg, SS:stack_seg语句中的code_seg、data_seg、stack_seg为段名语句的作用为:CS将指向段名为 code_seg 的代码段DS和ES将指向段名为 data_seg 的数据段SS将指向段名为 stack_seg 的堆栈段,ASSUME伪指令只是告知汇编程序段与段寄存器之间的对应关系,并没有给段寄存器赋予实际的初值,程序中需要通过下面的语句进行赋值: MOVAX, data_seg MOVDS,
18、AX MOVAX, stack_seg MOVSS,AX上述语句的作用是将段地址装入段寄存器。代码段段地址不需要程序员装入CS寄存器,而由系统负责装入。上述语句通常放置在代码段主程序的开始处。,4.2.4 伪指令ASSUME伪指令,伪指令ORG规定了段内的指令或数据存放的开始地址(偏移地址的初值),其格式为: ORG 表达式的值即为开始地址,从此地址起连续存放程序或数据。 例:ABC SEGMENT ORG 100H begin: ABC ENDS 语句“ORG 100H”表明段中第一个变量或第一条语句相对于段地址的偏移量为100H。,4.2.4 伪指令ORG伪指令,指令从100H开始存放,段
19、定义伪指令-例,DATAS SEGMENTSTR DB HELLOVAR DW 10H DATAS ENDSSTACKS SEGMENT STACKSTA DB 100 DUP (?)TOP DW $STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS ORG 100HSTART: MOV AX,DATAS MOV DS,AX MOV AX,STACKS MOV SS,AX MOV SP,TOP . CODES ENDS END START,过程定义伪指令的格式为 格式: 过程名 PROC 类型 RET 过程名 ENDP说明:P
20、ROC表示过程的开始,ENDP表示过程的结束在过程中至少要有一个RET指令使其返回主程序每个过程要有一个过程名,通过该名其他程序可以调用该过程过程中有类型说明FAR或NEAR说明该过程是远过程还是近过程调用一个过程的格式为:CALL 过程名,4.2.4 伪指令过程定义伪指令,4.2.4 伪指令过程定义伪指令,MY_ADD PROC FAR PUSH AX PUSH BX MOV AX, BP-TYPE WORD MOV BX, BP-2*TYPE WORD ADD AX, BX MOV BX, BP-3*TYPE WORD MOV BX,AX POP BX POP AX RET 6 MY_AD
21、D ENDP,4.2.4 伪指令定义程序模块伪指令,功能:定义程序模块 格式:NAME 模块名 END 表达式模块名:由程序员命名,最多6个字符表达式:通常就是程序第一条指令的标号,指示程序的启动地址(要执行的第一条指令的地址)。,4.2.4 伪指令定义程序模块伪指令,伪指令END表示源程序到此结束,并可指出程序的启动地址。格式如下: END 标号/过程名模块结束语句放在源程序最后一行,表示程序到此结束,一个程序中必须有一个END语句,其中的标号或过程名给出了程序开始执行的启动单元地址,只有主模块才可有此选项当连接的多个模块中都没有给出启动地址,将从代码段的第一个字节处开始执行当有多个模块都指
22、定了启动地址,将从最后一条带标号的END语句指定的启动地址单元开始执行以上情况都可能导致程序的错误执行,编程时应予避免,本章内容,4.1 概述4.2 汇编语言的格式与语法4.3 DOS与BIOS中断调用4.4 汇编语言程序设计和上机过程,4.3 DOS与BIOS中断调用,8086微机系统开机过程:BIOS -DOSBIOS (Basic Input Output System): 装于从地址0FE00H开始的8k ROM中,提供了硬件系统的加电自检,操作系统的引导装入,主要I/O设备的处理程序及接口控制等功能模块。使用BIOS中断调用,使程序员不必了解硬件I/O的具体接口特性,可直接通过入口参
23、数来调用,给编程带来方便。DOS (Disk Operation System): DOS操作系统存放于硬盘等外存储器中,启动机器后被装入内存,DOS 中断对应于一组中断处理程序,这些子程序分别实现外设管理、文件读/写和管理、目录管理等功能。DOS中断通过调用BIOS中断来实现对外设硬件的控制。DOS中断比BIOS中断更容易使用,应列为首选;BIOS调用速度快,适用于访问高速外设。,DOS中断调用与BIOS中断调用的使用方法类似:设置入口参数设置功能号,通过设置AH寄存器通过 INT n 指令调用不同的中断服务程序BIOS中断调用:n = 05H1FHDOS中断调用: n = 20H3FH,其
24、中 INT 21H 为最常用的DOS中断调用例:屏幕输出字符MOV DL, ;设置入口参数,输出字符送DLMOV AH, 02H ;设置中断调用功能号=02HINT 21H ;调用INT 21H中断输出字符,4.3 DOS与BIOS中断调用,DOS INT 21H软中断有90多种功能,完成设备、目录和文件管理键盘输入并显示,功能号 = 01H MOV AH, 01H ;设置INT 21H中断调用功能号=01H INT 21H ;调用INT 21H中断,输入字符存入AL中屏幕输出一个字符,功能号 = 02H MOV DL, A ;待输出字符送DL MOV AH, 02H ;设置INT 21H中断
25、调用功能号=02H INT 21H ;调用INT 21H中断,屏幕输出字符,4.3 DOS中断调用 INT 21H,直接控制台输入输出,功能号 = 06H直接输入:DL=0FFH,表示从键盘输入字符ZF = 1,表示无键盘输入ZF = 0,表示有键盘输入,输入字符存放于AL中中断调用不等待键盘输入例:CHECK: MOV DL, 0FFH MOV AH, 06H INT 21H JZ CHECK ;判断有无键盘输入直接输出: DL0FFH,表示向屏幕输出显示字符,DL中存放的是待显示的字符: MOV DL, A MOV AH, 06H INT 21H,4.3 DOS中断调用 INT 21H,屏
26、幕输出显示字符串(以$结束),功能号 = 09H STRING DB HELLO, 0AH, 0DH, $ ; 0AH:ASCII码换行 ; 0DH:ASCII码回车 ; $字符串结束标志MOV DX, OFFSET STRING ;字符串首地址送DX MOV AH, 09H ;设置中断调用功能号=09H INT 21H ;屏幕输出显示字符串键盘输入字符串,功能号 = 0AH STRING DB 30, 31 DUP(?) ;串中第1个元素规定允许最多输入的字符数,此 ;处最多可输入30个字符(含回车), ;串中第2个元素保留,保存输入字符的个数 ;从第3个元素起为输入字符的缓冲区 MOV D
27、X, OFFSET STRING ;字符串首地址送DX MOV AH, 0AH ;设置中断调用功能号=0AH INT 21H ;键盘输入字符串,4.3 DOS中断调用 INT 21H,4.3 DOS中断调用 INT 21H,打印机打印一个字符,功能号 = 05H MOV DL, A ;待打印字符送DL MOV AH, 05H ;设置INT 21H中断调用功能号 INT 21H ;打印输出字符返回DOS系统,功能号 = 4CH MOV AH, 4CH ;设置INT 21H中断调用功能号 INT 21H ;返回DOS系统,BIOS 中断完成键盘、显示、磁盘和打印机等常用I/O的驱动。键盘输入,IN
28、T 16H,例: MOV AH, 0 ; 输入字符存入AL中 INT 16H MOV AH, 1 ; 查询键盘缓冲区,置标志ZF INT 16H MOV AH, 2 ; 功能键状态存入AL中 INT 16H屏幕显示,INT 10H,例:定位光标 MOV DH, 4 ;行数 MOV DL, 5 ;列数 MOV AH, 2 ;光标控制功能号 INT 10H ; 定位光标,4.3 BIOS中断调用,本章内容,4.1 概述4.2 汇编语言的格式与语法4.3 DOS与BIOS中断调用4.4 汇编语言程序设计与上机过程,模块化编程方法:将一个较复杂的任务划分成多个独立的程序模块,然后分别编制、调试形成目标
29、文件,最后将多个目标文件连接起来形成一个完整的可执行文件模块内程序的基本结构: 顺序结构: 完全按照程序指令编排的顺序依次执行 分支结构: 程序按逻辑条件进行判断,作出不同的处理 循环结构: 程序按所设置的条件,多次重复执行 主-子程序结构: 将一些通用性的程序作为子程序,供其它程序反复调用,4.5 汇编语言程序设计方法,4.5 汇编语言程序设计方法分支结构,C语言char a,b,resulta=4;b=5;if ( 0= a-b ) a=a+b;else a=b;result=a,汇编语言 MOV AL, 4 MOV BL, 5 CMP AL, BL JNZ UE ADD AL,BL JM
30、P NEXTUE: MOV AL,BLNEXT: MOV result,AL,汇编语言条件转移 JCC NEXT NEXT: 类似于: if() NEXT: .,4.5 汇编语言程序设计方法分支结构,实现条件转移的近转移或段间转移 JZ NEAR PTR LAB,方式1: JZ SHORT J1 JMP NEXTJ1: JMP NEAR PTR LAB NEXT: LAB: ,方式2: JNZ NEXT JMP NEAR PTR LAB NEXT: LAB: ,4.5 汇编语言程序设计方法循环结构,双重for循环 N EQU 30 ADDR DB N DUP(?) MOV CX, N DEC
31、CXLOOP1: MOV DI,CX MOV BX,0LOOP2: MOV AX,ADDRBX CMP AX,ADDRBX+1 JGE CONTINUE XCHG AX,ADDRBX+1 MOV ADDRBX,AXCONTINUE : INC BX LOOP LOOP2 MOV CX,DI LOOP LOOP1,WHILE循环 CYC: CMP JCC NEXT JMP CYC NEXT: .DO_WHILE循环 CYC: JCC CYC,4.5 汇编语言程序设计方法子程序设计,寄存器内容的保护和回复 SUBP PROC FAR PUSH AX PUSH BX PUSH CX PUSH DX
32、PUSH DX POP CX POP BX POP AX RET SUBP ENDP,主过程与子过程间的参数转递通过CPU内部寄存器通过堆栈传递,RET n通过内存变量传递的可以是参数本身或参数的地址(指针),4.5 汇编语言程序设计方法子程序设计,4.5 汇编语言程序设计方法子程序设计,MY_ADD PROC FAR PUSH AX PUSH BX MOV AX, BP-TYPE WORD MOV BX, BP-2*TYPE WORD ADD AX, BX MOV BX, BP-3*TYPE WORD MOV BX,AX POP BX POP AX RET 6 MY_ADD ENDP,dat
33、a_seg SEGMENT var1 DW 01H var2 DW 02H sum DW $ ;初值为变量偏移地址data_seg ENDScode_seg SEGMENT . MOV BP, SP PUSH var1 PUSH var2 PUSH sum CALL MY_ADD code_seg ENDSMY_ADD PROC FAR . MOV AX, BP-TYPE WORD MOV BX, BP-2*TYPE WORD ADD AX, BX MOV BX, BP-3*TYPE WORD RET 6 MY_ADD ENDP,.LST.CRF,.OBJ.LIB,.MAP.LIB,4.4 汇
34、编语言的上机过程,4.4 上机过程汇编与连接过程中产生的文件,.OBJ文件:目标文件.LST文件:同时列出汇编语言源程序和机器语言目标程序的文件。(默认无列表文件).CRF文件:列出程序中使用的符号、变量和标号以及引用情况。(默认无交叉索引文件).MAP文件:内存分配信息。(默认无列表文件).EXE文件:运行文件,Y,Y,Y,N,N,N,有错 ?,有错 ?,有错 ?,结束,汇 编,输入(修改)源程序,链 接,运 行,查 错,开始,用EDIT,NOTEPAD等任何文本编辑器。源程序存为.ASM文件,用MASM宏汇编程序进行汇编。汇编后生成.OBJ目标文件。命令格式:MASM ;,用LINK连接程
35、序进行连接。连接后生成.EXE可执行文件。命令格式:LINK ;,用TD、DEBUG等调试程序进行调试。命令格式:TD ,4.4 汇编语言的上机过程,4.4上机过程宏汇编的提示信息及回答,4.4上机过程LINK的提示信息及回答,调试程序:DEBUG DEBUG Prog.exe;将Prog.exe程序装入内存 -R;显示各寄存器内容 -P;单步执行 -T;单步执行,可进入子程序等内部 -D;显示内存单元内容 -E;修改内存单元内容 -G;断点执行 -U;反汇编 -Q;退出命令,4.4 汇编语言的上机过程,1、计算分析题: 设DS=2BC3H,数据段中符号定义如下, 试写出每个符号所对应值。DATA SEGMENTORG 1000HMAX EQU0FFFHVAL1 EQUMAX MOD 10HVAL2 EQUVAL1*2BUFSIZ EQU(VAL2 GT 10H) AND 10H)+10HBUFFER DBBUFSIZ DUP(41H, 61H)VAL3 EQU$ - BUFFERBUFEND EQUBUFFER+BUFSIZ-1DATA ENDS2、上机题: 见 上机作业.doc,习题:,