汇编语言与汇编程序设计_第1页
汇编语言与汇编程序设计_第2页
汇编语言与汇编程序设计_第3页
汇编语言与汇编程序设计_第4页
汇编语言与汇编程序设计_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

1、第5章汇编语言与汇编程序设计本章知识结构图 汇编语言与汇编程序伪指令汇编语言程序设计方法宏定义与宏调用语句宏调用中的参数替换宏定义的标号、注释及删除宏的退出分支结构程序循环结构程序子程序设计DOS功能调用BIOS功能调用汇编语言概述符号定义伪指令数据定义伪指令段定义伪指令伪指令的类型及其格式宏指令条件汇编第5章 汇编语言与汇编程序设计5.1 汇编语言概述5.2 伪指令5.3 宏指令5.4 条件汇编5.5 程序设计基本方法5.1 汇编语言概述汇编语言:一种面向机器的用符号表示的程序设计语言,这些符号称为助记符。和机器语言不同的是,汇编语言用直观、便于记忆和理解的英文单词或缩写符号来表示指令和数据

2、变量。汇编指令集和伪指令集及其使用规则的统称就是汇编语言。5.1 汇编语言概述5.1.2 汇编程序功能及上机过程汇编程序有各种类型,不同机型其汇编程序也不相同。汇编程序一般都具有宏汇编的功能,支持地址和数据的符号表示,支持对内存的管理,支持程序的模块化组织,支持多种类型的数据表示等。汇编程序的主要功能:(1)检查源程序;(2)测出源程序中的语法错误,并给出出错信息;(3)产生源程序的目标程序,并可给出列表文件;(4)展开宏指令。汇编语言程序设计上机过程5.1 汇编语言概述5.1.3 汇编语言源程序的结构与格式1结构与书写格式汇编语言源程序通常由四部分组成:数据段、附加段、堆栈段和代码段。有时当

3、不需要附加段时,也可采用三段结构。数据段用来存放执行程序时需用的数据,一般至少需要一个数据段。堆栈段用来保存子程序调用或中断服务程序返回地址及现场寄存器的值,此外,还可以临时保存一些工作寄存器和变量的值。代码段存放程序指令代码,实施程序预定的运算与操作。5.1 汇编语言概述2汇编语言语句格式汇编语言语句一般格式: 标识符/语句标号 操作数序列; 注释 表示可选项。(1)标识符:标识符是程序设计人员自己定义的标识符号,简称标号。它可以是变量名,段名及过程名等,用来表示数据、数据在内存中的偏移地址及指令代码在内存中的偏移地址。5.1 汇编语言概述 合法的标识符(标号)的组成规则 组成标号的字符:A

4、Z ,az ,09 ,? , ,$ , _ 标识符长度不限,但只有前31个字符有效。 标号的第一个字符不能是09的数字。不能以数字开头。 机器指令语句中标号必须以冒号(:)结束。伪指令语句中标号后不允许有冒号。 点号.只能用作标识符的第一个字符。 源程序中大、小写字母等效。汇编语言本身对机器指令的助记符号、伪指令助记符号和寄存器名字都已作了定义,称为保留字,在编程时所定义的标识符号通常称为自定义名字。注意:不要用保留字作为自定义名字,以免引起混淆。 标识符(标号)的属性标识符(标号)具有3种属性:段、偏移量和类型。5.1 汇编语言概述(2)操作符操作符可以是指令助记符、伪指令助记符和宏指令(宏

5、名字)符号。无标号时操作符可以从一行的开始书写,有标号时则从标号后开始书写,标号与操作符之间以冒号、空格或水平制表符分隔,操作符与操作数之间以空格或水平制表符分隔。如果操作符后无操作数或注释时,以行终止符(回车符)结束。5.1 汇编语言概述(3)操作数序列操作数是操作符的操作对象,操作数可以是数据本身、标号、寄存器名字或算术表达式。随指令类型的不同而变化。语句中有多个操作数时,彼此间用逗号分隔。操作数后有注释时,以分号“ ; ”结束,无注释时以行终止符结束。5.1 汇编语言概述(4)“ ; ”注释符注释是对程序段功能或语句在程序中的作用的说明,目的是在阅读、分析程序时,便于对程序各部分的逻辑关

6、系有一个大致的了解。提高程序的可读性和可理解性,便于程序的修改和维护。注释可由任意多个字符组成。5.1 汇编语言概述5.1.4 常量、变量、运算符和表达式1常量常量是一个确定的数值,在程序运行期间不能改变。常量可以用作立即数、偏移量以及用于初始化存储器单元。2变量变量是在程序运行期间可以改变的量,变量名按标识符的规则取名。所有的变量都有三种属性:(1)段值:变量所在段的段首址。(2)偏移量:从段首址到变量存储单元的字节数。(3)类型:变量占用的存储器单元的字节数。5.1 汇编语言概述3运算符和表达式表达式由操作数和运算符按语法规则组合而成。表达式的计算结果是一个确定的值,在汇编期间由汇编程序计

