微机原理及接口技术汇编语言程序设计_第1页
微机原理及接口技术汇编语言程序设计_第2页
微机原理及接口技术汇编语言程序设计_第3页
微机原理及接口技术汇编语言程序设计_第4页
微机原理及接口技术汇编语言程序设计_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

1、第第4 4章章 汇编语言程序设计汇编语言程序设计本章重点本章重点v掌握汇编语言程序的规范格式掌握汇编语言程序的规范格式v掌握汇编语言程序设计的基本方法掌握汇编语言程序设计的基本方法 顺序程序设计顺序程序设计 循环程序设计循环程序设计 选择程序设计选择程序设计 子程序设计子程序设计v了解汇编语言与高级语言的接口了解汇编语言与高级语言的接口v汇编语言的特点汇编语言的特点 80868086系统常用的汇编语言称为系统常用的汇编语言称为ASMASM8686,汇编语言的有如下,汇编语言的有如下的特点:的特点:1 1)汇编语言可以让我们从根本上了解计算机的工作原理,清晰)汇编语言可以让我们从根本上了解计算机

2、的工作原理,清晰的跟踪计算机的工作过程。的跟踪计算机的工作过程。2 2)计算机系统中,某些功能程序仍然用汇编语言来实现,比如)计算机系统中,某些功能程序仍然用汇编语言来实现,比如机器自检、输入输出驱动程序。机器自检、输入输出驱动程序。3 3)汇编语言书写的程序目标代码占用的内存空间少、执行速度)汇编语言书写的程序目标代码占用的内存空间少、执行速度快、效率高、实时性强。快、效率高、实时性强。4 4)汇编语言可以直接调用系统中断,方便用户使用资源。)汇编语言可以直接调用系统中断,方便用户使用资源。4.1 汇编语言设计概述汇编语言设计概述v汇编语言的编译过程汇编语言的编译过程1)用文本编辑器编写符合

3、汇编格式的程序,并将文件的扩展)用文本编辑器编写符合汇编格式的程序,并将文件的扩展名命名为名命名为.ASM.ASM,该文件称为汇编源程序。,该文件称为汇编源程序。2 2)利用汇编程序)利用汇编程序(MASM.EXE)(MASM.EXE)将汇编源程序翻译成计算机可以将汇编源程序翻译成计算机可以识别和运行的扩展名为识别和运行的扩展名为.OBJ.OBJ二进制目标程序。二进制目标程序。3 3)利用链接程序)利用链接程序(LINK.EXE)(LINK.EXE)将目标文件进行地址重定位、目将目标文件进行地址重定位、目标程序组合等过程,产生用户可以执行的扩展名为标程序组合等过程,产生用户可以执行的扩展名为.

4、EXE.EXE的可运的可运行程序。行程序。汇编源文件汇编源文件.ASM.ASM目标程序目标程序.OBJ.OBJ可执行程序可执行程序.EXE.EXE汇编汇编链接链接MASM.EXEMASM.EXELINK.EXELINK.EXEv汇编语言语句类型汇编语言语句类型指令性语句指令性语句 一条指令性语句就是一条一条指令性语句就是一条80868086的指令,例如的指令,例如 ADD AL,BLADD AL,BL和和MOV CX,1000MOV CX,1000;每一条指令性语句都会在汇编过程中产生相应;每一条指令性语句都会在汇编过程中产生相应的目标代码。的目标代码。指示性语句指示性语句 指示性语句又称为指

5、示性语句又称为伪指令,伪指令,例如例如 SEGMENTSEGMENT和和ABC DB 50HABC DB 50H。伪指令用来为汇编程序提供某些信息,让汇编程序在汇编的过伪指令用来为汇编程序提供某些信息,让汇编程序在汇编的过程中执行特定功能的信息,比如规定一个数据段从哪里开始到程中执行特定功能的信息,比如规定一个数据段从哪里开始到哪里结束等。每一条伪指令在汇编的过程中都不会产生相应的哪里结束等。每一条伪指令在汇编的过程中都不会产生相应的目标代码。目标代码。指令性语句的格式如下:指令性语句的格式如下: : 指令助记符指令助记符 目标操作数目标操作数 STARTSTART: MOV AX,1090H

6、 : MOV AX,1090H ;将;将1616进制数进制数1090H1090H送入送入AXAX INC BXINC BX指示性语句的格式如下:指示性语句的格式如下: 伪指令助记符伪指令助记符 CR CR DB ODHDB ODH ;在字节单元;在字节单元CRCR处存放数据处存放数据0DH0DH ORG 200H ORG 200H ;目标程序的偏移量;目标程序的偏移量 DATADATA SEGMENT SEGMENT ;数据段开始;数据段开始 指令性语句和指示性语句的最大区别就是指示性指令性语句和指示性语句的最大区别就是指示性语句在语句在标识符和伪指令助记符没有冒号标识符和伪指令助记符没有冒号

