教学课件第5章汇编语言程序设计

上传人:夏** 文档编号:568898592 上传时间:2024-07-27 格式:PPT 页数:96 大小:399KB
返回 下载 相关 举报
教学课件第5章汇编语言程序设计_第1页
第1页 / 共96页
教学课件第5章汇编语言程序设计_第2页
第2页 / 共96页
教学课件第5章汇编语言程序设计_第3页
第3页 / 共96页
教学课件第5章汇编语言程序设计_第4页
第4页 / 共96页
教学课件第5章汇编语言程序设计_第5页
第5页 / 共96页
点击查看更多>>
资源描述

《教学课件第5章汇编语言程序设计》由会员分享,可在线阅读,更多相关《教学课件第5章汇编语言程序设计(96页珍藏版)》请在金锄头文库上搜索。

1、第第5章章 汇编语言程序设计汇编语言程序设计一. 学习如何运用指令系统中的指令来编制,采用汇编语言程序来学习程序设计。二. 学习如何组织、构造一个汇编语言源程序所必需的各种伪指令的格式、作用和使用。学习内容5.1概述5.2汇编语言语句5.3汇编语言数据5.4伪指令语句5.5宏指令语句5.6顺序程序设计5.7分支程序设计5.8循环程序设计5.9子程序设计5.10实用程序设计示例5.11汇编语言程序的开发了解学习目标理解汇编语言程序中3种语句格式、特点和作用。理解汇编语言程序中使用的各种运算符;对常用的运算符(如OFFSET、TYPE、PTR等)应会正确使用。掌握汇编语言程序中符号、数据、段结构和

2、过程的定义方法。掌握汇编语言程序中段寄存器的各种加载方法。学习目标了解宏指令的定义和使用。掌握无条件转移指令、条件转移指令、循环控制指令、子程序的调用和返回指令的格式与使用。掌握顺序、分支、循环和子程序结构的程序设计方法与技术。理解在数值运算、串操作运算和代码转换中程序设计实例。了解汇编语言程序的开发过程。重点难点常用汇编语言、伪指令、源程序的一般结构;顺序程序设计,分支程序设计,简单循环程序设计,子程序设计;能够读写常用汇编语句编写的程序段。课时安排:6课时媒体使用:媒体使用:使用多媒体投影,主要采用PowerPoint准备的电子教案。5.1 5.1 概述概述程序:能完成一定的运算与操作功能

3、的指令序列,称为。计算机语言:计算机语言机器语言汇编语言高级语言是以二进制代码0和1组成的机器指令,是计算机能够直接识别和执行的语言。用助记符表示指令功能的计算机语言,它的指令语句与机器指令一一对应。面向用户,与特定机器属性相分离的程序设计语言,更接近人类语言与数学语言。5.2 5.2 汇编语言汇编语言语句语句汇编语言程序:把机器语言程序符号化,且用汇编语言书写的符号指令与用机器语言书写的二进制代码指令(机器指令)有一一对应的关系。汇编语言编制的程序计算机不能识别和执行,必须经过汇编程序的汇编(即翻译)转换成机器语言指令代码(即目标程序),再由计算识别并执行。汇编语言源程序汇编程序机器指令代码

4、一个汇编语言源程序是由若干逻辑段组织的;每个逻辑段由伪指令SEGMENT开始,以ENDS作结束;每个逻辑段均有段名,为调用程序的入口地址。语句是汇编语言程序的基本组成单位。一个汇编语言源程序有3种基本语句: 指令语句 伪指令语句 宏指令语句(或称宏调用语句,在源程序的任意位置上使用宏指令可减少源程序中重复的编写工作)5.1概述例5-1A+BS=CA-B数据段堆栈段代码段一. 指令语句1.指令语句:指令系统的各条指令,每一条指令语句在源程序汇编时都要产生可供计算机执行的指令代码,又称为可执行语句。2. 格式:标号:指令助记符操作数;注释(1)标号一条指令的符号地址(任选项)。(2)指令助记符体现

5、该语句的功能和操作要求(3)操作数根据指令助记符的要求为单操作数或双操作数。(4)注释标识每一条指令的功能,但没有相应的机器指令代码。例1:以下为一条双操作数指令语句LOP:MOVAX,0000H;将AX清零标号指令助记符操作数注释例2:以下为一条单操作数指令语句INCCX;给CX加1二.伪指令语句1.伪指令语句:是指示(命令)汇编程序如何汇编源程序。是由伪指令和相关操作数组成,又称为命令语句 。2. 格式:段名伪指令符操作数;注释(1)段名逻辑段的名称,可以是常量名、变量名、过程名等(任选项)。(2)伪指令符体现该语句的功能和操作要求(3)操作数根据指令助记符的要求为单操作数或双操作数。(4

6、)注释标识每一条指令的功能,汇编时但没有相应的机器指令代码。例1:以下是一条伪指令语句VB1DB12H;给变量VB1分配一个字节单元,并赋初值12H。段名伪指令符操作数注释三三.标识符标识符标识符是指令语句中标号和伪指令语句中的符号名的统称,其组成规则如下:(见教材P174页)指令语句与伪指令语句类类型型定定 义义格格式式作用与功能实现方式和时间作用与功能实现方式和时间指指令令语语句句指令语句又称为可执行语句,即每一条指令语句在源程序汇编时都要产生可供计算机执行的指令代码(即目标代码)。在目标程序(即指令代码)运行时,依赖于计算机内的CPU、存储器、I/O接口等硬设备来实现的伪伪指指令令语语句