7、算。表达式中的操作数可以是寄存器名、常量、标号或变量。5.1 汇编语言概述(1)算术运算符算术运算符完成、*、/和取模运算等。常用于数字操作数,得到数字运算结果,也可以用于地址操作数,但只能进行两种有意义的加、减运算,其他的运算则是无意义的。具体如下: 加法运算符() 减法运算符() 乘法运算符(*) 除法运算符(/) 取模运算符(MOD)5.1 汇编语言概述(2)移位运算符移位运算符有两个:SHR和SHL,分别对常数进行逻辑右移和逻辑左移。(3)逻辑运算符逻辑运算符AND、OR、XOR和NOT分别对常数进行按位逻辑与、逻辑或、异或和逻辑非运算。5.1 汇编语言概述(4)关系运算符关系运算符用

8、于比较两个表达式,表达式中的项必须是常数或同一段内的变量。如果是常数则按无符号数比较,如果是变量则比较它们的偏移量。如果比较结果为真,关系表达式的值为0FFFFH,如果为假,关系表达式的值为0。 等于运算符(EQ) 不等于运算符(NE) 小于运算符(LT) 小于或等于运算符(LE) 大于运算符(GT) 大于或等于运算符(GE)5.1 汇编语言概述(5)分析运算符分析运算符有SEG、OFFSET、TYPE、LENGTH和SIZE。这些运算符用于分解存储器操作数(标号、变量)的各部分(段地址、偏移地址、类型等),并返回相应的值。(6)属性修改运算符这类运算符有PTR和THIS,用来改变存储器操作数

9、的类型属性。(7)记录专用算符记录专用算符有MASK、WIDTH。5.1 汇编语言概述(8)运算符的优先级表达式中有多个运算符时,按优先级从高到低顺序运算,优先级相同的运算符则从左至右运算。任何情况都可以用圆括号改变运算顺序。5.2 伪指令5.2.1 伪指令的类型及其格式1类型(1)符号定义伪指令(2)数据定义伪指令(3)段定义伪指令(4)过程定义伪指令(5)其他伪指令2伪指令的格式格式:标识符 操作数1,操作数2;注释 5.2 伪指令5.2.2 符号定义伪指令符号定义伪指令用于给程序中多次出现的同一个常量或表达式赋予一符号名,该符号名可在程序中替代相应的常量和表达式。1EQU(EQUATE)

10、伪指令2“= ”伪指令5.2 伪指令5.2.3 数据定义伪指令数据定义伪指令用于为数据项分配存储单元,并给所分配的存储单元定义符号名(即定义符号地址),同时初始化该存储单元或由该单元开始的若干连续单元。初始化单元就是将一个值(确定的数值或不确定的值)放入指定的内存单元。常用的数据定义伪指令有DB、DW、DD、DQ和DT。1DB伪指令功能:DB伪指令初始化一个单字节存储单元。2DW伪指令功能:DW伪指令初始化一个单存储单元。5.2 伪指令3DD伪指令4DQ伪指令5DT伪指令6复制操作符在数据定义伪指令的操作数字段中,还可以使用复制操作符DUP,以便定义大量相同数据。复制操作符格式: DUP(初值

11、1,初值n)。表达式的值为一个正整数,用作重复计数,它指定括号中的初值重复定义次数。5.2 伪指令5.2.4 段定义伪指令1SEGMENTENDS伪指令格式: SEGMENT 【定位类型】【组合类型】【类别名】 ENDS(1)定位类型指定了装入某段时,该段对起始地址边界的要求;(2)组合类型组合类型指定段之间的连接关系为可选项;(3)类别名是一个标识符,必须用单引号括起来连接程序LINK将根据组合类型把类别名相同的段连接在一起。5.2 伪指令2ASSUME伪指令当CPU要访问存储器中某段的存储单元时,必须先将指向该段的段寄存器提供的段地址和该存储单元的偏移地址转换为物理地址。ASSUME的作用

12、是告诉汇编程序,把源程序转换为机器代码时,各段寄存器的符号地址,以确定和检查机器指令中操作数所在的段,产生正确的机器指令代码或打印出错误信息。格式:ASSUME 段寄存器名:段名, 例如: ASSUME CS: CODE, DS: DATA, SS: STACK5.2 伪指令3ORG伪指令代码定位伪指令。汇编程序使用了一个地址计数器,用来记录汇编过程中正被汇编指令的偏移地址。ORG伪指令可通过地址计数器提供程序定位功能。用来确定其后的数据和代码存放在相应段中的起始位置。ORG伪指令格式:ORG的值为一个无符号的十六位二进制数,是相对于段基址的偏移量。ORG伪指令把表达式的值赋给地址计数器,使得