7、v汇编语句语句格式汇编语句语句格式v段定义伪指令段定义伪指令SEGMENTSEGMENT、ENDSENDS、ASSUMEASSUME 伪指令伪指令SEGMENTSEGMENT和和ENDSENDS总是成对出现。总是成对出现。SEGMENTSEGMENT用来定义用来定义段开始,段开始,ENDSENDS是来定义段结束。这一段伪指令可以将源程序是来定义段结束。这一段伪指令可以将源程序分为几个段,通常为数据段,堆栈段和代码段。分为几个段,通常为数据段,堆栈段和代码段。 格式为:格式为: 段名段名 SEGMENTSEGMENT 段内容段内容 段名段名 ENDSENDS 伪指令伪指令ASSUMEASSUME

8、告诉汇编程序,哪一个段是数据段,哪一告诉汇编程序,哪一个段是数据段,哪一个段是堆栈段,哪一个段是代码段。个段是堆栈段,哪一个段是代码段。 格式为:格式为: ASSUMEASSUME 段寄存器:段名段寄存器:段名 v源程序结束伪指令源程序结束伪指令 ENDEND4.2 汇编语言程序结构汇编语言程序结构一个标准汇编语言源程序结构如下:一个标准汇编语言源程序结构如下: 数据段名数据段名 SEGMENTSEGMENT 数据段内容数据段内容 数据段名数据段名 ENDSENDS 堆栈段名堆栈段名 SEGMENTSEGMENT 堆栈段内容堆栈段内容 堆栈段名堆栈段名 ENDSENDS 代码段名代码段名 SE

9、GMENTSEGMENT ASSUME CS: ASSUME CS:代码段名代码段名, DS:, DS:数据段名数据段名, SS:, SS:堆栈段名堆栈段名 代码段内容代码段内容 代码段名代码段名 ENDSENDS END END注意:各个段的名称可以任意起,一般注意:各个段的名称可以任意起,一般把数据段的段名记做把数据段的段名记做DATADATA,堆栈段的段,堆栈段的段名记做名记做STACKSTACK,代码段的段名记做,代码段的段名记做CODECODE。规范程序示例:规范程序示例:CODECODE SEGMENT SEGMENT ;定义段;定义段 ASSUME CS:CODEASSUME C

10、S:CODE ;把上面定义段的段基址放入;把上面定义段的段基址放入 CSCS MOV CX,100H MOV CX,100H ;装入循环次数;装入循环次数 MOV DL,0 MOV DL,0 ;装入第一个;装入第一个ASCIIASCII码码 NEXT: MOV AH,02NEXT: MOV AH,02 INT 21HINT 21H INC DL INC DL ;每次将数据寄存器;每次将数据寄存器DLDL内的数值加内的数值加1 1 LOOP NEXT LOOP NEXT ;执行一次,;执行一次,CXCX减减1 1,直到,直到CXCX为为0.0. MOV AH,4CH MOV AH,4CH ;终止

11、当前程序并返回调用程序;终止当前程序并返回调用程序 INT 21H INT 21H ;返回;返回DOSDOSCODECODE ENDS ENDS ;段结束;段结束END END ;汇编程序结束;汇编程序结束编译工具编译工具MASMMASM的使用的使用 MASM MASM是专门为汇编语言设计的一种集编译、链接是专门为汇编语言设计的一种集编译、链接为一体的工具,它是利用文本编辑器(为一体的工具,它是利用文本编辑器(EDITEDIT等)将汇等)将汇编指令编指令按照规范格式按照规范格式建成一个独立且建成一个独立且扩展名为扩展名为.ASM.ASM的的汇编程序,称源程序。汇编程序,称源程序。编译程序编译程

12、序MASMMASM将输入的将输入的ASMASM文文件,编译成件,编译成.OBJ.OBJ文件,称为目标程序。文件,称为目标程序。OBJOBJ文件仅包文件仅包含有关程序各部分要载入何处及如何与其他程序合并含有关程序各部分要载入何处及如何与其他程序合并的信息,无法直接载入内存执行。的信息,无法直接载入内存执行。链接程序链接程序LINKLINK则可则可将将OBJOBJ文件转换成可载入内存执行的文件转换成可载入内存执行的EXEEXE文件。文件。 利用利用MASMMASM编译、链接汇编程序的步骤如下:编译、链接汇编程序的步骤如下:(1) (1) 用用EDITEDIT编辑一个扩张名为编辑一个扩张名为ASMA

13、SM的源程序文件。例如:的源程序文件。例如:smile.asmsmile.asm(2) DOS(2) DOS窗口的命令提示符下输入:窗口的命令提示符下输入:MASM SMILE MASM SMILE 不用打入附加名不用打入附加名.ASM.ASM。 50162 + 403867 Bytes symbol space free50162 + 403867 Bytes symbol space free 0 Warning Errors 0 Warning Errors 警告错误,表示编译器对某些语句不理解,通常警告错误,表示编译器对某些语句不理解,通常 是输入错误。是输入错误。 0 Severe

14、Errors 0 Severe Errors 严重错误,会造成程序无法执行,通常是语法结严重错误,会造成程序无法执行,通常是语法结 构错误。构错误。 如果没有一个错误存在,即可生成如果没有一个错误存在,即可生成OBJOBJ文件。文件。(3) DOS(3) DOS窗口的命令提示符下输入窗口的命令提示符下输入: LINK SMILE: LINK SMILE 不用附加名不用附加名OBJOBJ LINK : warning L4021: no stack segment LINK : warning L4021: no stack segment 由于由于COMCOM文件不使用堆栈文件不使用堆栈 段,

