微机原理与接口技术(第3版)彭虎-第4章 8086汇编语言程序设计.ppt_第1页
微机原理与接口技术(第3版)彭虎-第4章 8086汇编语言程序设计.ppt_第2页
微机原理与接口技术(第3版)彭虎-第4章 8086汇编语言程序设计.ppt_第3页
微机原理与接口技术(第3版)彭虎-第4章 8086汇编语言程序设计.ppt_第4页
微机原理与接口技术(第3版)彭虎-第4章 8086汇编语言程序设计.ppt_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、“十一五”国家级规划教材,微机原理与接口技术 (第3版),第4章,8086汇编语言程序设计,本章主要内容,8086 汇编语言中的伪指令,宏定义与宏调用,概述,汇编语言:用指令的助记符、符号地址、标号等书写程序的语言。用助记符来表示指令的操作码和操作数,用符号或标号代表地址、常量和变量。 用汇编语言编写的程序称为汇编语言程序或源程序(Source Program)。 源程序文件名后缀:.asm(不区分大小写) 汇编语言源程序不能直接在计算机上运行,需要将它翻译成机器语言程序,即目标程序(Object Program)。 目标程序文件名后缀:.obj(不区分大小写),概述,汇编语言源程序目标程序的

2、这个翻译过程为汇编。 完成汇编任务的程序(软件)称为汇编程序。,汇编过程的含义如图:,概述,将汇编语言源程序翻译成目标代码程序; 按指令要求自动分配存储区(包括程序区、数据区等); 自动把源程序中以各种进制表示的数据都转换成二进制形式的数据; 计算表达式的值; 对汇编语言源程序进行语法检查,并给出语法出错的提示信息。,汇编程序完成的任务,概述,汇编语言程序由若干个段组成。 按照各段功能的不同,分别有: 代码段、数据段、堆栈段和附加段 代码段是必须要定义的。,概述,【例5-1】若X、Y和RESULT为内存字单元的地址,请编写汇编程序,计算X+Y,并把和存入RESULT单元。 DATA SEGME

3、NT;段定义 X DW 2010H ;定义被加数 Y DW 2011H ;定义加数 RESULT DW ? ;分配和数存放单元 DATA ENDS ; 段定义结束,概述,说明哪个段是数据段,哪个段是代码段,程序运行结束,关闭并返回操作系统,给除CS以外的其他用到的段的段寄存器赋值,源程序结束,处理并存结果,CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,X ADD AX,Y MOV RESULT,AX MOV AH,4CH INT 21H CODE ENDS END START,4 8086 汇编语

4、言程序设计,4.1 8086 汇编语言的语句,指令性语句,指示性语句,例:MESSAGE DB THIS IS A SAMPLE PROGRAM. ;定义变量MESSAGE在数据段DATA中的存放形式,汇编时,汇编程序将MESSAGE定义为一个字节类型数据区的首地址,并按字节存储字符串。,4.1 8086 汇编语言的语句,1、指令性语句格式,4 8086 汇编语言程序设计, 表示可任选部分;,LOOPER: MOV AL,DATA2SI ;取一个字节加数 BB1:SHL AX, 1 ;将AX逻辑左移1位 LOOP BB1,标号: 操作码 操作数 ,操作数 ;注释,4.1 8086 汇编语言的语

5、句,1、指令性语句格式,4 8086 汇编语言程序设计, 表示可任选部分;,标号段: 可选项,后跟冒号,在程序中作为JMP、LOOP指令的转移目标,与具体的指令地址相联系。 在同一段程序中,同样的标号名只允许定义一次。 由字母(不分大小写)、数字及特殊符号组成,名字可以用除数字外所有的合法符号开头,名字的有效长度不超过31个英文字符。标识符不能是汇编语言中有特定意义的保留字、助记符、Reg等,标号: 操作码 操作数 ,操作数 ;注释,4.1 8086 汇编语言的语句,1、指令性语句格式,4 8086 汇编语言程序设计, 表示可任选部分;,标号段: 标号表示指令地址, 是指令符号地址, 一旦定义

6、了具有3种属性: 段地址属性: 标号所在段的段地址(16位数),在CS中 段内偏移量(或相对地址)属性:标号与CS段起始地址之间相距字节数,16位无符号数 类型属性:标号所代表的指令的转移范围,分NEAR(近)与FAR (远)两种。,标号: 操作码 操作数 ,操作数 ;注释,4.1 8086 汇编语言的语句,1、指令性语句格式,4 8086 汇编语言程序设计,标号段: 类型属性:代表的指令的转移范围,分NEAR(近)与FAR (远)两种 NEAR类型的标号仅在同一段内使用,用2字节指针给出转移的偏移量属性(即只改变IP值,不改变CS值); FAR类型的标号无此限制,必须用字节指针指出转移的段地

