原理与接口技术-第4章.ppt
《原理与接口技术-第4章.ppt》由会员分享,可在线阅读,更多相关《原理与接口技术-第4章.ppt(63页珍藏版)》请在三一办公上搜索。
1、第4章 汇编语言程序设计,【学习目标】汇编语言程序设计是开发微机系统软件的基本功,在程序设计中占有十分重要的地位。本章将选择广泛使用的IBM PC机作为基础机型,着重讨论8086/8088汇编语言的基本语法和程序设计的基本方法,以掌握一般汇编语言程序设计的初步技术。【学习要求】理解8086/8088汇编语言的一般概念。通过学习8086/8088汇编源程序实例,理解源程序的结构。学习汇编语言语句的类型及格式,掌握指令语句与伪指令语句的异同点。学习8086/8088汇编语言的数据项时,着重分清变量与标号的区别。学习表达式和运算符时,重点掌握地址表达式的3个属性。熟练掌握和灵活运用顺序结构、分支结构
2、、循环结构3种基本结构。,4.1程序设计语言概述,程序设计语言是专门为计算机编程所配置的语言。它们按照形式与功能的不同可分为3种,即机器语言、汇编语言和高级语言。机器语言(Machine Language):由0、1二进制代码书写和存储的指令与数据。它的特点是能为机器直接识别与执行;程序所占内存空间较少。高级语言(High Level Language):脱离具体机器(即独立于机器)的通用语言,不依赖于特定计算机的结构与指令系统。高级语言源程序也必须经编译程序或解释程序编译或解释生成机器码目标程序后方能执行。它的特点是简短、易读、易编;其缺点是编译程序或解释程序复杂,占用内存空间大,且产生的目
3、标程序也比较长,因而执行时间就长;同时,目前用高级语言处理接口技术、中断技术还比较困难。所以,它不适合于实时控制。汇编语言(Assembly Language):介于机器语言与高级语言之间的一种中低级语言。它是用指令的助记符、符号地址、标号等书写程序的语言,简称符号语言。它的特点是易读、易写、易记。其缺点是不能为计算机所直接识别。,汇编语言语句必须遵循严格的语法规则,由汇编语言写成的语句,必须遵循严格的语法规则。现将与汇编语言相关的几个名词介绍如下。汇编源程序:它是按严格的语法规则用汇编语言编写的程序,称为汇编语言源程序,简称为汇编源程序或源程序。汇编(过程):将汇编源程序翻译成机器码目标程序
4、的过程称为汇编过程或简称汇编。手工汇编与机器汇编:前者是指由人工进行汇编,而后者是指由计算机进行汇编。汇编程序:为计算机配置的担任把汇编源程序翻译成目标程序的一种系统软件。驻留汇编:它又称为本机自我汇编,是在小型机上配置汇编程序,并在译出目标程序后在本机上执行。交叉汇编:它是多用户终端利用某一大型机的汇编程序进行它机汇编,然后在各终端上执行,以共享大型机的软件资源。汇编语言程序的上机与处理过程如图4.1所示。,汇编语言程序的上机与处理过程,图中,椭圆表示系统软件及其操作,方框表示磁盘文件。椭圆中横线上部是系统软件的名称,横线下部是软件所作的操作。此图说明了从源程序输入、汇编到运行的全过程。首先
5、,用户编写的汇编语言源程序要用编辑程序(如编辑程序EDIT或各种编辑器等)建立与修改,形成属性为.ASM的汇编语言源文件;再经过汇编程序进行汇编,产生属性为.OBJ的以二进制代码表示的目标程序并存盘。.OBJ文件虽然已经是二进制文件,但它还不能直接上机运行,必须经过连接程序(LINK)把目标文件与库文件以及其他目标文件连接在一起,形成属性为.EXE的可执行文件,这个文件可以由DOS装入内存,最后方能在DOS环境下在机器上执行之。,4.2 8086/8088汇编源程序,4.2.1 8086/8088汇编源程序实例【例4.1】将数据段内存单元DATA中的数据12H与立即数16H相加,然后把和数存入
6、SUM单元中保存。一个用完整的段定义语句编写的汇编语言源程序如下。DSEG SEGMENT;定义数据段,DSEG为段名DATADB 12H;用变量名DATA定义一个字节的内存单元,初值为12HSUMDB 0;用变量名SUM定义一个字节,初值为0DSEGENDS;定义数据段结束SSEGSEGMENT STACK;定义堆栈段,这是组合类型伪指令,其后必须跟STACK类型名 DB.512 DUP(0);在堆栈段内定义512个字节的连续内存空间,且初值为0SSEENDS;定义堆栈段结束CSEG SEGMENT;定义代码段开始ASSUME DS:DSEG,SS:SSEG,CS:CSEG;由ASSUME伪
7、指令定义各段寄存器的内容START:MOV AX,DSEG;设置数据段的段地址 MOV DS,AX MOV AL,DATA;将变量DATA中的12H置入AL ADD AL,16H;将AL的12H加上16H的和置入AL中 MOV SUM,AL;将AL中的和数送SUM单元保存 MOV AH,4CH;DOS功能调用语句,机器将结束本程序的运行,返回DOS状态 INT 21HCSEG ENDS;定义代码段结束 END START;整个汇编程序结束,规定入口地址,汇编源程序在结构和语句格式上的几个特点,第一,汇编源程序一般由若干段组成,每个段都有一个名字(叫段名),以SEGMENT作为段的开始,以END
8、S作为段的结束,这两者(伪指令)前面都要冠以相同的名字。从段的性质上看,可分为代码段、堆栈段、数据段和附加段4种,但代码段与堆栈段是不可少的,数据段与附加段可根据需要设置。在上面的例子中,程序分三段:第一段为数据段,段名是DSEG,段内存放原始数据和运算结果;第二段为堆栈段,段名是SSEG,其功能用于存放堆栈数据;第三段为代码段,段名是CSEG,它用于包含实现基本操作的指令。在代码段中,用ASSUME命令(伪指令)告诉汇编程序,在各种指令执行时所要访问的各段寄存器将分别对应哪一段。程序中不必给出这些段在内存中的具体位置,而由汇编程序自行定位。各段在源程序中的顺序可任意安排,段的数目原则上也不受
9、限制。第二,汇编源程序的每一段是由若干行汇编语句组成的,每一行只有一条语句,且不能超过128个字符,但一条语句允许有后续行,最后均以回车作结束。整个源程序必须以END语句来结束,第三,每一条汇编语句最多由4个字段组成,它们均按照一定的语法规则分别写在一个语句的4个区域内,各区域之间用空格或制表符(TAB键)隔开。汇编语句的4个字段是:名字或标号;操作码(指令助记符)或伪操作命令;操作数表(操作数或地址);注释。,4.2.2 8086/8088汇编语言语句的类型及格式,1汇编语言语句的类型汇编语言源程序的语句可分为两大类:指令性语句(简称指令语句)和指示性语句(简称伪指令语句)。指令性语句是指由
10、指令组成的一种可执行的语句,它在汇编时,汇编程序将产生与它一一对应的机器目标代码。例如:汇编指令机器码MOVDS,AX8E D8ADDAX,BX03 C3,指示性语句,指示性语句是指由伪指令组成的一种只起说明作用而不能执行的语句,它在汇编时只为汇编程序提供进行汇编所需要的有关信息,如定义符号,分配存储单元,初始化存储器等,而本身并不生成目标代码。例如:DATASEGMENTAADW 20H,-30HDATAENDS这3条伪指令语句只是告诉汇编程序定义一个段名为DATA的数据段。在汇编时,汇编程序将把变量AA定义为一个字类型数据区的首地址,在内存区的数据段中使数据的存放形式为:AA:20H,00
11、H,0D0H,0FFH,2汇编语言语句的格式,汇编语言源程序的语句一般由4个字段组成,但它们在指令性语句和指示性语句中的含义有些区别。1)指令性语句的格式标号:前缀指令助记符操作数表;注释其中,表示可以任选的部分;操作数表是由逗号分隔开的多个操作数。(1)标号标号代表“:”后面的指令所在的存储地址,供JMP、CALL和LOOP等指令作操作数使用,以寻找转移目标地址。(2)前缀8086/8088中有些特殊指令,常作为前缀同其他指令配合使用,例如和“串操作指令”(MOVS、CMPS、SCAS、LODS与STOS)连用的5条“重复指令”(REP、REPE/REPZ、REPNE/REPNZ),以及总线
12、封锁指令LOOK等,都是前缀。(3)指令助记符包括8086/8088的全部指令助记符,以及用宏定义语句定义过的宏指令名。(4)操作数表对8086/8088的一般性执行指令来说,操作数表可以是一个或两个操作数,若是两个操作数,则称左边的操作数为目标操作数,右边的操作数为源操作数;对宏指令来说,可能有多个操作数。操作数之间用逗号分隔开。(5)注释以“;”开始,用来简要说明该指令在程序中的功能,以提高程序的可读性。,2)伪指令语句的格式,名字伪操作命令操作数表;注释其中,“名字”可以是标识符定义的常量名、变量名、过程名、段名等。所谓标识符是由字母开头,由字母、数字、特殊字符(如?、下划线、等)组成的
13、字符串。注意:名字的后面没有冒号,这是它同指令语句中的标号在格式上的主要区别。,4.3 8086/8088汇编语言的数据项与表达式,操作数是汇编语言语句中的一个重要字段。它可以是寄存器、存储器单元或数据项。而汇编语言能识别的数据项又可以是常量、变量、标号和表达式。常量常量是指汇编时已经有确定数值的量,它有多种表示形式,常见的有二进制数、十六进制数、十进制数和ASCII码字符串。其中,十六进制数的第一个数值必须是09,如7A65H、0FA9H等;ASCII字符串是用单引号括起来的一个或多个字符,如IBM PC、OK等。常量可以用数值形式直接写在汇编语言的语句中,也可以用符号形式预先给它定义一个“
14、名字”,供编程时直接引用。用“名字”表示的常量称为符号常量,符号常量是用伪指令“EQU”或“”来定义的。例:ONE EQU 1DATA12*12HMOV AX,DATA1+ONE即把25H送AX。常量是没有属性的纯数据,它的值是在汇编时确定的。,变量,变量是内存中一个数据区的名字,即数据所存放地址的符号地址,它可以作为指令中的存储器操作数来引用。由于存储器是分段使用的,因而对源程序中所定义的变量也有3种属性:段属性(变量所在段的段地址)、偏移值属性(该变量与起始地址之间相距的字节数)和类型属性(数据项的存取长度单位)。注意:“变量”与“标号”有2点区别:(1)变量指的是数据区的名字;而标号是某
15、条执行指令起始地址的符号表示;(2)变量的类型是指数据项存取单位的字节数大小(即字节、字、双字、四字或十字),而标号的类型则指使用该标号的两条指令之间的距离远近(即NEAR或FAR)。变量名应由字母开头,其长度不能超过31个字符。在定义变量时,变量名对应的是数据区的首地址。若需对数据区中其他数据项进行操作时,必须修改地址值以指出哪个数据项是指令中的操作数。例:MOV SI,WDATA+2语句是指要取WDATA存储单元下面的第2个数据项给SI。,标号,标号是为指令性语句所在地址所起的名字,它表明该指令在存储器中的位置,用来作为程序转移的转向地址(目标地址)。和变量一样,标号也具有3个属性:段属性
16、、偏移地址属性和类型属性(距离属性)。标号的段属性和偏移地址属性分别指它的段地址和段内偏移地址,而距离属性(或类型属性)分NEAR与FAR两种。标号是用标识符定义的,即以字母开头,由字母、数字、特殊字符(如?、下划线、等)组成的字符串表示。标号的最大长度一般不超过31个字符,除宏指令名外,标号不能与保留字相同。保留字包括:CPU寄存器名、指令助记符、伪指令、某些已由系统赋予有特定含义的名字。标号最好用在程序功能方面具有一定含义的英文单词或单词缩写表示,以便于阅读。标号也可单列一行,紧跟的下一行为执行性指令。例:SUBROUT:MOV AX,3000H,使用NEAR与FAR两种类型标号的区别,“
17、标号”通常只在循环、转移和调用指令中使用。使用时要注意两种类型标号的不同点:NEAR类型的标号是指标号所在的语句和调用指令或转移指令在同一个代码段中,执行调用指令或转移指令时,只需要把标号的偏移地址送给IP,就可以实现调用或转移,并不需要改变码段的段值;FAR类型的标号则不同,它所在的语句与其调用指令或转移指令不在同一码段中,执行调用指令或转移指令时,不仅需要改变偏移地IP的值,而且还需要改变代码段寄存器CS的值。,表达式和运算符,常量、变量和标号是汇编语言中表示数据的3种基本形式。在实际使用时,通常需要将它们用运算符组合成所谓表达式作为汇编语言的数据。注意,表达式并不是指令,所以它本身不能执
18、行,而只能在汇编时由汇编程序预先对它们进行运算,然后再将所得的值作为操作数参加指令规定的操作。也就是说,表达式的求值是由汇编程序来完成的。8086/8088汇编语言中使用的表达式有两类:一类是数值表达式,它在汇编时只产生一个数值,仅具有大小而无其他属性,可作为执行性指令中的立即数和数据区中的初值使用;另一类是地址表达式,它产生的结果表示一个存储器地址,其值一般都是段内的偏移地址,因此它具有段属性、偏移值属性和类型属性。地址表达式主要用来表示执行性指令中的操作数。,表达式的组成及运算符的类型,表达式由运算对象和运算符组成。运算对象可根据不同的运算符选用常量、变量或标号。常用的运算符主要包括以下几
19、种类型。算术运算符;逻辑运算符;关系运算符;数值返回运算符;属性运算符。,1算术运算符,常用的算术运算符包括加()、减()、乘(*)、除(/)和模除MOD(取余数)、左移(SHL)和右移(SHR)共7种。其中,MOD运算符表示两整数相除以后取余数,例:17 MOD 7结果为3。SHR为右移运算符,SHL为左移运算符。例:设NUMB01010101B,则NUMB SHL 110101010B。算术运算符用于数值表达式时,其汇编结果是一个数值。注意,除了加和减运算符可以使用变量或标号外,其他算术运算符只适用于常量的数值运算。,2逻辑运算符,逻辑运算符包括AND(与)、OR(或)、XOR(异或)、N
20、OT(非)共4种。逻辑运算符只能用于数值表达式,用来对数值进行按位逻辑运算,并得到一个数值;而对地址进行逻辑运算则无意义。这4种运算符与逻辑运算指令中的助记符书写的名称一样,但它们在语句中的位置和作用不同。表达式中的逻辑运算符出现在语句的操作数部分,并且是在汇编时由汇编程序完成的;而逻辑运算指令中的助记符出现在指令的操作码部分,其运算是在指令执行时完成的。例:MOV AL,0ADH AND 0EAH等价于MOV AL,0A8H,3关系运算符,关系运算符有6个,即:EQ(或),NE(或),LT(或),LE(或),GE(或)。在数值表达式中参与关系运算的必须是两个数值,或同一段中的两个存储单元地址
21、,关系运算的结果是一逻辑值(常数),其数值在汇编时获得。当关系成立(为真)时,结果为0FFFFH;当关系不成立(为假)时,结果为0。例:AND AX,(NUMB LT 5)AND 30)OR(NUMB GE 5)AND 20)当NUMB5时,指令含意为AND AX,30;当NUMB5时,指令含意为AND AX,20。此例中,操作符AND与操作数表达式中的AND具有不同的含意,前者是助记符,后者是伪运算。,4数值返回运算符,数值返回运算符用来分析一个存储器操作数(即变量或标号)的属性,即将它分解为其组成部分(段地址、偏移值、类型、数据字节总数、数据项总数等),并在汇编时以数值形式返回给存储器操作
22、数。运算符总是加在运算对象之前,返回的结果是一个数值。这里介绍几个常用的数值返回运算符SEG、OFFSET、TYPE、LENGTH、SIZE。1)SEG运算符SEG运算符加在变量名或标号之前,它返回的数值是位于其后的变量或标号的段地址。例:MOVAX,SEG DATA;将变量DATA的段地址送AX如果变量DATA的段地址为0618H,则该指令执行后,AX0618H。,数值返回运算符,2)OFFSET运算符OFFSET运算符加在变量或标号之前,它返回的数值是位于其后的变量或标号的偏移值。例:MOV SI,OFFSET DATA1;将变量DATA1的偏移地址送SI3)TYPE运算符TYPE运算符加
23、在变量或标号之前,它返回的数值是反映该变量或标号类型的一个数值,如果是变量,则返回数值为字节数:DB为1,DW为2,DD为4,DQ为8,DT为10;如果是标号,则返回数值为代表该标号类型的数值:NEAR为1(FFH),FAR为2(FEH)。,数值返回运算符,4)SIZE运算符SIZE运算符加在变量之前,它返回的数值是变量所占数据区的字节总数。5)LENGTH运算符LENGTH运算符加在变量之前,它返回的数值是变量数据区的数据项总数。如果变量是用重复数据操作符DUP说明的,则返回外层DUP前面的数值;如果没有DUP说明,则返回的数值总是1。例:DATA1 DW 100 DUP(?)则:LENGT
24、H DATA1的值为100SIZE DATA1的值为200TYPE DATA1的值为2,5属性运算符,属性运算符用来说明或修改存储器操作数的某个属性。1)PTR运算符PTR运算符用来说明或修改位于其后的存储器操作数的类型。例:CALL DWORD PTRBX;说明存储器操作数为4个字节长,即调用远过程MOV AL,BYTE PTRSI;将SI指向的存储器字节数送AL如果一个变量已经定义为字变量,利用PTR运算符可以修改它的属性。例如,变量VAR已定义为字类型,若要将VAR当作字节操作数写成MOV AL,VAR则会出错,因为两个操作数的字长类型不同;如果将指令写成MOV AL,BYTE PTR
25、VAR就是合法的,因为指令中已经用BYTE PTR将VAR修改为字节类型操作数。注意,PTR运算符只对当前指令有效。2)THIS运算符THIS运算符用来把它后面指定的类型和距离属性赋给当前的变量、标号或地址表达式,但不分配新的存储单元,它所定义的存储器地址的段和偏移量部分与下一个能分配的存储单元的段和偏移量相同。例:DATAB EQU THIS BYTEDATAW DW?此例中DATAB与DATAW的段地址和偏移量相同,但变量DATAB的类型是字节,而变量DATAW的类型是字。,THIS和PTR的功能与用法区别,注意:运算符THIS和PTR有类似的功能,但具体用法有所不同。THIS是为当前存储
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 原理 接口 技术
链接地址:https://www.31ppt.com/p-6554728.html