15、所以错误信息并不段,所以错误信息并不 “ “no stack segment” no stack segment” 影响程序正常执行。影响程序正常执行。vDEBUGDEBUG和和MASMMASM的区别的区别 DEBUGDEBUG是调试器,它的主要用途在于除错,能够是调试器,它的主要用途在于除错,能够观察每条汇编语句运行后的结果,方便的修正汇编观察每条汇编语句运行后的结果,方便的修正汇编程序中的错误。程序中的错误。DEBUGDEBUG中必须使用中必须使用1616进制的数。进制的数。 MASMMASM是一种编译器,它能将汇编源程序进行编是一种编译器,它能将汇编源程序进行编译、链接形成可执行文件,但

16、汇编程序必须译、链接形成可执行文件,但汇编程序必须使用规使用规范书写方式范书写方式,源程序中除了指令性语句,还必须加源程序中除了指令性语句,还必须加入许多与指令语句无关的指示性语句,以供编译器入许多与指令语句无关的指示性语句,以供编译器识别。识别。 MASMMASM中的数据默认为中的数据默认为1010进制。进制。 除了除了MASMMASM外,还有外,还有TASMTASM等工具软件也能对规范等工具软件也能对规范格式的汇编语言进行编译格式的汇编语言进行编译 v段定义伪指令段定义伪指令SEGMENTSEGMENT、ENDSENDS、ASSUMEASSUME和和ORGORG(1) (1) 伪指令伪指令