13、ORG之后的指令或数据以表达式的值为起始地址开始存放,除非遇到新的ORG伪指令。 5.2 伪指令4过程定义伪指令汇编语言程序的代码段由一个主过程和若干个子过程构成,子过程也称为子程序。利用过程定义伪指令可将程序按功能划分成模块,这样有利于理解、调试和修改程序。格式:过程名PROCNEAR/FAR RET 过程名 ENDP伪指令PROC和ENDP必须成对出现,并且过程名要相同。5其他伪指令5.3 宏指令5.3.1 宏定义与宏调用语句1宏定义宏定义的形式如下:MACRO , 语句串 ENDM2宏调用语句3宏展开5.3 宏指令5.3.2 宏调用中的参数替换参数替换时规定如下:(1)宏定义的形式参数在

14、语句中一定是一个语法单位,即形式参数的两端应有间隔符,间隔符可以是空格、逗号、括号以及运算符等符号。(2)&可作为宏定义中虚设的间隔符,表示其后面的是形参,仅在宏定义中使用。在宏展开时,用相应实参替换。(3)如果参数中包含间隔符,可用尖括号括起来,尖括号中的空格不被忽略。(4)宏定义使用中,如果形参个数大于实参个数,则用空代替,反之忽略多余的实参。5.3 宏指令5.3.3 宏定义的标号、注释及删除1宏定义中的标号2宏定义中的注释(1)宏注释符(2)行注释符(3)块注释3从内存中删除宏定义删除宏定义语句PURGE的使用形式为: PURGE , 宏定义名说明:汇编时将该语句所指的宏定义从内存中删除

15、。5.3.4 宏的退出5.4 条件汇编条件汇编伪指令指示汇编程序根据条件检测选择汇编不同的程序段。5.4.1 条件汇编语句格式: IFX (程序段1) ELSE (程序段2) ENDIF5.4 条件汇编5.4.2 条件汇编伪操作命令的功能(1)IFCONT(2)IFE CONT(3)IF1(4)IF2(5)IFDEFCONT(6)IFNDEF CONT(7)IFBCONT(9)IFIDNCHR1, CHR2(10)IFDIFCHR1, CHR25.4 条件汇编5.4.3 条件汇编伪操作命令举例1IFENDIF:当指定的表达式的值为真时,IF和ENDIF之间的汇编语句才会被汇编。2IFELSEE

16、NDIF:若IF的表达式返回真,则在IF和ELSE之间的语句将被汇编。3IFDEFENDIF:只有当指定的标号、变量或符号被定义时,IFDEFENDIF条件伪指令才汇编一组汇编语言语句。4IFNDEFENDIF:只有当指定的标号、变量或符号不被定义时,IFNDEF ENDIF条件伪指令才汇编一组汇编语言语句。5.5 程序设计基本方法5.5.1 汇编语言程序设计1汇编语言程序设计的基本步骤图5-3 汇编语言程序设计的基本过程5.5 程序设计基本方法2流程图的应用 流程线,指示程序处理的逻辑顺序。 端点框,表示程序的逻辑起点或终点。 判断框,表示一个判断点,在此产生分支,框内注明条件,判断结果标在

17、出口的流程线上。 处理框,表示一种处理功能或者子程序段,框内用文字说明功能。 连接框,框内注有字母,表示程序的去向或来源。5.5 程序设计基本方法3程序的基本结构一个算法用程序设计语言的语句有序地组合在一起加以描述,其组合方法称为程序的控制结构或简称为程序结构。图5-5 顺序结构 图5-7 IF 分支结构 图5-8 CASE分支结构 5.5 程序设计基本方法(3)循环结构循环结构是重复做一系列的动作,直到满足某个条件为止,如图5-9和图5-10所示。图5-9 WHILE-DO型循环结构 图5-10 REPEAT-UNTIL循环结构5.5 程序设计基本方法5.5.2 顺序程序设计【例5-4】求两

18、个数的平均值。这两个数分别放在A单元和B单元中,而平均值的结果放在C单元中。编制程序如下:DATA SEGMENTA DB 8CHB DB 64HC DB ?DATA ENDSCODE SEGMENT ASSUME CS: CODE, DS: DATASTART: PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA ; 初始化数据段 MOVDS, AX MOVAL, A ; 第一个数进入AL ADD AL, B ; 两个数相加,结果进入AL MOV AH, 00 ADC AH, 00 ; 带进位加法 MOV BL, 02 ; 除数2送入BL DIV BL ; AX除以