7、句伪指令语句又称为命令语句,是指示(命令)汇编程序如何汇编源程序。是由伪指令和相关操作数组成。同上由汇编程序在汇编源程序时,通过执行一段程序来实现的每个语句由4个字段组成:名字 操作符号 操作数 ;注释语句格式:名字名字 操作符号操作符号 操作数操作数 ;注释注释1. 名字字段:名字字段:(1)在指令语句中,名字字段为标号,为一任选字段,且一定是用“:”作为标号的结束符,是一条指令的符号地址通常是一个程序段或子程序的入口指令语句选用标号。(2)在伪指令语句中,可为常量名、变量名、段名和过程名等,该字段是任选还是必需的,要视伪指令而定。名字字段后面用空格作结束符,不得使用冒号。(3)组成名字的规

8、则:P174页。2. 操作符字段:操作符字段:是指令助记符,表示目标程序在运行时中央处理器CPU应完成的功能。 3. 操作数字段:操作数字段:是由操作符字段(指令助记符/伪指令)确定。该字段与操作符字段之间用空格或制表符TAB为分界符。各操作数之间用逗号或空格分隔。4. 注释字段:注释字段:本字段为任选字段,以分号作这字段的开始符,可由任意字符串表示。是对某些程序段或指令加以注解,说明它们的功能及意义。 5.3 5.3 汇编语言汇编语言数据数据5.3.1 5.3.1 符号定义语句符号定义语句(两种伪指令)(1)等值伪指令、 (2)等号伪指令5.3.2 5.3.2 数据定义语句数据定义语句(1)

9、数值表达式、 (2)?表达式、(3)字符串表达式、(4)带DUP表达式5.3 5.3 汇编语言汇编语言数据数据5.3.3 5.3.3 数据数据(1)常数、 (2)寄存器操作数、(3)存储器操作数5.3.4 5.3.4 运算符(运算符(5种)(1)算术运算符、(2)逻辑运算符、(3)关系运算符、(4)数值返回运算符、(5)属性运算符、(6)运算符优先级5.3.1 5.3.1 符号定义语句符号定义语句1 . 1 . 等值伪指令:等值伪指令:格式:格式:功能:功能:EQU是等值伪指令,它把右边的值或符号赋给EQU左边的符号。注意:注意:等值伪指令语句仅在汇编源程序时,作为替代符号作用,不产生任何目标

10、代码,也不分配存储单元。在同一源程序中,同一符号不能用EQU伪指令重新定义。符号符号 EQU 表达式表达式/符号符号:见教材以下各例题:见教材以下各例题(1)常数或数值表达式:例:COUNT EQU 15*2+10 (2)地址表达式:例:ADDR1 EQU DS:BP(3)变量名、标号或指令助记符例:NMU1 EQU COUNT1 ; BEING EQU START ; BTOD EQU DAA ;为变量名CUNT1另定义一个别名。为标号START另定义一个别名。为指令助记符DAA另定义一个别名。2. 2. 等号伪指令:等号伪指令:格式:格式: 符号=表达式/符号功能:功能:与EQU相同 。等

11、号伪指令与等值伪指令之间的差异:等号伪指令与等值伪指令之间的差异:(1)等号伪指令可以重新定义符号。(2)等号伪指令可以为已定义的变量名或标号定义另一个别名,但不能为指令助记符定义另一个别名。例:CONT10HMMOV。CONTCONT10HMADD5.3.2 5.3.2 数据定义语句数据定义语句变量:是指存放在存储单元的数据,在程序执行中,允许其值发生变化。在存储区中,设置常数、数据或保留若干存储单元,应使用数据定义伪指令:5.3.2 5.3.2 数据定义语句数据定义语句数据定义伪指令有:DBDB定义字节数据定义字节数据DWDW定义字数据定义字数据DDDD定义双字数据定义双字数据DFDF定义

12、定义6 6字节数据字节数据DQDQ定义定义8 8字节数据字节数据DTDT定义定义1010字节数据字节数据数据定义语句的格式:变量名 表达式1,表达式2,例:DBDBDWDWDDDDDATASEGMENTDATASEGMENTVAR1DB12HVAR1DB12HVAR2DW1234HVAR2DW1234HVAR3DDVAR3DD12345678H12345678HDATAENDSDATAENDSSEGMENT/ENDSSEGMENT/ENDS表示表示逻辑段的开始逻辑段的开始/结结束束经过数据定义语句定义的变量,均有3个属性:(1)段属性()段属性(SEG):):表示变量存放在哪个逻辑段中,且用这