17、SEGMENTSEGMENT和和ENDSENDS总是成对出现。总是成对出现。SEGMENTSEGMENT用来定义用来定义段开始,段开始,ENDSENDS是来定义段结束,段名是合法的标识符。伪指是来定义段结束,段名是合法的标识符。伪指令令SEGMENTSEGMENT的参数有定位类型,组合类型和类别。的参数有定位类型,组合类型和类别。 格式为:格式为: 段名段名 SEGMENT SEGMENT 定位类型定位类型 组合类型组合类型 类别类别 段名段名 ENDSENDS定位类型:定位类型:指定逻辑段在主存储器中的边界指定逻辑段在主存储器中的边界 BYTEBYTE 段基址为为任何地址,段间无空隙(段基址

18、为为任何地址,段间无空隙(xxxx xxxxBxxxx xxxxB) WORDWORD 段基址为下一个可用的偶数地址(段基址为下一个可用的偶数地址(xxxx xxx0Bxxxx xxx0B) PARAPARA 段基址为下一个可用的节地址(段基址为下一个可用的节地址(xxxx 0000Bxxxx 0000B) PAGEPAGE 段基址为下一个可用的页地址(段基址为下一个可用的页地址(0000 0000B0000 0000B) 默认的定位类型是默认的定位类型是PARAPARA组合类型:组合类型:指定多个逻辑段之间的关系指定多个逻辑段之间的关系 NONE NONE 本段与其他段没有逻辑关系,不与其他

19、段合并,每本段与其他段没有逻辑关系,不与其他段合并,每段都有自己的段地址。段都有自己的段地址。 PUBLICPUBLIC 连接程序把本段与所有同名同类型的其他段相邻地连接程序把本段与所有同名同类型的其他段相邻地连接在一起,然后为所有这些段指定一个共同的段地址,也就连接在一起,然后为所有这些段指定一个共同的段地址,也就是合成一个物理段。是合成一个物理段。 STACK STACK 仅用于堆栈段,连接程序将所有仅用于堆栈段,连接程序将所有STACKSTACK段进行合并连段进行合并连接成一个物理段,系统初始化接成一个物理段,系统初始化SSSS和和SPSP。 COMMON COMMON 连接程序把本段与

20、所有同名同类型的其他段指定连接程序把本段与所有同名同类型的其他段指定相同的段基址,即共享存储空间。相同的段基址,即共享存储空间。 MEMORY MEMORY 连接程序把本段定位在所有同名同类型的其他段连接程序把本段定位在所有同名同类型的其他段后面,即最高的地址空间。后面,即最高的地址空间。 默认的组合类型是默认的组合类型是NONENONE(2) (2) 伪指令伪指令ASSUMEASSUME告诉汇编程序,哪一个段是数据段,哪一个告诉汇编程序,哪一个段是数据段,哪一个段是堆栈段,哪一个段是代码段。段是堆栈段,哪一个段是代码段。 格式为:格式为: ASSUMEASSUME 段寄存器:段名段寄存器:段

21、名 除除CSCS的值可以自动装入外,的值可以自动装入外,其他各段的实际值还要用其他各段的实际值还要用MOVMOV指指令来赋值。令来赋值。 MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX ;将数据段;将数据段DATADATA的段基址送的段基址送DSDS MOV AX,STACK MOV AX,STACK MOV SS,AX MOV SS,AX ;将堆栈段;将堆栈段STACKSTACK的段基址送的段基址送SSSS MOV SP,TOP MOV SP,TOP ;堆栈指针指向栈顶;堆栈指针指向栈顶类别:类别必须用单引号括起来,连接程序所有程序中类别类别:类别必须

22、用单引号括起来,连接程序所有程序中类别相同的段放在一个连续的存储空间里组合成一个物理段。相同的段放在一个连续的存储空间里组合成一个物理段。 STACK SEGMENT PARASTACK SEGMENT PARA STACK STACKSTACK STACK 段名段名 定位定位 组合类型组合类型 类别类别 DATA SEGMENTDATA SEGMENT 数据段内容数据段内容 DATA ENDS DATA ENDS STACK SEGMENT STACK SEGMENT 堆栈段内容堆栈段内容 STACK ENDSSTACK ENDS CODE CODE SEGMENTSEGMENT ASSUM

23、E CS:CODE, DS:DATA, SS:STACK ASSUME CS:CODE, DS:DATA, SS:STACK START:START:MOV AX,DATAMOV AX,DATA MOV DS,AX MOV DS,AX ;初始化;初始化DSDS MOV AX,STCAKMOV AX,STCAK MOV SS,AXMOV SS,AX ;初始化;初始化SSSS MOV SP,TOP MOV SP,TOP ;初始化;初始化SPSP MOV AH,4CHMOV AH,4CH INT 21H INT 21H ;程序正常结束;程序正常结束 CODE CODE ENDSENDS END ST

24、ART END STARTv过程定义伪指令过程定义伪指令PROCPROC、ENDPENDP 过程就是完成某个特定功能的子程序,应用伪指令过程就是完成某个特定功能的子程序,应用伪指令PROCPROC和和ENDPENDP定义过程的格式如下:定义过程的格式如下: 过程名过程名PROC NEAR|FARPROC NEAR|FAR过程名过程名ENDPENDP(1)(1)过程名:过程名:( (子程序名子程序名) )为符合语法的标识符为符合语法的标识符(2)(2)属性:属性:NEARNEAR属性属性( (段内近调用段内近调用) )的过程只能被相同代码段的的过程只能被相同代码段的其他程序调用、其他程序调用、F

25、ARFAR属性属性( (段间远调用段间远调用) )的过程可以被相同或不的过程可以被相同或不同代码段的程序调用;同代码段的程序调用;NEARNEAR属性是默认值。属性是默认值。(3)(3)调用过程:调用过程:CALL CALL 过程名过程名(4)(4)过程返回:过程返回:RETRETv程序结束伪指令程序结束伪指令ENDEND 格式是:格式是: END END 标识符标识符 标识符是可选项,它是程序起始地址的标识符。标识符是可选项,它是程序起始地址的标识符。 CODE SEGMENT CODE SEGMENT ;定义段;定义段 ASSUME CS:CODE ASSUME CS:CODE ;把;把C

26、ODECODE段的段基址放入段的段基址放入CSCS START:MOV DL,1 START:MOV DL,1 MOV AH,02 MOV AH,02 INT 21H INT 21H MOV AH,4CH MOV AH,4CH ;终止当前程序并返回调用程序;终止当前程序并返回调用程序 INT 21H INT 21H ;返回;返回DOSDOS CODE ENDS CODE ENDS ;段结束;段结束 END STARTEND STARTDATA SEGMENT DATA SEGMENT ;数据段开始;数据段开始 ARRAY DB 3,12,45,21,97,56,8 ARRAY DB 3,12,

27、45,21,97,56,8 ;存放;存放7 7各数字各数字 MAXNUM DB ? MAXNUM DB ? ;MAXNUMMAXNUM单元存放最大数单元存放最大数DATA ENDS DATA ENDS ;数据段结束;数据段结束CODE SEGMENT CODE SEGMENT ;代码段开始;代码段开始 ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATASTART:MOV AX,DATASTART:MOV AX,DATA MOV DS,AX MOV DS,AX ;数据段寄存器赋值;数据段寄存器赋值 MOV BX,OFFSET ARRAY MOV BX,OF

28、FSET ARRAY ;取数组的偏移量送;取数组的偏移量送BXBX MOV CX,6 MOV CX,6 ;比较的次数送;比较的次数送CXCX MOV AL,BX MOV AL,BX ;取第一个数;取第一个数LABLE:INC BX LABLE:INC BX ;偏移量加;偏移量加1 1,指向下一个数,指向下一个数 CMP AL,BX CMP AL,BX ;比较;比较ALAL和第和第N+1N+1个数个数 JNB NEXT JNB NEXT ;不低于则转入;不低于则转入NEXTNEXT MOV AL,BX MOV AL,BX ;否则将大数送;否则将大数送ALAL NEXT:LOOP LABLE NE

29、XT:LOOP LABLE ;继续下一次比较,直到;继续下一次比较,直到CXCX为为0 0 MOV MAXNUM,AL MOV MAXNUM,AL ;最大数送;最大数送MAXNUMMAXNUM单元单元 MOV DL,ALMOV DL,AL MOV AH,02 MOV AH,02 INT 21H INT 21H ;显示输出最大数;显示输出最大数9797 MOV AH,4CH MOV AH,4CH INT 21H INT 21H ;程序正常结束;程序正常结束CODE ENDS CODE ENDS ;代码段结束;代码段结束END START END START ;汇编程序结束;汇编程序结束v常量常量

30、 常量就是指令中出现的固定值,比如常量就是指令中出现的固定值,比如 MOV AX,MOV AX,9090 。 1 1)数字常量)数字常量 如果一个常数后面加字母如果一个常数后面加字母B B来表示二进制数。来表示二进制数。 如果一个常数后面加字母如果一个常数后面加字母D D(可不加)表示十进制数。可不加)表示十进制数。 如果一个常数后面加字母如果一个常数后面加字母H H来表示十六进制数,一个来表示十六进制数,一个1616进制进制数以字母数以字母A AF F开头,前面必须加一个开头,前面必须加一个0 0,如,如0A59H0A59H2 2)字符常量)字符常量 单引号引出的字符表示字符常量,如单引号引