7、址与段内偏移量。 当标号用作JMP或CALL等指令的目标操作数时,若为段内转移或调用则采用NEAR类型;若为段间转移或调用则应当采用FAR类型。,标号: 操作码 操作数 ,操作数 ;注释,4 8086 汇编语言程序设计,操作码段: 包括8086 的指令助记符。 语句中唯一不可缺少的部分。 操作码助记符通常称为关键字或保留字,用户不能用这些字或词作为变量名、标号、标识符等。,4.1 8086 汇编语言的语句,1、指令性语句格式, 表示可任选部分;,标号: 操作码 操作数 ,操作数 ;注释,4 8086 汇编语言程序设计,操作数段: 表明操作的对象,操作数可以是常数、寄存器、标号、变量和表达式。

8、对于8086 的一般性执行指令,操作数表可以是一个或两个操作数。 若是两个操作数,用逗号隔开,则称左边操作数为目标操作数,右边操作数为源操作数。,4.1 8086 汇编语言的语句,1、指令性语句格式,标号: 操作码 操作数 ,操作数 ;注释, 表示可任选部分;,4 8086 汇编语言程序设计,操作数段: 表明操作的对象,操作数可以是常数、寄存器、标号、变量和表达式。,4.1 8086 汇编语言的语句,1、指令性语句格式,标号: 操作码 操作数 ,操作数 ;注释, 表示可任选部分;,操作数可能为以下几种情况: 常量操作数:如 34 等。 寄存器操作数:如 AX 等。 存储器操作数:如0100H

9、等。 表达式操作数:如AX+2、DAT+2、SEG NUM1等。,4 8086 汇编语言程序设计,注释段: 以“;”开始,用来简要说明该指令在程序中的作用(不是重复解释指令本身的功能),以便于程序的阅读、备忘和交流。,4.1 8086 汇编语言的语句,1、指令性语句格式,标号: 操作码 操作数 ,操作数 ;注释, 表示可任选部分;,4.1 8086 汇编语言的语句,2、指示性语句格式,4 8086 汇编语言程序设计, 表示可任选部分;,DATA1 DB 0F8H,60H,0ACH,74H,3BH;定义一组数据 DATA SEGMENT AA DB 20H,-30H ;在数据段定义一组字节数据

10、DATA ENDS,标识符(名字) 指示符(伪指令) 表达式 ;注释,4.1 8086 汇编语言的语句,2、指示性语句格式,4 8086 汇编语言程序设计, 表示可任选部分;,标识符段: 标识符由字母开头,由字母、数字、特殊字符(如?、下划线、等)组成的字符串。 标识符定义的为常量名、变量名、过程名、段名等。 默认情况下,汇编程序是不区分大、小写字母的 注意:名字的后面没有冒号,这是指示性语句同指令性语句在格式上的主要区别。,标识符(名字) 指示符(伪指令) 表达式 ;注释,4.1 8086 汇编语言的语句,2、指示性语句格式,4 8086 汇编语言程序设计,标识符段: 标识符, 具有3种属性

11、: 段地址属性: 标识符所在段的段地址(16位数) 段内偏移量(或相对地址)属性:标识符与段起始地址之间相距字节数,16位无符号数 类型属性:伪指令定义的变量的属性,指出变量所保留的字节数。BYTE(1字节的字节型), WORD(2字节的字型), DWORD(4字节的双字型) 。,标识符(名字) 指示符(伪指令) 表达式 ;注释,4.1 8086 汇编语言的语句,2、指示性语句格式,4 8086 汇编语言程序设计, 表示可任选部分;,指示符段: 指示符又称伪指令,由汇编程序执行的命令。 能将标识符定义为变量、程序段、常数、过程等,且给出其属性。,标识符(名字) 指示符(伪指令) 表达式 ;注释

12、,4.1 8086 汇编语言的语句,2、指示性语句格式,4 8086 汇编语言程序设计, 表示可任选部分;,表达式段: 是常数、寄存器、标号、变量与一些操作符相结合的序列,可以有数字表达式和地址表达式两种。 在汇编期间,汇编程序按照一定的优先规则,对表达式进行计算后得到一个数值或一个地址。,标识符(名字) 指示符(伪指令) 表达式 ;注释,4.2 8086 汇编语言中的伪指令,4 8086 汇编语言程序设计,伪指令又称伪操作,在汇编程序的指示性语句中作为指示符。 伪指令可以对数据进行定义,为变量分配存储区域,定义一个程序段或一个过程,指示程序结束等。 有符号定义语句、变量义语句、段定义语句、过

13、程定义语句、结束语句等。,4.2.1 符号定义语句,4.2 8086 汇编语言中的伪指令,1 等值语句,格式: 符号名 EQU 表达式 表达式可以是一个常数、已定义的符号、数值表达式或地址表达式。 功能:给表达式赋予一个名字。定义后,可用名字代替表达式。在同一源程序中,一个符号名只能用EQU定义一次。,例 PORT EQU 1234 ;常量 BUFF EQU PORT+58 ;数值表达式 MEM EQU DS:BP+20H ;地址表达式 COUNT EQU CX ;变量 ABC EQU AAA ;指令助记符 当程序中出现下面的语句时 MOV AX, PORT = MOV AX, 1234 MO