13、个逻辑段的段基值表示。(2)偏移量属性()偏移量属性(OFFSET):表示在逻辑段中离段起始单元(段基址)的距离(字节数)。(3)类型属性()类型属性(TYPE):):表示变量的数据的大小(字节数据、字数据、双字数据),主要依据DB、DW、DD等伪指令来确定的。几种表达式:1.数值表达式:数值表达式:2.例:3.2. ?表达式:?表达式:DA_B1DB50DA_B1DB50DA_B2DB12HDA_B2DB12H,34H34H,56H56HDA_W1DW1234HDA_W1DW1234HDA_W2DW1234HDA_W2DW1234H,5678H5678H,9ABCH9ABCH?表示可预置任意

14、内容。?表达表示可预置任意内容。?表达式常用于保留一个或多个存储单元,式常用于保留一个或多个存储单元,以备程序运行时,作工作单元或保存以备程序运行时,作工作单元或保存结果用。结果用。VAR_BDBVAR_BDB?,?,?VAR_WDWVAR_WDW?,?,?3. 字符串表达式:字符串表达式:(1)字符串必须用引号(单引号或双引号)括起来。(2)字符串中各字符均是以ASCII码形式存放在相应存储单元中。(3)DB、DW、DD中的字符串的表示形式和字符ASCII码的存储顺序的差异。具体见教材P177页,及图52。4. 带带DUP表达式:表达式: 变量名 表达式1 DUP(表达式2) 例:定义重复数

15、据操作符。定义重复数据操作符。DBDBDWDWDDDD是数据的重复是数据的重复的次数。的次数。是重复数据是重复数据的内容。的内容。NU_B1DB10HDUP(?)NU_B1DB10HDUP(?)NU_W1DW20HDUP(10H)NU_W1DW20HDUP(10H);保留;保留10H10H个字节单元,每个字节单元,每个字节单元可预置任意内容。个字节单元可预置任意内容。;保留;保留20H20H个字节单元,每个字节单元,每个字节单元预置数据为个字节单元预置数据为10H10H,共占有,共占有40H40H个字节存储单个字节存储单元。元。5.3.3 5.3.3 数据数据一、常数:一、常数:1.数值常数:

16、2.字符常数: 用单引号或双引号括起来的一个或多个字符组成的字符序列,称为字符常数。数据有数值和属性,两部数据有数值和属性,两部分,对一个语句汇编成机分,对一个语句汇编成机器目标代码有直接关系器目标代码有直接关系。是没有任何属性的纯数值。是没有任何属性的纯数值。二进制数10111B十进制数982D八进制数21B、73Q十六进制数7AE6H常数的应用:常数的应用:(1)在指令语句的源操作数中作立即数操作数。v例:(2)在指令语句的寻找存储器操作数的各种寻址方式中作位移量。v例:(3)在某些伪指令语句的操作数字段中,赋值数据。例:见教材P179MOVALMOVAL,0ABH0ABHMOVBXMOV

17、BX,ABAB;此处的;此处的ABAB指其指其ASCIIASCII代代码码4142H4142HMOVALMOVAL,DSDS:140H140H;直接寻址方式;直接寻址方式MOVBXMOVBX,45HSI45HSI;变址寻;变址寻址方式址方式MOV0FEHBPMOV0FEHBP,ALAL;基址寻址;基址寻址方式方式MOV1234HBHDIMOV1234HBHDI,AXAX;基址变址寻;基址变址寻址方式址方式二、寄存器操作数:二、寄存器操作数:1.CPU中通用寄存器和段寄存器的内容可作操作数使用。2.CS仅可作源操作数,其他寄存器均可。3.指令指针IP不可作寄存器操作数使用.4.寄存器的内容作操作

18、数的数据时,用寄存器名表示.5.寄存器作地址指针时,要将寄存器名用方括号括起来.三、存储器操作数:三、存储器操作数:1. 变量:变量:在一个逻辑段中,用数据定义语句定义并预置数据初值后,变量名就作为存储单元的符号地址,代表了存放在存储单元的数据。指存储单元中的内容,变量、标号及地址表达式是指存储单元中的内容,变量、标号及地址表达式是这种操作数的主要表示形式。这种操作数的主要表示形式。1. 变量:变量:使用变量的两种情况:(1)在指令语句中的操作数字段中,变量名作为址表达式的组成部分之一。(2)在用DW或DD的数据定义语句中,有三种情况,见教材 P181。2. 标号:标号:定义:定义:指令语句的