31、出的字符表示字符常量,如cc表示字符表示字符c c。 单引号引出的多个字符序列称为字符串常量,如单引号引出的多个字符序列称为字符串常量,如ABCABC注意:一个用引号引出的字符串也代表常数,如带引号的字符注意:一个用引号引出的字符串也代表常数,如带引号的字符串串ABCABC,等效于它们对应的,等效于它们对应的ASCIIASCII的常数的常数6464、6565、6666。4.3 汇编语言的语法汇编语言的语法v变量变量 变量是存放数据的存储器单元的符号地址,在程序运行过变量是存放数据的存储器单元的符号地址,在程序运行过程中其值可以变化。程中其值可以变化。 伪指令伪指令DBDB,DWDW,DDDD用

32、来定义变量用来定义变量 变量的属性变量的属性1 1)段基址)段基址(SEG)(SEG):变量所在段的起始地址:变量所在段的起始地址2 2)偏移量)偏移量(OFFSET)(OFFSET):变量所在地址与段基址的相对距离:变量所在地址与段基址的相对距离3 3)类型)类型(TYPE)(TYPE):变量指示的存储区中每个数据所占的内存单:变量指示的存储区中每个数据所占的内存单元的字节数,可以是字节元的字节数,可以是字节(1(1字节字节) )、字、字(2(2字节字节) )、双字、双字(4(4字节字节) )注意:注意:1 1)变量定义后可以使用,在指令中必须与操作数类型一致)变量定义后可以使用,在指令中必

33、须与操作数类型一致2 2)变量的偏移地址仅仅对应其所代表的数据区的首地址,如变量的偏移地址仅仅对应其所代表的数据区的首地址,如果这个数据区有多个数据项,对后面的数据项操作时必须改变果这个数据区有多个数据项,对后面的数据项操作时必须改变地址值。地址值。0200H0200H0202H0202H0203H0203H0204H0204H0205H0205H0206H0206H0201H0201H定义变量伪指令定义变量伪指令DBDB、DWDW、DDDD 该组伪指令用来给出程序中所用到的数据、字符串以及存该组伪指令用来给出程序中所用到的数据、字符串以及存储单元。储单元。DBDB用来定义字节、用来定义字节、

34、DWDW用来定义字、用来定义字、DDDD用来定义双字。用来定义双字。 变量定义的格式为:变量定义的格式为: 变量变量 伪指令伪指令 参数参数11、参数、参数2 2 例如:例如: CR DB 10HCR DB 10H LF DB 0BH LF DB 0BH,64H64H RP DW FBFFHRP DW FBFFH,3CH 3CH 10CRLF0B643CFBFF00RP用标识符代表地址,相用标识符代表地址,相当于高级语言中的变量当于高级语言中的变量1)1)操作数操作数? ?用来保留存储空间用来保留存储空间, ,但不存入数据。但不存入数据。 ABCABC DBDB 0BH0BH,06H06H,?

35、 ?,? ?,? ? LPI LPI DWDW ? ?,54H54H,? ? 0B065400 ABCABCLPILPI2)2)操作数还可以用操作数还可以用复制操作符复制操作符DUPDUP来缩写来缩写 BUFFER DB 9 DUP (?)BUFFER DB 9 DUP (?) 3)3)操作数可以是字符串操作数可以是字符串STRING DB HELLOSTRING DB HELLO48504C4C4FHELLOSTRINGSTRINGv汇编的表达式和运算符汇编的表达式和运算符 表达式表达式是是常数常数、寄存器、标识符寄存器、标识符与一些与一些运算符运算符组组合的序列,分合的序列,分数字表达式数

36、字表达式和和地址表达式地址表达式两种。汇编时两种。汇编时按一定的优先规则对表达式进行计算后可得到一个数按一定的优先规则对表达式进行计算后可得到一个数值或一个地址。值或一个地址。 算术运算符算术运算符 逻辑运算符逻辑运算符 关系运算符关系运算符 分析运算符分析运算符 综合运算符综合运算符算术运算符算术运算符 有有+ +、- -、* *、/ /、MODMOD。 算术运算符可以用于算术运算符可以用于数字表达式数字表达式, ,例如:例如: MOV AL,2MOV AL,2* *7 7 汇编后为汇编后为 MOV AL,0E MOV AL,0E 算术运算符也可以用于算术运算符也可以用于地址表达式地址表达式

37、, ,对地址运算对地址运算的结果应有明确的的结果应有明确的物理意义物理意义, ,例两个地址的乘或除无例两个地址的乘或除无意义意义, ,而加或减则可以而加或减则可以, ,例如例如: BUF DW 1,2,3,4,5,6,7,8: BUF DW 1,2,3,4,5,6,7,8 MAX DW ?MAX DW ? MOV CX,(BUF-MAX)/2 MOV CX,(BUF-MAX)/2 汇编后为汇编后为 MOV CX,8 MOV CX,8逻辑运算符逻辑运算符 逻辑运算符有逻辑运算符有ANDAND、OROR、XORXOR和和NOTNOT,它们只能用它们只能用于数字表达式中于数字表达式中。例如:例如:M