19、BL的内容,商放在AL中,余数放在AH中 MOV C, AL ; 结果送入C单元 RETCODE ENDS END START5.5 程序设计基本方法5.5.3 分支程序设计分支程序设计方法可分为两类:即通过条件检测实现两路分支,用条件转移指令实现;多路分支,用跳转表和无条件转移指令实现。(1)由条件检测实现程序分支【例5-5】求x、y、z三个数中的最大值,并存入MAX单元。(2)用跳转表实现分支如果程序需要根据几种不同的情况,可以将每段分支程序的入口地址组成一个表,存放在跳转表。跳转表用于实现多路分支,表中每两个字节存放一个入口地址等组成。【例5-6】用跳转表编写一程序,实现程序分支。5.5

20、 程序设计基本方法(3)分支程序设计实例【例5-7】计算分段函数,X,Y均为带符号字节类型数据。 问题的关键需要确定当X取不同数值的时候使用不同的公式。(条件判断); 输入数据X是带符号字节类型数据,可以在数据段中定义;5.5 程序设计基本方法 处理结果Y:按照公式的计算要求,结果一定在字节的表示范围内,也是带符号数; 如何判断条件汇编语言无法直接比较两个数据的大小,所以只能先对两个数做减法操作,根据结果的符号来决定两个数的大小。 确定算法本题中数据X的输入情况被分成了4段,分界点是0、8和15。程序流程图如图5-11所示。 指令的选择图5-11 程序流程图5.5 程序设计基本方法5.5.4

21、循环程序设计1循环程序结构及其组成(1)循环程序结构在程序设计中,控制某个程序段重复执行一定次数的程序,称为循环结构程序。需要反复执行的程序段称为循环体。(2)循环结构程序的组成循环程序主要由四部分组成: 初始化部分 工作部分 修改部分 控制部分5.5 程序设计基本方法【例5-8】从x单元开始的20个连续单元中存有无符号数,从中找出最大数送入y单元中。程序流程图:5.5 程序设计基本方法【例5-9】计算1+2+3+,直到累加和大于1000为止,统计被累加的自然数的个数,并把统计的个数送入COUNT单元,把累加和送入SUM单元。程序流程图如图5-13所示。图5-13 程序流程图 5.5 程序设计

22、基本方法4多重循环程序设计在循环结构中再组织循环称为多重循环,或称为循环嵌套。使用多重循环时,必须注意以下几点:(1)内循环必须在外循环之内,内循环在外循环中位置可以根据需要任意设置,内外循环不能交叉。(2)内循环既可以嵌套在外循环中,也可以几个内循环并列存在。可以从内循环中直接跳到外循环,但不能从外循环直接跳进内循环中。(3)防止出现“死循环”,不要命令循环返回到初始部分,否则会出现“死循环”。(4)每次通过外循环再次进入内循环时,初始条件必须重新设置。5.5 程序设计基本方法5循环程序设计实例【例5-11】内存Data单元开始连续存放100个单字节数据。编程统计数据中0和1个数相同的数据有

23、多少,并将结果存入NUMB单元。(如0F0H中有4个0和4个1,为个数相同。)5.5 程序设计基本方法5.5.5 子程序设计1子程序概念子程序在汇编语言中也称为过程,子程序结构是模块化程序设计的重要基础。在模块化程序设计中,通常要把一个较大程序分解为多个具有独立功能的程序模块,这些独立模块我们将其称为子程序或过程。2子程序的定义子程序是用过程定义语句PROC和ENDP来定义的。3子程序的调用和返回子程序的调用和返回由CALL和RET指令完成,子程序的正确调用和返回是正确执行子程序的保证。5.5 程序设计基本方法4过程属性的确定属性原则(l)调用程序和过程若在同一代码段中,则使用NEAR属性。(

24、2)调用程序和过程若不在同一代码段中,则子程序的类型必须使用FAR属性。 (3)主过程定义为FAR属性。把程序的主过程看作DOS调用的一个子过程,而DOS对主过程的调用和返回都是FAR属性。5.5 程序设计基本方法5子程序的编写方法和要求(1)现场的保护与恢复保护现场和恢复现场可采用以下方法: 利用压栈和出栈指令; 利用内存单元。(2)子程序说明文件一般应编制子程序说明文件,包含下述几项内容: 子程序名; 子程序功能; 入口条件; 出口条件; 受影响的寄存器。5.5 程序设计基本方法7递归子程序:如果一个子程序调用它自身,这种调用就称为递归调用,这样的子程序就称为递归子程序。【例5-13】试编写程序求n!(n=l,设n=5)。递归定义:0! =1,N!=N*(N-1)! ,下面依据递归定义,设计递归程序。算法分析:求N!的程序,也就是求N*(N-1)!,所以为了求(N-1)!,需要递归调用N!程序,只不过调用时使用的参数为(N-1)。设计递归程序要注意保留每次调用时使用的参数和中间结果,通常把这些参数和中间结果放在堆栈中。5.5 程序设计基本方法5.5.6 DOS功能调用与BIOS功能调用

温馨提示

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

评论

0/150

提交评论