19、名字字段上的名字,称为标号。是一条指令的符号地址。标号常作为转移类指令的操作数,表示转移的目标地址。标号的标号的3个属性:个属性:(1)段属性(SEG):表示标号所在指令的逻辑段,且用该逻辑段的段基值表示。(2)偏移量属性(OFFSET):表示标号所在指令距离起始单元之间的字节数。(3)类型属性(TYPE):是作为段内转移不是段间转移的目标地址。有 两种。NEARNEAR(近):段内转移(近):段内转移FARFAR(远):段间转移(远):段间转移5.3.4 5.3.4 运算符运算符1.1.算术运算符算术运算符:(:(表表5-1)5-1)2.2.逻辑运算符逻辑运算符: :按位进行运算。按位进行运

20、算。ANDAND、OROR、XORXOR、NOTNOT3.3.关系运算符:关系运算符:用于比较两个表达式值的大小。 当比较关系式成立时,用全1表示“真”; 当比较关系式不成立时,用全0表示“假”。具体内容具体内容见教材见教材4.4.数值返回运算符:数值返回运算符:定义:定义:数值返回运算符的运算对象是存储器操作数,即由变量名或标号组成的地址表达式。格式:格式: (1)SEG和和OFFSET运算符:运算符:主要反映存储器操作数的地址部分。该运算符出现在变量名或标号的前面,返回这个变量名或标号所在段的段基值勤或在段内的偏移量。例:(2)TYPE运算符:运算符:TYPE运算符是用数字形式表示变量或标

21、号的类型属性。(3)LENGTH和和SIZE运算符:运算符:运算符仅加在变量名的前面,它返回的是数组变量的元素个数( LENGTH )和数组变量所占的总字节数( SIZE )。运算规则:v变量是用重复操作符DUP定义的,则LENGTH 的运算结果是外层DUP的给定值(即外层重复次数)。若无DUP定义,则结果总是1。vSIZE是LENGTH 和TYPE两个运算结果的乘积。反映存储器操作反映存储器操作数的某些特征。数的某些特征。5.5.属性运算符属性运算符PTRPTR:定义:PTR是用来临时对存储器操作数的类型进行设定、说明。格式: 例:6.6.运算符优先级:运算符优先级:(表5-5运算符优先级)