14、V BX, BUFF = MOV BX, 1292 B EQU BP+8 B EQU 20H 不行!,4.2 8086 汇编语言中的伪指令,4.2.1 符号定义语句,4.2 8086 汇编语言中的伪指令,2 等号语句,格式: 符号名 = 表达式 表达式可以是一个常数、已定义的符号、数值表达式或地址表达式。 功能:与EQU基本相同,区别是它可以对同一个名字重新定义。,例 NMU = 34 NUM = 34+1,4.2.2 变量定义语句,4.2 8086 汇编语言中的伪指令,用于定义变量(程序中所用的存储器操作数),指定变量的类型和名称,并为其分配存储单元和预置初值。 格式: 符号名 DB/DW/

15、DD 表达式 功能:当一个符号名用伪指令DB、DW或DD定义后,称为变量。 DB 变量为字节数据类型(8位)。 DW 变量为字数据类型(16位) 。 DD 变量为双字数据类型(32位) 。,4.2.2 变量定义语句,4.2 8086 汇编语言中的伪指令,格式: 符号名 DB/DW/DD 表达式 变量定义后具有如下属性: 字节型、字型、双字型等数据类型。 分配内存单元。 存放时低字节数据存放在低地址单元,高字节数据存放在高地址单元。 变量定义一般在数据段中,故一个变量被定义后,具有段地址和段内偏移地址属性。,4.2.2 变量定义语句,4.2 8086 汇编语言中的伪指令,1、定义一组数据: 例如

16、: BUFF1 DW 1234H,OABCDH,8EH,-79DH BUFF2 DB 12H,34H,CDH,8EH,MOV AX, BUFF1 MOV BX, BUFF1+2 MOV DL, BUFF2,MOV AX, 0000H MOV BX, 0002H MOV DL, 0008H,MOV AL, BUFF1 ; 类型不匹配 MOV DX, BUFF2 ;,34,12,CD,AB,8E,00,63,F8,12,34,CD,8E,0000H,0001H,0002H,0003H,0004H,0005H,0006H,0007H,0008H,0009H,000AH,000BH,BUFF1,BUF

17、F2,1234H,0ABCDH,8EH,-79DH,4.2.2 变量定义语句,4.2 8086 汇编语言中的伪指令,2、定义一串字符: 例如: STR DB Welcome! 每个字符的值为它的ASCII码值,所以 用DB来定义。,字符 ASCII码 W 57H e 65H l 6CH c 63H o 6FH m 6DH e 65H ! 22H,57,65,6C,63,6F,6D,65,22,STR,W,e,l,c,o,m,e,!,4.2.2 变量定义语句,4.2 8086 汇编语言中的伪指令,3、定义保留存储单元: 预留内存单元,但不赋值,以存放运算结果。当没有特定赋值时,其中有随机值。 S

18、UM DW ?,? A DB ? B DB ?,4.2.2 变量定义语句,4.2 8086 汇编语言中的伪指令,4、复制操作: 复制操作符 DUP 可以预置重复的数值。 DUP之前的数字表示重复次数,DUP后括号内位重复的内容。 ALL_ZERO DB 0,0,0,0,0 等效为: ALL_ZERO DB 5 DUP(0) 例: BUFFER DB 10 DUP(?) ;分配10个字节,初值不确定 ALL_ZERO DW 100 DUP(0) ;分配100个字,初值都为0 STRING DB 4 DUP(ABC) ;连续分配4个ABC字符串,4.2.2 变量定义语句,4.2 8086 汇编语言

19、中的伪指令,5、将已定义的地址存入内存单元: 定义过的标号或用PROC过程定义过的过程名,都有段地址和段内偏移地址属性。若希望将变量、标号或过程名的段地址和偏移地址保存到存储单元,可用下列方式完成: 例如: LIT DD CYC CYC: MOV AX, BX ;将CYC的段地址和偏移地址保存到存储单元LIT开始 的4个字节单元中。,4.2.3 段定义语句,4.2 8086 汇编语言中的伪指令,一个汇编语言是有若干个逻辑段组成。所有的指令、变量均分别放在各个逻辑段中。段定义语句的用途是在汇编语言源程序中定义逻辑段。 段定义语句可按段来组织和使用存储器。这些语句包括:SEGMENT、ENDS、A

20、SSUME、ORG等。,4.2.3 段定义语句,4.2 8086 汇编语言中的伪指令,1、段定义语句格式,格式: 段名 SEGMENT 定位类型组合类型类别 段名 ENDS 功能:定义一个逻辑段。 SEGMENT和ENDS必须成对使用,它们前面的段名必须是相同的。 SEGMENT后面中括号中的内容为可选项,告诉汇编程序和连接程序如何确定段的边界、如何连接几个程序模块。,4.2.3 段定义语句,4.2 8086 汇编语言中的伪指令,1、段定义语句格式,定位类型:定位类型说明段的起始地址应有怎样的边界值,有以下4种。,4.2.3 段定义语句,4.2 8086 汇编语言中的伪指令,1、段定义语句格式