38、OV CLMOV CL,36H AND 0FH36H AND 0FH 经汇编后经汇编后:MOV CLMOV CL,06H06H 这些逻辑运算符也是这些逻辑运算符也是8086/8088的指令助记符,的指令助记符,会不会造成混乱呢会不会造成混乱呢? 不会的,前者在不会的,前者在汇编时汇编时进行,而进行,而后者在后者在指令执行时指令执行时进行的。进行的。例如:例如: ANDAND DXDX,36H 36H ANDAND 0FH0FH 后一个逻辑运算符后一个逻辑运算符AND在汇编时进行在汇编时进行, 汇编后得到表达汇编后得到表达式的值为式的值为06H,运行时执行前一个指令助记符,运行时执行前一个指令助

39、记符AND,将将(DX)与与06H相与相与,结果在结果在DX中。中。关系运算符关系运算符 共有共有6 6个个, ,它们为:它们为: EQ(EQ(相等相等) ),NE(NE(不等不等) ),LT(LT(小于小于) ),GT(GT(大于大于),), LE(LE(小于或等于小于或等于) ),GE(GE(大于或等于大于或等于) ) 关系运算符关系运算符的两个操作数必须都是的两个操作数必须都是数字数字或者是同一段内的或者是同一段内的两个存储器地址两个存储器地址。 关系为关系为真真, ,结果为结果为0 0FFFFHFFFFH;关系为;关系为假假, ,结果为结果为0 0例如:例如: MOV BXMOV BX

40、,PORT GE 5PORT GE 5 若若PORTPORT的值大于等于的值大于等于5,5,则汇编后为:则汇编后为: MOVMOVBX,0FFFFHBX,0FFFFH 若若PORTPORT的值小于的值小于5, 5, 则汇编后为:则汇编后为: MOVMOVBX,0BX,0分析运算符分析运算符 分析运算符的分析运算符的OFFSET,SEGOFFSET,SEG可以把一个存储单元的可以把一个存储单元的地址分解为段基址和偏移量。地址分解为段基址和偏移量。1)1)运算符运算符OFFSETOFFSET用来取地址的偏移量;用来取地址的偏移量;2)2)运算符运算符SEGSEG取存储单元的段地址。取存储单元的段地

41、址。例如在规范程序中有定义:例如在规范程序中有定义:ABC DB 11HABC DB 11HABCABC11DSDS:1EFFH1EFFH0150H0150H则执行则执行: MOV DX: MOV DX,OFFSET ABCOFFSET ABC此语句将此语句将ABCABC处的偏移量处的偏移量0150H0150H送送DXDX则执行则执行: MOV DX: MOV DX,SEG ABCSEG ABC此语句将此语句将ABCABC处的段地址处的段地址1EFFH1EFFH送送DXDX3)3)分析运算符的分析运算符的TYPETYPE,SIZESIZE及及LENGTHLENGTH可以把存储器一可以把存储器一

42、些特征作为数值送回。些特征作为数值送回。 TYPETYPE运算符用来取存储器的单元运算符用来取存储器的单元类型类型,各单元类型对应值,各单元类型对应值如下:如下: 存储器单元类型存储器单元类型 对应值对应值 DBDB( (字节字节) ) 1 1 DWDW( (字字) ) 2 2 DDDD( (双字双字) ) 4 4 LENGTH LENGTH运算符用来计算一个存储区的单元的数目。运算符用来计算一个存储区的单元的数目。 SIZESIZE运算符用来计算一个存储区的字节总数。运算符用来计算一个存储区的字节总数。 若若BUFFERBUFFER存储区是用如下伪指令定义的:存储区是用如下伪指令定义的: B

43、UFFER BUFFER DWDW 100 DUP (?) 100 DUP (?) 则则TYPE BUFFERTYPE BUFFER等于等于2 2, LENGTH BUFFERLENGTH BUFFER等于等于100100,SIZE BUFFERSIZE BUFFER等于等于200200合成运算符合成运算符PTRPTR 用来对存储单元规定类型用来对存储单元规定类型, ,通常和通常和BYTE, WORDBYTE, WORD和和DWORDDWORD等连起来使用。等连起来使用。考虑下面的语句:考虑下面的语句:MOV 1000MOV 1000,0 0 ;类型不定类型不定MOV BYTE PTR1000

44、MOV BYTE PTR1000,0 0 ;1000字节单元清零字节单元清零MOV WORD PTR1000MOV WORD PTR1000,0 0 ;1000开始的字单元清零开始的字单元清零10001000字节单元清零?字节单元清零?10001000开始的字单元清零?开始的字单元清零?INC WORD PTRSI INC WORD PTRSI ;SI所指内存所指内存1个字自增个字自增1JMP DWORD PTR SIJMP DWORD PTR SI ;段地址;段地址CSCS在在SISI、SI+1SI+1中中 ;偏移量;偏移量IPIP在在SI+2SI+2、SI+3SI+3中中标号赋值伪指令标号