22、(1)先执行优先级别高的运算符;(2)优先级别相同的运算符,按照从左至右顺序进行;(3)可用圆括号改变运算的顺序。5.4 5.4 伪指令语句伪指令语句5.4.1 5.4.1 段定义语句段定义语句重点学习段寄存器的各种加载方式5.4.2 5.4.2 过程定义语句过程定义语句5.4.3 5.4.3 定位语句和位置计数器定位语句和位置计数器5.3.4 5.3.4 偶地址控制语句偶地址控制语句5.3.5 5.3.5 程序标题语句程序标题语句5.4.1 5.4.1 段定义语句段定义语句一、段定义伪指令(一、段定义伪指令(SEGMENT/ENDS)定义:用于程序中设置一个段(逻辑段)。格式:段名段名SEG

23、MENTSEGMENT定位类型定位类型组合类型组合类型 类别名类别名本段语本段语句序列(指令序列、伪句序列(指令序列、伪指令或数据)指令或数据)段名段名ENDSENDS1. 段名段名:2. 定位类型:定位类型:定义:表示对段的起始边界的要求。定位类型选项:(4种)(1)PAGE(页):表示本段从一个页的边界开始。段的起始地址一定能被256整除。段的起始单元地址(段基址)的最后8位二进制数为0(00H)。(2)PARA(节):表示本段从一个小节的边界开始。段的起始单元最后4位二进制数为0(0H)。(3)WORD(字):表示本段从一个偶字节地址开始。段的起始单元最后2位二进制数为0(4)BYTE(

24、字节):表示本段起始单元可以从任一地址开始。由用户自己设定,在程序中当需要引用由用户自己设定,在程序中当需要引用或调用某逻辑段时,即用段名表示。或调用某逻辑段时,即用段名表示。3 . 组合类型:组合类型:表示段与段之间的连接与定位。有6种选择: (教材P188页)4 . 类别名:类别名:注:注:定义一个逻辑段时,段名是必选项,其他三定义一个逻辑段时,段名是必选项,其他三个参数是任选的,各参数之间用空格分隔。个参数是任选的,各参数之间用空格分隔。任选是可只选其中任选是可只选其中1-2个,但是不能改变它们个,但是不能改变它们的先后顺序关系。的先后顺序关系。(1). NONE: (2). PUBLI

25、C(3). COMMON(4). STACK(5). AT(6). MEMORY例:下面是一个源程序分段结构例:下面是一个源程序分段结构DATA1 SEGMENTPARADATADATA1 ENDSSTACK1SEGMENT PATA STACK STACK STACK1 ENDS 二、段寻址伪指令(二、段寻址伪指令(ASSUME)ASSUME伪指令格式:功能:告诉汇编程序已定义的段与段寄存器之间的对应关系。ASSUME随时修改或撤除1-4个段寄存器与已定义段之间的关系。ASSUMEASSUME段寄存器名:段名,段寄存名:段名,段寄存器名:段名,段寄存名:段名,指指4 4个段寄存器个段寄存器C

26、SCS、DSDS、SSSS、ESES中之一中之一指用指用SEGMENT/ENDSSEGMENT/ENDS伪指伪指令语句中给定的段名。令语句中给定的段名。ASSUMEESASSUMEES:NOTHINGNOTHING;撤消对;撤消对ESES的设置的设置ASSUMENOTHINGASSUMENOTHING;撤消全部段寄存器;撤消全部段寄存器的设置的设置例:DATA1 SEGMENTVAR1 DB 12HDATA1 ENDSDATA2 SEGMENTVAR2 DB 34HDATA2 ENDSCODE SEGMENT ASSUME CS:CONE,DS:DATA1,ES:DATA2START MOV

27、AL,VAR1 MOV BL,VAR2CODE ENDSASSUME定义:段寄存器CS、DS和ES分别存放CODE段、DATA1段和DATA2段的段基值数据定义语句DB定义:一是VAR1存放在DATA1的逻辑段中,其段基值即为DATA的段基值段基值;二是VAR1为字节数据。三是VAR1的偏移量偏移量为0。MOV取出存储器操作数VAR2,变量VAR2在DATA2段,其段基值在ES中。三、段寄存器的加载三、段寄存器的加载1.DS和和ES的加载:的加载:2.(1)DS数据段寄存器。 ES附加段寄存器。(2)在程序中,引用段名即以立即数形式获取该段的段基值,而立即数又不能直立即数又不能直接传送给段寄存

28、器接传送给段寄存器,所以在借助于通用寄存器传送段基值给DS、ES。例:DATA_DS SEGMENTDA1 DB 12HDATA_DS ENDSDATA_ES SEGMENTDA2 DB 10H DUP(0)DATA_ES ENDSCODE SEGMENT ASSUME CS:CONE,DS:DATA1,ES:DATA2START: MOV AL,DATA_DS MOV DS,AX MOV AX,DATA_ES MOV ES,AXCODE ENDS代码段代码段CODECODE中第中第1 1、3 3条是以条是以立即数形式把立即数形式把DATA_DSDATA_DS段和段和DATA_DSDATA_D

29、S段的段基值分别送段的段基值分别送给通用寄存器给通用寄存器AXAX。第第2 2、4 4条把条把AXAX中的内容(段中的内容(段基值)分别传送给段寄存器基值)分别传送给段寄存器DSDS、ESES。2. SS的加载:的加载:qSS是堆栈段寄存器,对它加载段寄存器就是设置堆栈。q两种SS的加载方法:(1)自动加载: 在段定义伪指令(SEMENT)的组合类型中选择“STACK”参数,就表明这个段是堆栈段。(2)用执行程序的办法加载: 在程序运行中要调换另一个堆栈段,这时可用类似于DS和ES的加载办法,对SS和SP进行即时修改。例:STACK2 SEGMENT DW 40H DUP(?)(?)TOP L

30、ABEL WORDSTACK2 ENDSCODE SEGMENT MOV AL, STACK2 MOV SS,AX MOV SP,OFFSET TOP CODE ENDS3. CS的加载:的加载:CS和IP提供当前执行目标代码的段基值和偏移量。对CS和IP设置、修改的两种途径:(1)用结束伪指令END加载程序的起始地址。(2)执行程序转移类指令,实现从一个段转移到另一个段时,它的指令功能就是修改CS和IP。用结束伪指令END加载程序的起始地址。q 格式:格式:q其中:其中:地址表达式是一个已定义的标号或一个本标号地址表达式是一个已定义的标号或一个本标号加减一个常数。是这个程序执行的第一条指令语

31、句的加减一个常数。是这个程序执行的第一条指令语句的地址。地址。q例:例:ENDEND地址表达式地址表达式CODE SEGMENT ASSUME CS:CONE,START: MOV AL,DATA CODE ENDS END START结束伪指令结束伪指令ENDEND的作用:的作用:一是源程序到此结束,一是源程序到此结束,后面的任何语句均被后面的任何语句均被汇编程序略去;二是汇编程序略去;二是将地址表达式所确认将地址表达式所确认的存储单元的段基值的存储单元的段基值和偏移量分别自动装和偏移量分别自动装入入CSCS和和IPIP中。中。5.4.2 5.4.2 过程定义语句过程定义语句q格式:格式:q

32、注意:注意:(1)定义过程的开始(PROC)和结束(ENDP)使用同一过程名,且过程名不能省略。(2)过程名即为子程序名,也子程序调用指令(CALL)的目标操作数。(3)过程名也有3个属性。其中类型分为NEAR和FAR。具体内容见教材P192页。过程名过程名PROCPROCNEAR/FARNEAR/FARRETRET过程名过程名ENDPENDP5.4.3 5.4.3 定位语句和位置计定位语句和位置计数数q格式:格式:q注意:注意:(1)定义过程的开始(PROC)和结束(ENDP)使用同一过程名,且过程名不能省略。(2)过程名即为子程序名,也子程序调用指令(CALL)的目标操作数。(3)过程名也

33、有3个属性。其中类型分为NEAR和FAR。具体内容见教材P192页。过程名过程名PROCPROCNEAR/FARNEAR/FARRETRET过程名过程名ENDPENDP5.5 5.5 宏指令语句宏指令语句宏汇编程序:能处理宏指令功能的汇编程序。宏指令的使用过程是:宏定义、宏调用、宏展开。1. 宏定义格式:(1)不带参数宏定义:(2)带参数宏定义:宏指令必须首先进行宏定义。宏指令必须首先进行宏定义。MACROMACRO和和ENDMENDM是宏定义的开是宏定义的开始和结尾伪指令。始和结尾伪指令。宏名宏名MACROMACROENDMENDM宏体宏体宏名宏名MACROMACROENDMENDM宏体宏体

34、形参形参1 1,形参,形参222. 宏调用格式:(1)不带参数宏调用:(2)带参数宏调用:在宏指令定义后,在源程序在宏指令定义后,在源程序的任意位置上可以使用宏指的任意位置上可以使用宏指令语句(即宏调用)令语句(即宏调用)宏名宏名宏名宏名实参实参1 1,实参,实参2 2,MULTAX10MULTAX10MULT10AXMULT10AX,BABA3. 宏展开 宏展开的定义:当宏汇匾程序扫描到宏指令语句(宏调用)当宏汇匾程序扫描到宏指令语句(宏调用)时,就把宏定义中宏体的程序段目标代码插入时,就把宏定义中宏体的程序段目标代码插入宏指令语句的位置上。宏指令语句的位置上。 5.6 顺序程序设计顺序程序

35、是最简单的,也是最常用的程序结构形式。其特点:程序运行时,完全按照编写的指令顺序执行,且每条指令仅执行一次。例:5-2见教材P197页。例:5-3见教材P199页。5.6顺序程序设计-例5-2(1)10*(X+Y)-3*(Z-1)F= X+Y+Z5.6顺序程序设计-例5-2(2)TITLE EXAMPLE PROGRAMDATASEGMENTVARXDW123HVARYDW456HVARZDW789HF1DW?F2DW?DATAENDS设设置置数数据据段段可以预置任意内容5.6顺序程序设计-例5-2(3)STACK1SEGMENT PARA STACKDW20HDUP(0)STACK1ENDS

36、设设置置堆堆栈栈段段5.6顺序程序设计-例5-2(4)CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1BEGIN: MOVAX,DATA MOVDS,AX5.6顺序程序设计-例5-2(5)MOV AX,VARXADDAX,VARYMOV BX,10MUL BXMOV BX,VARZDECBXMOV CX,BXSALBX,1ADDBX,CXSUBAX,BX5.6顺序程序设计-例5-2(6)MOV BX,VARXADDBX,VARYADDBX,VARZXOR DX,DXDIVBXMOV F1,AXMOV F2,DXMOV AH,4CHINT21HCODEE

37、NDSENDBEGIN软中断软中断INT 21H程序设计中的流程图流程图中的几个框图符号组成:条件条件(a a)处理框)处理框 (b b)判别框)判别框 (c c)起止框)起止框 (d d)连接框()连接框(e e)流向框)流向框开开始始结结束束例:P73,图3-8(无符号整数一位乘算法流程框图)n n位被除数位被除数BBn n位乘数位乘数CC,0A0AC C0 0=1=1?结结束束开开始始A A,C C右移一位右移一位A+0AA+0AA+BAA+BAC C0 0=1=1?N NY YN NY Y 5.7 分支程序设计分支程序设计 5.7.1 转移指令转移指令q无条件转移指令q条件转移指令 5