21、,组合类型:说明链接不同模块中的同名段时采用的方式,有以下6种。 NONE:不组合,该段与其他段逻辑上不发生关系,即使同名,各段拥有各自的段基值。组合类型的默认值为NONE。 STACK:本段与其他模块中说明为STACK的同名的堆栈段链接起来,公用一个段地址,形成一个新的逻辑段。同时,系统自动初始化SS及SP。 PUBLIC:本段与其他模块中说明为PUBLIC的同名同类别的段链接起来,公用一个段地址,形成一个新的逻辑段,所以偏移量调整为相对于新逻辑段起始地址的值。,4.2.3 段定义语句,4.2 8086 汇编语言中的伪指令,1、段定义语句格式,组合类型:说明链接不同模块中的同名段时采用的方式

22、,有以下6种。 MEMORY:与PUBLIC同义,只不过MEMORY定义的段装在所有同名段的最后。若连接时出现多个MEMORY,则最先遇到的段按组合类型MEMORY处理,其他段组合类型按PUBLIC处理。 COMMON:同名段从同一个内存地址开始装入。所以,各个逻辑段将发生覆盖。连接以后,该段长度取决于同名段中最长的那个,而内容有效的是最后装入的那个。 AT exp:段地址为表达式exp的值(长度为16位)。此项不能用于代码段。例如:AT 0530H,表示本段从物理地址0530H开始。,4.2.3 段定义语句,4.2 8086 汇编语言中的伪指令,1、段定义语句格式,类别:说明链接不同模块中的

23、同名段时采用的方式,有以下6种。 类别名必须用单引号括起来。 类别的作用是在连接时决定各逻辑段的装入顺序。 当几个程序模块进行连接时,其中具有相同类别名的段,按出现的先后顺序被装入连续的内存区。 没有类别名的段,与其他无类别名的段一起连续装入内存。 典型的类型名有:“STACK”,“CODE”,“DATA”。,4.2.3 段定义语句,4.2 8086 汇编语言中的伪指令,2、段假设语句ASSUME,格式: ASSUME 段寄存器名:段名,段寄存器名:段名 段寄存器可以是:CS、DS、ES、SS。 段名为已定义的段。 凡是程序中使用的段,都应说明它与段寄存器之间的对应关系。 功能:用于明确段与段

24、寄存器的关系。,例: ASSUME CS: SEGA, DS: SEGB, SS: NOTHING,4.2.3 段定义语句,4.2 8086 汇编语言中的伪指令,2、段假设语句ASSUME,格式: ASSUME 段寄存器名:段名,段寄存器名:段名 使用说明: ASSUME伪指令只是指示各逻辑段使用段寄存器的情况,并没有对段寄存器的内容进行赋值。 DS、ES的值必须在程序段中用指令语句进行赋值,而CS、SS由系统负责设置,程序中也可对SS进行赋值,但不允许对CS赋值。,4.2.3 段定义语句,4.2 8086 汇编语言中的伪指令,3、ORG伪指令与地址计数器,在汇编程序中,有一个软件计数器(LC

25、)地址计数器。在每个段定义开始处,它被复位为0。当汇编程序逐行扫描语句时,用LC保存当前指令的地址。 格式1: ORG 格式2: ORG $+表达式 使用说明: 强行指定地址计数器LC的当前值,在段内改变它以后的代码或数据存放的偏移地址。 ORG语句之后段内所有的代码或数据均以表达式(常量)的值为起始偏移量连续存放,除非遇到另一个ORG语句。 此语句本身并不占内存。,4.2 8086 汇编语言中的伪指令,A5,47,C9,23,01,56,0010H,0011H,0014H,0015H,0016H,001EH,001FH,0020H,47A5H,0C956H,0123H,例 MY_DATA S

26、EGMENT ORG 10 DAT1 DW 47A5H ORG 20 DAT2 DW 0C956H ORG $+8 (跳过8个字节的存储区) DAT3 DW 0123H MY_DATA ENDS,16H+8=1EH,若省略ORG,则从本段起始地址开始连续存放,4.2.3 段定义语句,4.2 8086 汇编语言中的伪指令,4、PUBLIC和EXTRN伪指令,当一个程序由多个模块组成时,必须通过命令将各模块连接程一个完整的、可执行的程序。程序模块,是单独编译和汇编的,能够完成某个功能的程序,如主程序模块、各种功能的子程序模块。 由PUBLIC 说明的名字是全局的,可以在其他模块中使用, EXTRN