45、赋值伪指令EQUEQU 为了便于阅读和修改,汇编程序常常使用标识符代表数据为了便于阅读和修改,汇编程序常常使用标识符代表数据或者寄存器,必须在源程序前用或者寄存器,必须在源程序前用EQUEQU伪指令对标识符赋值。伪指令对标识符赋值。 格式为:格式为: 标识符标识符 EQU EQU 操作数操作数例如:例如: CONSTANT EQUCONSTANT EQU 100 100 COUNT EQU CXCOUNT EQU CX 在一个程序中不能用在一个程序中不能用EQUEQU对一个标识符多次重复定义。对一个标识符多次重复定义。标号解除伪指令标号解除伪指令PURGEPURGE 此伪指令用来解除用此伪指令

46、用来解除用EQUEQU对某一个标识符的赋值对某一个标识符的赋值例如:例如: PURGE CONSTANTPURGE CONSTANT等号伪指令等号伪指令 = = 与与EQUEQU功能一样,但那是可以多次重复定义同一标识符功能一样,但那是可以多次重复定义同一标识符v汇编的常用的伪指令汇编的常用的伪指令定位伪指令定位伪指令ORGORG 指定数据段或者代码段的偏移地址。指定数据段或者代码段的偏移地址。 DATA SEGMENTDATA SEGMENT ORG 0200H ORG 0200H BUF DB 10 DUP (?) BUF DB 10 DUP (?) ;变量;变量BUFBUF的在数据段的偏

47、移地址的在数据段的偏移地址 DATA ENDS DATA ENDS ;是;是0200H0200H,省略为,省略为0000H0000H CODE SEGMENT CODE SEGMENT ASSUME CS:DCODE,DS,DATA ASSUME CS:DCODE,DS,DATA ORG 1000H ORG 1000H ;首条指令在代码段的偏移地址;首条指令在代码段的偏移地址 MOV AX,DATA MOV AX,DATA ;是;是1000H1000H,省略为,省略为0100H0100H MOV DS,AX MOV DS,AX CODE ENDS CODE ENDSEND END 地址计数器地

48、址计数器 $ 汇编语言中,每一个段都有一个地址计数器汇编语言中,每一个段都有一个地址计数器$,指示当前指,指示当前指令或者数据的在段内的偏移量。令或者数据的在段内的偏移量。某数据段定义如下:某数据段定义如下:DATA SEGMENTDATA SEGMENT ORG 1000H ORG 1000H BUF DW 1,2,$+3,$-2,1234H BUF DW 1,2,$+3,$-2,1234H COUNT EQU ($-BUF)/2 COUNT EQU ($-BUF)/2 NUM DW 5ABBH,$-BUF NUM DW 5ABBH,$-BUFDATA ENDSDATA ENDS汇编后内存的

49、分配如右所示:汇编后内存的分配如右所示: 1000H1000H1001H1001H1002H1002H1003H1003H1004H1004H1005H1005H1006H1006H1007H1007H1008H1008H1009H1009H100AH100AH100BH100BH01H01H00H00H02H02H00H00H07H07H10H10H04H04H10H10H34H34H12H12H5AH5AHBBHBBH概述概述:1)1) SEGMENTSEGMENT和和ENDSENDS前面的标识符为各个段的名称,可以任意起前面的标识符为各个段的名称,可以任意起名,一般把数据段的段名记做名,

50、一般把数据段的段名记做DATADATA,堆栈段的段名记做,堆栈段的段名记做STACKSTACK,代码段的段名记做代码段的段名记做CODECODE。2) ASSUME2) ASSUME告诉汇编程序,哪一个段是数据段,哪一个段是堆栈告诉汇编程序,哪一个段是数据段,哪一个段是堆栈段,哪一个段是代码段。除段,哪一个段是代码段。除CSCS的值可以自动装入外,的值可以自动装入外,其他各段其他各段的实际值还要用的实际值还要用MOVMOV指令来赋值。指令来赋值。3) 3) 指令性语句的标识符后面要指令性语句的标识符后面要有冒号有冒号,如标识符,如标识符NEXTNEXT;指示性;指示性语句的标识符后面语句的标识

51、符后面没有冒号没有冒号,如标识符,如标识符DATADATA、CODECODE。4) 4) 每一个汇编程序都要调用每一个汇编程序都要调用21H21H中断的中断的4C4C功能子程序让程序正功能子程序让程序正常结束,否则运行出错。常结束,否则运行出错。4.4 汇编程序设计概述汇编程序设计概述例例: :要求完成两个要求完成两个3232位的数据相加运算位的数据相加运算 DATA SEGMENTDATA SEGMENT X DD 10008423HX DD 10008423H Y DD 20007F00HY DD 20007F00H Z DD ? Z DD ? DATA ENDS DATA ENDS CO

52、DE SEGMENT CODE SEGMENT ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATA START:MOV AX,DATA START:MOV AX,DATA MOV DS,AX MOV DS,AX ;初始化;初始化DSDSv顺序程序设计顺序程序设计 顺序程序完全按指令书写的前后顺序执行每一条指令,是顺序程序完全按指令书写的前后顺序执行每一条指令,是最基本、最常见的程序结构最基本、最常见的程序结构 MOV SI MOV SI,OFFSET XOFFSET X MOV AX MOV AX,SI SI ;取第;取第1 1个数的低个数的低1616位