38、.7.2 分支程序设计分支程序设计q直接用条件转移指令实现程序分支q用跳转表实现多路分支 5.7.1 转移指令转移指令一、无条件转移指令:一、无条件转移指令:格式: JMP 目标功能:使程序无条件地转移到“目标”处。目标地址的两种表达方式:1 . 直接寻址方式:2 . 间接寻址方式:1 . 直接寻址方式: JMP TARGET1 JMP TARGET2TARGET1TARGET1:RD1RD1 TARGET2TARGET2:RD2RD2(a)正向转移(b)负向转移图图5-45-4段内转移的直接寻址方段内转移的直接寻址方式式正、负向转移都是相对转移,即目标处指令地址与当前正、负向转移都是相对转移

39、,即目标处指令地址与当前JMPJMP指令相对偏移一个位移量。这位移量是以指令相对偏移一个位移量。这位移量是以JMPJMP指令的下一条指令与指令的下一条指令与目标处指令之间相距字节数来计算。若目标处指令地址高于目标处指令之间相距字节数来计算。若目标处指令地址高于JMPJMP指指令地址,称为正向转移,反之亦反。令地址,称为正向转移,反之亦反。CODE1 SEGENTTARGET1 LABEL FARTARGET:CODE1 ENDS CODE1 SEGENT JMP FAR PTR TARGET1CODE2 ENDS 图图5-55-5段间转移的直接寻址方段间转移的直接寻址方式式段间转移,执行段间转