27、表明本模块中使用的名字在别的模块中定义过,且类型一致。 PUBLIC 和EXTRN配对使用。,4.2.3 段定义语句,4.2 8086 汇编语言中的伪指令,4、PUBLIC和EXTRN伪指令,(1)PUBLIC伪指令 格式: PUBLIC 名字, 使用说明: 名字可以是变量、符号常量、标号或过程名。 由PUBLIC定义的名字,可以被其他模块引用,即由其定义的名字是公共名字,可以被外部模块引用。,4.2.3 段定义语句,4.2 8086 汇编语言中的伪指令,4、PUBLIC和EXTRN伪指令,(1)EXTRN伪指令 格式1: EXTRN 名字:类型, 使用说明: 名字是在其他模块中已由PUBLI

28、C所定义。类型指的是名字的类型,应与原模块中定义的类型一致。可以是: 内存变量型:BYTE、WORD、DWORD 过程型:NEAR、FAR 数值型:ABS 定义本模块中将要引用的外部模块中的名字,它们应在各自的模块中已用PUBLIC伪指令进行了定义。,4.2.4 过程定义语句,4.2 8086 汇编语言中的伪指令,汇编语言中,用过程的定义来实现子程序功能。 过程是程序的一部分,它可以被程序调用。每次可调用一个过程,当过程中的指令执行完后,控制返回调用它的地方。过程的定义是用过程定义伪指令完成的。 格式: 过程名 PROC NEAR / FAR 过程体 RET 过程名 ENDP 功能:完成过程定

29、义,在过程体中实现过程的操作功能,4.2.4 过程定义语句,4.2 8086 汇编语言中的伪指令,格式: 过程名 PROC NEAR / FAR 过程体 RET 过程名 ENDP 功能:完成过程定义,在过程体中实现过程的操作功能 说明: PROC与ENDP必须成对出现,PROC开始一个过程,ENDP结束一个过程。成对的PROC与ENDP的前面必须有相同的过程名。 类型取值为:NEAR(为默认值)或FAR,表示该过程是段内调用或段间调用。 一个过程中,至少有一条过程返回指令RET,一般放在ENDP之前。 过程可以嵌套,但不可以交叉。,COD1SEGMENT ASSUME CS: COD1, ;

30、代码段中的其它语句(主程序) SUB1PROC FAR; 名为SUB1的FAR过程开始 RET; 返回 SUB1ENDP; SUB1结束 SUB2PROC ; 名为SUB2的NEAR过程开始 RET; 返回 SUB2ENDP; SUB2结束 ; 可能定义的其它过程 COD1ENDS; 代码段结束,4.2 8086 汇编语言中的伪指令,4.2.5 结束语句,4.2 8086 汇编语言中的伪指令,格式:END 标号 功能:表示源程序的结束。 标号指示程序开始执行的起始地址。如果多个程序模块相连接,则只有主程序要使用标号,其他子模块则只用END而不必指定标号。 END 是汇编语言源程序中最后一条语句

31、。,DATA SEGMENT ;定义数据段 D1 DB 5 DUP(?);连续的字节单元 CC EQU $D1;对单元计数 SUM DW 0;为结果保留一个字 DATA ENDS ;数据段定义结束 STACK SEGMENT PARA STACK STACK;定义堆栈段 DB 100 DUP (?);100字节的栈空间 STACK ENDS;堆栈段定义结束 CODE SEGMENT;定义代码段 ASSUME DS:DATA,SS:STACK,CS:CODE;对各段进行说明 BEGIN:MOV AX,DATA ; DS初始化为DATA MOV DS,AX LEA SI,D1;预置源数据的指针,例

32、 多个连续字节单元的累加,段定义语句,MOV CX,CC;预置次数 LODS BYTE PTR SI;取一个数并修改指针 MOV AH,0;清AX的高字节 CLC;清CF位 BEGIN:ADC SUM,AX;累加 LODS BYTE PTR SI;再取数并修改指针 LOOP BEGIN;控制循环 MOV AH,4CH;完成,返回DOS INT 21H CODE ENDS;代码段结束 ENDBEGIN;整个程序结束,4.3 8086 汇编语言中的运算符,4 8086 汇编语言程序设计,8086指示性语句中可以采用表达式。表达式中可以使用3种运算符和2中操作符 算术运算符 逻辑运算符 关系运算符

33、分析操作符 综合运算符 (合成操作符),算术运算符,(只能用于数值表达式),4.3.1 常用运算符和操作符,4.3 8086 汇编语言中的运算符,算术运算符,4.3.1 常用运算符和操作符,算术运算符的使用特点: 数值表达式中可使用所有算术运算符 地址表达式仅使用 +、- 算术运算符 算术运算符不影响标志位,例1:完成 80H + 90H 解:MOV AL,80H + 90H ;使用数值表达式 ;(AL)= 10H、CF = 不变 MOV AL,80H ADD AL,90H ;使用加法指令 ;(AL)= 10H、CF = 1,4.3 8086 汇编语言中的运算符,等效,4.3.1 常用运算符和