53、送位送AXAX MOV DI MOV DI,OFFSET YOFFSET Y ADD AX ADD AX,DI DI ;低;低1616位相加位相加 MOV BX, OFFSET ZMOV BX, OFFSET Z MOV BX MOV BX,AX AX ;送低;送低1616位和位和 MOV AX MOV AX,SI+2 SI+2 ;取第;取第1 1个数的高个数的高1616位送位送AXAX ADC AX ADC AX,DI+2 DI+2 ;高;高1616位连同进位标志相加位连同进位标志相加 MOV BX+2 MOV BX+2,AX AX ;送高;送高1616位和位和 MOV AH,4CHMOV

54、AH,4CH INT 21H INT 21H ;程序结束;程序结束 CODE ENDSCODE ENDS END START END START 例:例: 编写程序,判别键盘上输入的字符;若是编写程序,判别键盘上输入的字符;若是0 09 9字符,则字符,则显示之;若为显示之;若为a-za-z字符,均显示字符,均显示“c”c”;若是回车字符;若是回车字符(0DH)(0DH),则结束程序;若为其它字符则不显示。则结束程序;若为其它字符则不显示。v分支程序设计分支程序设计JCCJCC条件满足?条件满足?Y YN N单分支单分支语句体语句体JCCJCC条件满足?条件满足?Y YN N双分支双分支语句体

55、语句体1 1JMPJMP语句体语句体2 2条件条件1 1?Y Y语句体语句体1 1条件条件2 2?Y Y语句体语句体2 2多分支多分支条件条件N N?Y Y语句体语句体N N CODE SEGMENTCODE SEGMENT ASSUME CS:CODE ASSUME CS:CODE START: MOV AH,1 START: MOV AH,1 INT 21H INT 21H CMP AL,0DH CMP AL,0DH JZ DONE JZ DONE CMP AL,0 CMP AL,0 JB START JB START CMP AL,9 CMP AL,9 JA CHRDN JA CHRDN

56、 MOV DL,AL MOV DL,AL MOV AH,2 MOV AH,2 INT 21H INT 21H JMP START JMP START CHRDN: CMP AL,a CHRDN: CMP AL,a JB START JB START CMP AL,z CMP AL,z JA START JA START MOV DL,C MOV DL,C MOV AH,2 MOV AH,2 INT 21H INT 21H JMP START JMP START DONE: MOV AH,4CH DONE: MOV AH,4CH INT 21H INT 21H CODE ENDS CODE EN

57、DS END END回车则结束回车则结束在在09之间则输出之间则输出相应的数字相应的数字低于低于0高于高于9低于低于a高于高于z在在az之间则之间则输出输出Cv循环程序设计循环程序设计LOOPLOOP条件满足?条件满足?CX0CX0CX=0CX=0计数循环计数循环 CX CX赋初值赋初值循环体循环体JCCJCC条件满足?条件满足?是是否否条件循环条件循环 循环初始条件循环初始条件循环体循环体 循环结束的控制可以用循环次数,还可以用特定条件等:循环结束的控制可以用循环次数,还可以用特定条件等:1)1)计数控制循环:计数控制循环:LOOPLOOP、LOOPZLOOPZ、LOOPNZLOOPNZ2)

58、2)条件控制循环:条件控制循环:JCCJCC例:计算例:计算SUMSUMi ii i1 1100100COUNT EQU CXCOUNT EQU CXDATA SEGMENTDATA SEGMENT ;数据段开始;数据段开始 SUM DW ? SUM DW ?DATA ENDSDATA ENDS ;数据段结束;数据段结束CODE SEGMENTCODE SEGMENT ;代码段开始;代码段开始 ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATA ORG 200H ORG 200H ;代码段偏移量为;代码段偏移量为0200H0200H处存放代码处存放代码

59、MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX ;数据段寄存器赋值数据段寄存器赋值 XOR AX,AX XOR AX,AX ;累加器累加器AXAX清零清零 MOV MOV C COUNTOUNT,100 ,100 ;置循环次数置循环次数,CX=100,CX=100NEXT: ADD AX,CX NEXT: ADD AX,CX ;求累加和求累加和 LOOP NEXT LOOP NEXT MOV SUM,AX MOV SUM,AX ;将累加和送指定单元将累加和送指定单元 MOV AH,4CH MOV AH,4CH INT 21H INT 21H ;4C4C号

60、功能调用号功能调用: :终止当前程序并返回调用程序终止当前程序并返回调用程序CODE ENDSCODE ENDS ;代码段结束;代码段结束END END ;汇编程序结束;汇编程序结束例:以例:以1010进制向屏幕输出进制向屏幕输出BXBX中的中的1616位无符号数位无符号数分析:将分析:将BXBX的数据除以的数据除以1010,余数保存,商继续除以,余数保存,商继续除以1010,余数保,余数保存,直到商为存,直到商为0 0,余数的倒序即为待显示的数字;将待显示的,余数的倒序即为待显示的数字;将待显示的数字加数字加30H30H变成对应数字的变成对应数字的ASCIIASCII码,调用码,调用21H2

温馨提示

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

评论

0/150

提交评论