40、移,执行JMPJMP指令时,就把目标处指令地址的段指令时,就把目标处指令地址的段基值和偏移量直接送入基值和偏移量直接送入CSCS和和IPIP即可。即可。在执行段内转移的在执行段内转移的JMP指令时,指令时,就把存放在通用寄存器或字单元中的偏移量送入IP中,CS不变,实现段的程序转移。q例:例:JMP CX JMP WORD PTRBX JMP BX在执行段间转移的在执行段间转移的JMP指令时,指令时,把存放在双字单元中前2个字节单元的偏移量送入IP,后2个字节单元的段基值送CS,实现间的程序转移。q例:例:JMP DWORD PTRBX2 . 间接寻址方式:JMPJMP指令的目标地址在一个指令

41、的目标地址在一个通用寄存器通用寄存器/ /存储单元内存储单元内(段内转移)或在存储器的(段内转移)或在存储器的双字单元内(段间转移)。双字单元内(段间转移)。二、条件转移指令:二、条件转移指令:Intel 8086/8088指令系统中条件转移指令共有18条。格式: J 目标目标 这18条指令都是以标志位寄存器中某一个或几个标志位作为判断条件。条件转移指令只能是段内转移,也是相对转移。条件转移指令的种类:(具体内容见教材(具体内容见教材P203页)页)简单条件转移指令简单条件转移指令无符号数条件转移指令无符号数条件转移指令带符号数条件转移指令带符号数条件转移指令 5.7.2 分支程序分支程序一、

42、直接用条件转移指令实现程序分支一、直接用条件转移指令实现程序分支q例5-4:编写一程序段,实现表达式运算。q例5-5:编制一程序,实现两存储区之间的数据传送。二、用跳表实现多路分支二、用跳表实现多路分支q构造跳转表可用分支程序段的入口地址组成,也可用若干无条件转移指令组成。q例5-6:由入口地址组成跳转表的多路分支程序设计。q例5-7:由转移指令组成跳转表的从路分支程序设计。分支程序的结构的两分支程序的结构的两种形式,见教材种形式,见教材P204P204,图,图5-65-6 5.8 循环程序设计循环程序设计 5.8.1 循环控制指令循环控制指令qLOOP指令、LOOPE/LOOPZ指令qLOO

43、PNE/LOOPNZ指令、JCXZ指令 5.8.2 循环程序的结构及循环控制方法循环程序的结构及循环控制方法q循环程序的结构q循环控制方法 5.8.3 单重循环程序设计单重循环程序设计 5.8.4 多重循环程序设计多重循环程序设计采用循环程序结构采用循环程序结构实现需要反复执行实现需要反复执行一段程序才能实现一段程序才能实现的功能。的功能。 5.8.1 循环控制指令循环控制指令q4条循环控制指令:q循环控制指令是程序转移类指令,也是相对转移。q相对位移量是8位二进制以补码形式表示的带符号整数,即循环控制指令的下一条指令与目标指令之间的字节距离为-128+127q4条循环控制指令都有隐含使用寄存

44、器CX。采用循环程序结构实采用循环程序结构实现需要反复执行一段现需要反复执行一段程序才能实现的功能。程序才能实现的功能。LOOP指令指令LOOPE/LOOPZ指令指令LOOPNE/LOOPNZ指令指令JCXZ指令指令1、LOOP指令格式: LOOP 目标功能:指令先进行循环次数计数 (即CX (CX)-1),然后判断循环是否结束。如(CX 0 ),则转移到目标处,继续循环,否则顺序执行下一条指令。例58:编制一程序,产生n个数的裴波纳契数列。(具体内容见教材P212页)例题:要求从ARY数组的10个无符号数中找出最大者送入MAX单元。如果用LOOP指令实现循环,则源程序为: DATA SEGM

45、ENT ARY DB 17,5,40,0,67,12,34,78,32,10 MAX DB ? DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK1START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET ARY;SI 指向数组指向数组ARY的第一个数的第一个数 MOV CX,9;循环的次数循环的次数 MOV AL,SI LOP: INC SI;SISI+1 CMP AL,SI ;比较比较AL-SI JAE B