34、操作符,逻辑运算符,(只能用于数值表达式),4.3 8086 汇编语言中的运算符,4.3.1 常用运算符和操作符,逻辑运算符的使用特点: 逻辑指令助记符与逻辑运算符形同意不同 逻辑指令助记符出现在指令语句的开始 AND CX,00FFH AND 10AEH 逻辑运算符出现在指令语句的操作数段 AND CX,00FFH AND 10AEH 注:指令 AND CX,00AEH,逻辑运算符,例: MOV AX, 756AH AND 2465H ; (AX)= 2460 H MOV AL, NOT 25H ; (AL)= DAH,4.3 8086 汇编语言中的运算符,4.3.1 常用运算符和操作符,

35、关系运算符,关系不成立时,结果为全0;关系成立时,结果为全1。 (关系式的两个操作数必须是数字或是同一段内的两个地址单元)。设(AI)=6。,4.3 8086 汇编语言中的运算符,4.3.1 常用运算符和操作符,关系运算符的使用特点: 两性质相同的操作数间的比较 若关系正确为真(T), 有全 1 操作数 若关系错误为假(F), 有全 0 操作数, 关系运算符,MOV BL,(PORT LT 5) AND 20H 若 PORT = 2,(PORT LT 5)= FFH,为真 原式为 MOV BL,20H 若 PORT = 7,(PORT LT 5)= 00H,为假 原式为 MOV BL,00H,

36、4.3 8086 汇编语言中的运算符,4.3.1 常用运算符和操作符, 分析操作符,用来把存储器操作数(变量或标号)分解为它的组成部分(段地址、偏移值、类型 、数据字节总数、数据项总数等),并以数值形式回送给存储器操作数(变量或标号)。,4.3 8086 汇编语言中的运算符,4.3.1 常用运算符和操作符, 分析操作符,SIZE返回值=LENGTH返回值*TYPE 返回值,4.3 8086 汇编语言中的运算符,4.3.1 常用运算符和操作符, 分析操作符,例: DATA1 DW 100 DUP(?) 则 LENGTH DATA1 ; 值为100 SIZE DATA1 ; 值为200 TYPE

37、DATA1 ; 值为2,4.3 8086 汇编语言中的运算符,4.3.1 常用运算符和操作符, 综合运算符(合成操作符),(1)PTR 运算符 格式:类型 PTR 表达式 功能:临时修改或指定存储器操作数的类型属性,而保持原有的段、偏移地址属性,且原定义的类型属性不变。 例如,有如下数据定义: BUFW DW 1234H,5678H 则下列指令合法: MOV AX,BUFW MOV AL,BYTE PTR BUFW ;临时改变BUFW的字属性为字节属性,4.3 8086 汇编语言中的运算符,4.3.1 常用运算符和操作符, 综合运算符(合成操作符),(1)PTR 运算符 例:INC BX ;

38、INC BYTE PTR BX INC WORD PTR BX 例:ARRAY1 DB 0,1,2,3,4 ARRAY2 DW 0,1,2,3,4 MOV BX,WORD PTR ARRAY13 MOV CL,BYTE PTR ARRAY26 MOV WORD PTRSI,4,4.3 8086 汇编语言中的运算符,4.3.1 常用运算符和操作符, 综合运算符(合成操作符),(2)THIS 操作符 格式:标号或变量名 EQU THIS 类型(或属性) 功能:可以像PTR一样建立一个指定类型的地址操作数,该操作数的段地址和偏移地址与下一个存储单元地址相同。 把它后面指定的类型或距离属性赋给当前的变

39、量、标号或地址表达式。 例如: FIRST EQU THIS BYTE ;从本语句开始变量ABC的类型属性指定为字节, 不管它原来的类型是什么 SECOND DW 100 DUP(?) 此时FIRST的偏移地址和SECOND完全相同,但它是字节类型的;而BUFW则是字类型的。,4.3 8086 汇编语言中的运算符,4.3.2 运算符的优先级别,4.3 8086 汇编语言中的运算符,4.4 汇编语言程序设计,4 8086 汇编语言程序设计,程序设计首先要将问题分解成一个一个的步骤,每步都可以用汇编语言中的指令性语句,按照先后顺序表达。 设计一个好的程序,不仅要满足设计要求,能正常运行,实现预定功

40、能,还应满足: 程序结构化 简明、易读、易调试、易维护 执行速度快 占用存储空间尽量少,4.4.1 汇编语言程序设计基本步骤,4.4 汇编语言程序设计,程序设计步骤: 分析问题,抽象出数学模型,确定解决问题的合理算法; 绘制描述程序的流程图,或写出程序步骤,确定实现数学模型的算式; 分配内存单元和分配寄存器,根据流程图编写程序; 静态检查,修改完善程序; 上机运行调试。,4.4.2 汇编语言程序设计的基本结构,4.4 汇编语言程序设计,程序的基本结构形式有4种: 顺序结构 分支结构 循环结构 子程序,1、顺序结构:,4.4 汇编语言程序设计,4.4.2 汇编语言程序设计的基本结构,对应简单程序

41、,顺序执行,无转移、无循环。指令指针IP值线性增加。,1、顺序结构:,4.4 汇编语言程序设计,DATA SEGMENT ;定义数据段 BLOCK DW 0ABCDH ; 定义一个字数据 BUFF DD ? ; 定义一个双字数据,未赋值 DATD ENDS ; 数据段结束 CODE SEGMENT ;定义代码段 ASSUME CS: CODE, DS:DATA ;段属性说明 START: ;这里是程序的入口 MOV AX , DATA MOV DS, AX ;初始化DS MOV DX, BLOCK MOV AX, DX ;将BLOCK中数据送入AX中 AND AX, 0F0FH ;(AX)=0

42、B0DH AND DX, 0F0F0H ;(DX)=0A0C0H,按事件发展的先后,选择合适的指令有序地加以组合。,1、顺序结构:,4.4 汇编语言程序设计,MOV CL, 4 SHR DX, CL ; (DX)右移四位,(DX)=0A0CH LEA BX, BUFF ; 将BUFF的偏移地址送入BX中 MOV BX+0, AL ; 将(AL)=0DH送入(BUFF+0)中 MOV BX+1, DL ; 将(DL)=0CH送入(BUFF+1)中 MOV BX+2, AH ; 将(AH)=0BH送入(BUFF+2)中 MOV BX+3, DH ; 将(DH)=0AH送入(BUFF+3)中 MOV

43、 AX, 4C00H INT 21H ;程序结束,返回DOS CODE ENDS ;代码段结束 END START ;汇编程序结束,指定程序入口地址,2、分支结构:,4.4 汇编语言程序设计,4.4.2 汇编语言程序设计的基本结构,依据不同条件分支到各程序段,有双分支和多分支两种。IP值受标志位的影响而跳变。 分支程序利用比较、转移指令来实现: 用于比较、判断的指令有:CMP、CMPS、SCAS 用于实现转移的指令:JMP及各类转移指令 分支程序根据条件判断,满足条件转到标号指示的程序部分执行,不满足条件则执行下一条指令。,双分支结构,多分支结构,4.4 汇编语言程序设计,2、分支结构:,4.

44、4 汇编语言程序设计,例:判断MEMS单元数据,将结果存入MEMD单元。 若数据0,结果为1; 若数据0,结果为-1; 若数据=0,结果为0,2、分支结构:,4.4 汇编语言程序设计,例:判断MEMS单元数据,将结果存入MEMD单元。若数据0,结果为1,;若数据0,结果为-1;若数据=0,结果为0,MY_D SEGMENT ;定义数据段 MEMS DB 08H ; 定义一个字节数据 MEMD DB ? ; 定义一个字节数据,未赋值 MY_D ENDS ; 数据段结束 MY_C SEGMENT ;定义代码段 ASSUME CS: MY_C, DS:MY_D ;段属性说明 START: ;这里是程

45、序的入口 MOV AX , MY_D MOV DS, AX ;初始化DS MOV AL, MEMS ;将MEMS中数据送入AL中 CMP AL,0 ;将(Al)=08H与0进行比较 JGE NEXT ;0,转到标号NEXT处执行,2、分支结构:,4.4 汇编语言程序设计,MOV AL,-1 ; 0,结果为-1 JUM DONE ; 无条件跳转到标号DONE处执行 NEXT: JE DONE ; =0,跳转到标号DONE处执行 MOV AL,1 ; 0,结果为1 DONE: MOV MEMD,AL ; 将(AL)内容送入(MEMD)中 MOV AX, 4C00H INT 21H ;程序结束,返回

46、DOS MY_D ENDS ;代码段结束 END START ;汇编程序结束,指定程序入口地址,3、循环结构:,4.4 汇编语言程序设计,4.4.2 汇编语言程序设计的基本结构,循环程序是在满足某些条件时对一段程序的重复执行:即用同一组指令,每次替换不同的数据,反复执行这一组指令。 使用循环结构,可以缩短程序代码,提高编程效率。,3、循环结构:,4.4 汇编语言程序设计,4.4.2 汇编语言程序设计的基本结构,基本结构形式 (1)先执行后判断(dowhile) 至少进入一次循环体。常用于循环次数已知时。 (2)先判断后执行 循环体可一次都不执行。常用于循环次数未知, 根据具体情况找出控制循环体

47、结束的条件时常用。,4.4 汇编语言程序设计,先执行后判断,先判断后执行,3、循环结构:,4.4 汇编语言程序设计,4.4.2 汇编语言程序设计的基本结构,循环程序设计中,循环控制有如下3种: 计数控制(减1计数):当循环次数已知,将循环次数送入CX寄存器,没做完一次循环,利用LOOP指令减1计数,并判断循环是否结束。 条件控制当循环次数未知时,通过比较,满足比较条件,则结束循环,否则继续循环操作。 状态控制当循环内又套循环时,设OFFF为结束标志。,3、循环结构:,4.4 汇编语言程序设计,例1:编程统计BUFF缓冲区数据中负数的个数。,DATA SEGMENT ;定义数据段 BUFF DB