46、IGER;AB成立,转入成立,转入BIGER MOV AL,SIBIGER: LOOP LOP;CX(CX)+1,判断循环是否结束,判断循环是否结束 MOV MAX,AL MOV AH,4CH INT 21HCODE ENDS END START 完成返回DOS系统2、LOOPE/LOOPZ指令格式: LOOPE 目标 或 LOOPZ 目标功能:指令先进行循环次数计数 (即CX (CX)-1),然后判断循环是否结束。如(CX 0 )且ZF=1,则转移到目标处,继续循环,否则(即(CX)=0或ZF=0)顺序执行下一条指令。例59:(具体内容见教材P214页)3、LOOPNE/LOOPNZ指令格式

47、: LOOPNE 目标 或 LOOPNZ 目标功能:指令先进行循环次数计数 (即CX (CX)-1),然后判断循环是否结束。如(CX 0 )且ZF=0,则转移到目标处,继续循环,否则(即(CX)=0或ZF=1)顺序执行下一条指令。例510:(具体内容见教材P215页)4、JCXZ指令格式: JCXZ 目标功能:指令先测试CX的内容,如(CX)=0,则转移到目标处,否则顺序执行下一条指令。 5.8.2 循环程序的结构循环程序的结构 及循环控制方法及循环控制方法一、循环程序的结构:一、循环程序的结构:q初始化部分q工作部分q修改部分q控制部分q结束处理部分二、循环控制方法二、循环控制方法q计数控制

48、循环q条件控制循环 5.8.3 单重循环程序设计单重循环程序设计单重循环程序的主要特点:循环体由顺序结构或分支结构的一段程序构成。例511/12:P219220页 5.8.4 多重循环程序设计多重循环程序设计多重循环程序就是循环套循环结构形式的程序例513/14:P222223页 5.9 子程序设计 5.9.1 调用与返回调用与返回q调用指令(段内直接、段内间接、段间直接)q返回指令(段内、段间、带弹出值的返回指令(段内、段间、带弹出值的返回指令RET n) 5.9.2 编制子程序的基本要求编制子程序的基本要求 5.9.3 子程序设计举例子程序设计举例 5.9.4 系统功能子程序的调用系统功能

49、子程序的调用qDOS功能子程序的调用qBIOS功能子程序的调用为缩短目标代码,节省为缩短目标代码,节省内存空间,把一指令序内存空间,把一指令序列构成一个相对独立的列构成一个相对独立的程序段,以过程的形式程序段,以过程的形式组成子程序。组成子程序。 5.9.1 调用与返回调用与返回一、调用指令:一、调用指令:q格式:CALL 过程名/子程序名q功能:过程名/子程序名就是子程序入口处的符号地址,执行CALL指令时,首先保留断点地址于堆栈中,然后程序转移到指定的子程序入口地址。1.段内直接调用2.段内间接调用3.段间直接调用4.段间间接调用二、返回指令:二、返回指令:段内返回段内返回段间返回段间返回

50、带弹出值的返回指令带弹出值的返回指令RET n执行返回指令执行返回指令RETRET后,便按返后,便按返回地址转移到调用程序。回地址转移到调用程序。 5.9.2 编制子程序的基本要求编制子程序的基本要求1. 具有一定的通用性2. 选择适当的参数传递方法3. 注意保存信息4. 正确使用堆栈5. 编写清晰的子程序文本 5.9.3 子程序设计举例子程序设计举例1. 用寄存器传递参数2. 用堆栈传递参数3. 用地址表传递参数 5.9.4 系统功能子程序的调用系统功能子程序的调用qDOS功能子程序的调用qBIOS功能子程序的调用 5.10 实用程序设计示例 5.10.1 数值运算程序设计示例数值运算程序设

51、计示例 5.10.2 串操作程序设计示例串操作程序设计示例 5.10.3 代码转换程序设计示例代码转换程序设计示例 5.11 汇编语言程序的开发本章小结汇编语言属于低层次的程序设计语言,低层次主要体现在同计算机内部结构联系紧密上。本章是介绍以Intel8086/8088系列CPU为背景的MASM宏汇编语言及其程序设计。学习了组织一个源程序所必需的各种伪指令,以及用这些伪指令构造逻辑段,定义过程(子程序),定义数据和符号,实现宏功能。在程序设计时,一是先分析好程序功能,二是拟定实现程序功能的步骤和方法(流程图),三是运用指令系统中相关指令,编制汇编源程序。作业一设VAR1,VAR2是变量名,指出下列语句语法是否有错,是什么错。MOV AX , VAR1+VAR2MOV BL , AL SHR3MOV BYTE PTRBX , 1000二下列指令执行后,(AL)?,如将SHR指令换成ROR或RCR,那么AL中的内容分别是多少。MOV AL , 0FHXOR AL , 0FFHMOV CL , 7SHR AL , CL三试用两条指令完成对寄存器AH和AL分别加1,且AL中加1形成的进位加在AH的最低位,AH中加1形成的进位加在AL的最低位。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号