48、 67H,9EH,-6AH,0ABH,6DH ; 定义一个字节数据 MEM DB ? ; 定义1个字节数据,用于存储负数个数 MY_D ENDS ; 数据段结束 CODE SEGMENT ;定义代码段 ASSUME CS: CODE, DS:DATA ;段属性说明 START: ;这里是程序的入口 MOV AX , DATA MOV DS, AX ;初始化DS MOV CX, 5 ;将BUFF中数据个数送入CX LEA BX,BUFF ;获取BUFF单元偏移地址 XOR DL,DL ;统计计数器清0,3、循环结构:,4.4 汇编语言程序设计,NEXT: MOV AL,BX ;取数据 ADD A

49、L,O ;与0做加法,影响SF标志位 JNS AA1 ;判断是否为正数,是,则转移 INC DL ;是负数,统计+1 AA1: INC BX ;移动指针,执行BUFF中下一个数据 LOOP NEXT ;循环控制 MOV MEM,DL ;保存统计结果 MOV AX, 4C00H INT 21H ;程序结束,返回DOS CODE ENDS ;代码段结束 END START ;汇编程序结束,指定程序入口地址,3、循环结构:,4.4 汇编语言程序设计,例2:编程统计AX寄存器中“1”的个数。,CODE SEGMENT ;定义代码段 ASSUME CS: CODE ;段属性说明 START: ;这里是程

50、序的入口 MOV CX,16 ;循环控制次数设置 XOR DL,DL ;统计计数器清0 CMP AX,0 ;AX内容与O比较,结果是否为0? JZ DONE ;是0,跳转,结束循环 BB1: SHL AX,1 ;AX内容左移,影响CF标志位 ADC DL,0 ;统计“1”的个数 LOOP BB1 ;循环控制 DONE : MOV AX,4C00H INT 21H ;程序结束,返回DOS CODE ENDS ;代码段结束 END START ;汇编程序结束,指定程序入口地址,4、子程序:,4.4 汇编语言程序设计,4.4.2 汇编语言程序设计的基本结构,在许多应用程序中,常常需要多次用到一段程序

51、。这时,为了避免重复编写程序,节省内存空间,可以把该程序段独立出来,以供其他程序调用,这段程序称为“子程序”或“过程”。 子程序是可供其他程序调用的具体特定功能的程序段(或代码块)。 调用子程序的程序体,称为“主程序”或“调用程序”。 当主程序与子程序在同一段,此时子程序具有NEAR属性。主程序调用时,只将IP寄存器值入栈保存。 当主程序与子程序在不用段,此时子程序具有FAR属性。主程序调用时,CS和IP寄存器值入栈保存。,4、子程序:,例:用子程序结果编写AX寄存器内容乘10,结果仍在AX中。,XX EQU 1000 CODE SEGMENT ASSUME CS:CODE START:MOV

52、 AX,XX ;给AX赋值为1000=03E8H CALL MUL10 ;调用把AX内容乘10子程序 MOV AH,4CH INT 21H MUL10 PROC ;AX乘10子程序,入口参数为AX,出口参数AX PUSHF ;保护现场,标志寄存器值入栈 PUSH BX ;保护现场,BX内容入栈 ADD AX,AX ;2XXAX MOV BX,AX ;2XXBX ADD AX,AX ;4XXAX ADD AX,AX ;8XXAX ADD AX,BX ;8XX+2XXAX POP BX ;恢复现场,参数出栈到BX POPF ;恢复现场,参数出栈到标志寄存器 RET ;过程返回指令 MUL10 EN

53、DP CODE ENDS END START,4.4 汇编语言程序设计,4.6 DOS功能调用,4 8086 汇编语言程序设计,MS-DOS叫磁盘操作系统。它不仅提供了许多命令,还给用户提供了100多个常用子程序。 DOS功能调用就是对这些子程序的调用,也叫系统功能调用。 子程序的功能主要是进行磁盘读/写,控制管理,内存管理,基本输入/输出管理等。 子程序的顺序编号称为功能调用号。,4.6 DOS功能调用,4 8086 汇编语言程序设计,DOS功能调用号送入AH寄存器 如果需要,按要求给定输入参数(有的不需要输入参数) 写入中断指令“INT 21H” 调用结束,按功能使用其输出参数。,DOS功能调用过程:,4.6 DOS功能调用,4 8086 汇编语言程序设计,在所有DOS功能调用中,将INT 2lH软中断命令实现的所有子程序调用称为DOS系统功能调用,它体现了DOS的核心功能,对应100多个子程序。常用如下:, 单字符输入 ( 01H、07H、08H功能 ) 显示单字符 ( 02H、05H功能 ) 单字符输入 或显示( 06H功能 ) 字符串输入 ( 0AH功能 ) 显示字符串 ( 09H功能 ) 检测键盘状态 ( 0BH功能 ),1、单字符输入01H:,4.6 DOS功能调用,功能调用号:AH=01

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论