汇编语言(微机)第三章下.ppt

上传人:牧羊曲112 文档编号:6586372 上传时间:2023-11-15 格式:PPT 页数:123 大小:1.14MB
返回 下载 相关 举报
汇编语言(微机)第三章下.ppt_第1页
第1页 / 共123页
汇编语言(微机)第三章下.ppt_第2页
第2页 / 共123页
汇编语言(微机)第三章下.ppt_第3页
第3页 / 共123页
汇编语言(微机)第三章下.ppt_第4页
第4页 / 共123页
汇编语言(微机)第三章下.ppt_第5页
第5页 / 共123页
点击查看更多>>
资源描述

《汇编语言(微机)第三章下.ppt》由会员分享,可在线阅读,更多相关《汇编语言(微机)第三章下.ppt(123页珍藏版)》请在三一办公上搜索。

1、1,主讲教师:范新民,第三章:8086汇编语言程序设计,2,8086汇编语言程序设计,3,8086汇编语言程序设计,3.2.1 汇编语言源程序的格式,一、基本概念,1、机器语言、汇编语言和高级语言,机器语言:用0、1代码表示的机器指令形式,是机器硬件 唯一能识别和执行的语言。例:机器指令0100 0000;表示(AX)1AX,汇编语言:用符号表示指令的操作码、操作数。又称符号 语言。例:INC AX;增1指令,4,汇编语言和机器语言都是面向机器的语言,即不同的机器有不同的指令系统。机器指令与机器代码是一一对应的。汇编语言机器语言均属于低级语言。,高级语言:接近人的自然语言和数学表达式。用高级语

2、言编写的程序是脱离机器的、面向过程或面向对象的语言。如:C语言,Java语言等。,汇编语言源程序的格式,5,2、汇编语言的特点代码长度短,执行速度最快可直接有效的控制机器的运行准确掌握机器运行时间可最有效的利用CPU、内存、I/O资源 直接控制机器运行的场合 汇编语言常用于:需要准确控制运行时间的场合 运行速度要求很高的场合,汇编语言源程序的格式,6,汇编语言源程序的格式,3、语句的类别与结构分段结构:最多可由4种段组成:代码段、数据段、堆栈段、附加段。语句类别:,(1)指令语句:由汇编程序汇编成相应的能被CPU直接识别并执行的目的码,或称机器代码。,(2)宏指令语句:允许用户为多次重复使用的

3、程序段命名的一个名字。即将一个程序段定义为一宏指令。,7,第三章:汇编语言程序设计,(3)伪指令语句:伪指令语句是一种指示性语句,这类语句向汇编程序提供汇编过程要求的一些辅助信息,如给变量分配内存单元地址、定义各种符号、实现分段等。,伪指令与指令性语句的区别:伪指令语句经汇编后不产生任何机器代码,而指令性语句经汇编后会产生相应的机器代码;伪指令语句所指示的操作是在程序汇编时就完成了的,而指令性语句的操作必须在程序运行时才能完成。,8,例3-1:对10个字节数据a1a10求和。DATASEGMENT AT 2000HARRAYDB a,a,a,aCOUNT EQU ARRAYSUMDW?DATA

4、ENDSSTACKSEGMENT PARA STACK STACKSTAKDB 10 DUP(?)TOPEQU LENGTH STAKSTACK ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK,汇编语言源程序的格式,9,START:MOV AX,DATA MOV DS,AX MOV AX,MOV DI,OFFSET SUM MOV BX,OFFSET ARRAY MOV CX,COUNTLOP:ADD AL,BX ADC AH,INC BX LOOP LOP MOV DI,AX MOV AH,4CH INT 21HCODE ENDS END STAR

5、T,汇编语言源程序的格式,10,二、指令性语句,标号:操作码 操作数;注释项,操作码:指明操作的性质,说明计算机要执行的具体操 作。用助记符表示。操作数:指明指令执行过程中所需的数据。可有0个、1个 或者多个表达式组成,并由它提供执行指定操作 所需要的操作数或地址。注释项:必须以分号开头,主要用来说明程序或重要语句 的功能。,汇编语言源程序的格式,11,标号:对应的标识符后面必须跟有冒号,标号在汇编以 后分配有地址。标号又称为符号地址,可作为转 移指令或子程序调用的目标地址。,汇编语言源程序的格式,12,汇编语言源程序的格式,三、指示性语句 指示性语句是主要由命令构成的语句,用来指示汇编程序进

6、行汇编操作。格式:,名字/变量 命令 参数;注释项,命令:指示汇编程序进行某种汇编操作参数:汇编操作有关的数据,13,汇编语言源程序的格式,3.2.2 常量、标识符和表达式,1、常量:数字常量可以是二进制数、八进制数、十进制数或十六进制数表示。字符常量是用单引号 括起来的ASCII字符其值是该字符的ASCII代码值。例:MOV AX,A;AX=41H 符号常量是用符号定义的常量。例:采用符号定义语句 PORTA EQU 80H MOV AL,PORTA 与指令 MOV AL,80H 等价,14,标识符可用作符号常量、名字、变量和标号等。组成标识符有如下规定:组成标识符的字符有:大写字母:AZ;

7、文小写字母:az;数字09;字符?、_、$;字符长度不超过3l个;首字符不能是数字;?不能单独作为一个标识符;不能把保留字用作标识符,保留字包括助记符、寄存 器名等。,2、标识符,汇编语言源程序的格式,15,3、表达式 由常数、变量、标号通过运算符或操作符连接而成的,可分为数值表达式和地址表达式。,汇编语言源程序的格式,数值表达式:由算术运算符、关系运算符和逻辑运算符连接常数组成的有意义的式子,它的运算结果是数值常数,只有大小,没有属性。地址表达式:由变量、标号、常数、寄存器(BP、BX、SI、DI)的内容和操作符组成的有意义的式子,它的运算结果不是一个普通的数值,总是和存储器地址相联系。如各

8、种存储器寻址方式的汇编表示都属于简单的地址表达式,16,表达式中的运算符:,17,汇编语言源程序的格式,3.2.3 指示性语句(5条),程序开始和结束语句段定义语句过程定义语句数据定义语句符号定义语句,18,(1)给程序模块命名 NAME 命令 格式:NAME 名字 名字是程序员按标识符规定所取的程序模块名。(2)标题命名语句 TITLE 命令 格式:TITLE 名字 名字作为每页标题打印出来,标题名字符不大于60个(3)程序结束 END命令 格式:END 标号 标号指示程序开始执行的起始地址的标号。,1、程序开始和结束语句,汇编语言源程序的格式,19,说明:如果程序中没有NAME 伪指令,可

9、使用TITLE伪指令。程序中既无NAME也无TITLE伪指令,汇编程序将用源程序名作为模块名。一般情况下使用TITLE伪指令,可在列表文件中能打印出来END伪指令中,如果程序中第一句指令性语句有标号,则END语句的标号应与其相同否则可无标号。,汇编语言源程序的格式,20,2、段定义伪指令 存储器的物理地址是由段地址和偏移地址组合而成的,而存储器又可以为多个段,汇编程序是按段来组织程序和使用存储器,在把源程序转换为目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起形成一个可执行程序。为此,需要用到段定义伪指令。,汇编语言

10、源程序的格式,21,(1)段定义伪指令 SEGMENT 格式:段名 SEGMENT 定位类型 组合类型类别 段名 ENDS,段名由程序员定义,汇编时由系统为该段分配一个段基值。参数用来设定该段在内存中的位置和在汇编、连接时,当该段与其它段组合在一起时该段同其它段的连接关系。,汇编语言源程序的格式,22,一般情况下,定位类型、组合类型和类别说明可以不用。,注意:SEGMENT和ENDS语句必须成对使用。,例:定义一数据段DATA DATA SEGMENT A DB 1234 B DW 12H DATA ENDS,汇编语言源程序的格式,23,(2)偏移地址定位语句 ORG,格式:ORG 数值表达式

11、功能:指定在它之后的程序段或数据块所存放的起始地 址的偏移量。,无ORG语句时,段偏移地址从0000H开始。,例.DATA SEGMENT ORG 100HX DB 12HY DW?Z DD 1122HDATA ENDS,$,$表示汇编地址计数器的当前值,汇编语言源程序的格式,24,(3)指定段址伪指令,格式:ASSUME 段寄存器:段名,段寄存器:段名,.功能:指明段和段寄存储器的对应关系,且段名必须是 由SEGMENT定义的段名。,说明:ASSUME伪指令只是指明段和段寄存器的对应关系,并没有把段地址装入段寄存器中。但是,代码段段寄存器CS的值是由系统负责设置的。ASSUME指令必须跟在S

12、EGMENT语句之后。,汇编语言源程序的格式,25,例:DATA SEGMENT X DB12H DATA ENDS STACK SEGMENT DW 100 DUP(?)STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX CODE ENDS,汇编语言源程序的格式,26,3.过程定义伪指令,格式为:过程名 PROC NEAR/FAR RET 过程名 ENDP功能:过程定义伪指令用于定义子程序。段内调用使用 NEAR属性,段间调用使用F

13、AR属性。省略为NEAR,汇编语言源程序的格式,27,CODE SEGMENTCOUNT PROC NEAR ADD CX,1 RETCOUNT ENDPSTART:MOV AX,100 CALL COUNT CALL COUNT HLTCODE ENDS END START,COUNT PROCE RET,子程序:,汇编语言源程序的格式,28,4.数据定义伪指令格式:变量名 数据定义伪指令 操作数项表功能:定义数据存储区,其类型由伪指令指定。,数据定义伪指令常用的有以下五种:变量名 DB 操作数项表;定义字节变量名 DW 操作数项表;定义字变量名 DD 操作数项表;定义双字变量名 DQ 操作

14、数项表;定义8个字节变量名 DT 操作数项表;定义10个字节,操作数项表可以是常数或表达式、字符串、?和带DUP的表达式。,汇编语言源程序的格式,29,给变量赋初值或指定变量类型 例:COUNT DB100 ARRAY DW-1,1024,汇编语言源程序的格式,30,定义一个ASC码的字符串,为字符串的每个字符分配一个存储单元,并从左到右将字符的ASC码按地址递增顺序存放在内存中。,例1:STR DB ABCD 例2:STR1 DW AB,汇编语言源程序的格式,31,用?号预留内存单元例:SUB1DB?;预留一个字节单元 RESUDW?;预留二个字节单元,汇编语言源程序的格式,32,用DUP重

15、复因子初始化一个数据区格式:N DUP(表达式),例1:DA1 DB 2 DUP(0)DA2 DB 2 DUP(AB)DA3 DW 2 DUP(1),例2:DUP的嵌套使用 DATA DB 10 DUP(10 DUP(0)定义了100个字节全部初始化为0。,重复次数 重复装入的内容,?、数值、数值表达式 字符等,汇编语言源程序的格式,33,汇编语言源程序的格式,5、符号定义语句,(1)EQU赋值伪指令格式:变量名 EQU 表达式功能:将右边表达式的值赋给左边的变量。表达式可以是 常数、变量、标号、指令助记符、数值表达式、地 址表达式。,例:PORT1 EQU 100;符号PORT1代表常数10

16、0 CONT EQU CX;为CX重新命名 ABDR EQU PORT1+1 ABC EQU DAA注:同一程序中,不能重复定义,34,(2)=等号伪指令格式:符号名=表达式功能:与EQU基本相同,两者的区别在于“=”伪指令可对 同一标识符作重新定义。,例:EMP=12;定义EMP等于12 EMP=EMP+1 可以对同一个符号名重复定义。,汇编语言源程序的格式,35,(3)PURGE命令 格式:PUREG 名字 功能:用来撤消已定义的符号常量。可同时撤消几个己 定义的名字 例3-10:COUNT EQU 20 MOV AL,COUNT PURGE COUNTCOUNT EQU 10MOV BL

17、,COUNT,汇编语言源程序的格式,36,(1)名字 名字包括文件名、标题名、段名、过程名和符号常量名等,是程序员在编程中按标识符规定命名的,目的是方便编程和读程。段命 在段定义语句中命名取定,定义后的段名可以作为段基值来使用,用来对段寄存器赋值。例:MOV AX,DATA MOV DS,AX,6、名字与变量,汇编语言源程序的格式,37,过程名在过程定义语句中定义,指向过程中第一条指令所在的内存单元的地址(入口地址),有NEAR和FAR之分。符号常量由符号定义语句EQU、=来定义,对符号常量给以赋值。例3-13,汇编语言源程序的格式,38,(2)变量 变量的定义和属性 变量由数据定义语句DB/

18、DW/DD/DQ/DT来定义变量有三属性:段属性、偏移属性和类型属性:段属性表示变量所在段的起始地址。偏移属性表示变量在段内的偏移地址。用16位无符号表示偏移地址。类型属性表示该变量能存放的数据长度。长度为1B的变量,类型为BYTE,长度为2B的变量,类型为WORD等。,汇编语言源程序的格式,39,分析运算符(5个)用于把变量的三个属性分别取出来作为操作数。,OFFSET取偏移地址操作符格式:OFFSET 变量或标号功能:返回该变量或标号在其段内的偏移地址。,例:MOV SI,OFFSET BUF 将BUF在数据段内的偏移地址作为立即数送到SI中。,汇编语言源程序的格式,40,SEG取段址操作

19、符。格式:SEG 变量或标号功能:返回变量或标号所在段的段基址。例:MOV AX,SEG BUF,汇编语言源程序的格式,41,TYPE取类型操作符格式:TYPE 变量或标号功能:当TYPE置于变量前面时,返回变量的类型数字。即DB为1,DW为2,DD为4,DT为10。当TYPE置于标号前面时,返回标号的类型属性值;当该标号为NEAR属性时,返回值为1,标号为FAR 属性时,返回值为2。,例:数据段中有如下定义:DATA DW 75H,134H。执行:ADD SI,TYPE DATA。该语句在汇编后相当于指令ADD SI,2。,汇编语言源程序的格式,42,取变量所含的数据存储单元个数操作符 LE

20、NGTH格式:LENGTH 变量功能:只对变量起作用,取值根据定义该变量时数据定义 伪指令后面第一个表达式的形式而定。如为重复子 句“n DUP(表达式)”,返回外层重复因子n,其他形式 的表达式,则返回1。,汇编语言源程序的格式,43,MOV AL,LENGTH A1 MOV CX,LENGTH A2 MOV BX,LENGTH A3 MOV DX,LENGTH A4,汇编后相当于指令:MOV AL,1MOV CX,10MOV BX,1MOV DX,5,例:DATA SEGMENTA1 DB ABCD,5 DUP(0)A2 DW 10 DUP(1),1234HA3 DW 10,20 DUP(

21、?)A4 DW 5 DUP(3 DUP(2),5)DATA ENDS,汇编语言源程序的格式,44,取变量所含的数据存储区大小操作符 SIZE格式:SIZE 变量功能:汇编程序用该操作符返回的值表示该变量所分配的 总字节数。例:A2 DW 10 DUP(1),1234H MOV CX,SIZE A2 汇编后相当于有指令:MOV CX,14H,汇编语言源程序的格式,SIZE=LENGTHTYPE,45,合成运算符,属性定义操作符 PTR格式:类型 PTR 地址表达式功能:PTR操作符的作用是将地址表达式的原类型属性临 时修改成PTR操作符前面所指定的类型。指定的类 型可以是BYTE、WORD或DW

22、ORD。,可用来指定内存操作数的类型 例:MOV BYTE PTR SI,20H;占一个字节 或 MOV WORD PTR SI,20H;占两个字节,汇编语言源程序的格式,46,用于临时改变变量或标号的类型属性 例如:BUFW DW 1234H,5678H MOV AX,BUFW MOV AL,BYTE PTR BUFW 可用EQU 和PTR定义一个新的变量 例如:BUFW DW 1234H,5678H BUFB EQU BYTE PTR BUFW 则 MOV AX,BUFW 和 MOV AL,BUFB 都是合法的。,汇编语言源程序的格式,47,格式:标号:操作码 操作数,操作数;注释 一、标

23、号 标号是一条指令在内存中的符号地址。标号一定要用:结束。标号具有三种属性:段属性:表示标号所在段的段基值 格式:SEG 标号,3.2.4 指令型语句,汇编语言源程序的格式,48,汇编语言源程序的格式,偏移量属性:表示标号所在位置的偏移地址 格式:OFFSET 标号 类型属性:表示标号所在指令是允许段内跳转还是 段间跳转 格式:TYPE 标号当标号的属性为NEAR属性时,TYPE=-1。当标号的属性为FAR属性时,TYPE=-2。,49,操作数可以用段名、符号常量、变量、属性表达式、过程名和标号等。例如:MOV AX,DATA;DATA是段名MOV CX,COUNT;COUNT 是符号常量MO

24、V BL,BUFFER;BUFFER 是变量MOV SI,OFFSET ARRAY;OFFSET ARRAY是属;性表达式CALL SBRT1;SBRT1 是过程名JMP DONE;DONE 是标号,2、操作数,汇编语言源程序的格式,50,宏定义:格式:宏指令名 MACRO 形式参数表 ENDM宏调用:格式:宏指令名 实际参数,,宏指令体,宏指令源程序中一个能多次可重复使用的具有独立功能 的代码段。,1、宏指令的定义和使用 宏指令的使用过程有宏定义、宏调用、宏展开。,3.2.5 宏指令,汇编语言源程序的格式,51,例:完成AX的内容乘以2X的宏定义及宏调用定义宏:MULX MACRO PX 形

25、式参数 宏指令名 MOV CL,PX SAL AX,CL ENDM,宏调用:MULX 2;MULX 4;MULX 5;,实际参数,AX(AX)*22,AX(AX)*24,AX(AX)*25,汇编语言源程序的格式,52,宏调用:MULT 120,BL,SAVE,宏展开:在汇编宏指令时,宏汇编程序将宏指令体插入到宏指令所在的位置,并用实际参数代替形式参数。,例:两数相乘,返回积。宏定义:MULT MACRO OPR1,OPR2,RESULT MOV AL,OPR1 IMUL OPR2 MOV RESULT,AX ENDM,MOV AL,120 IMUL BL MOV SAVE,AX,汇编语言源程序

26、的格式,53,2、宏指令与子程序(过程)的区别:宏指令调用无返回地址,执行速度略快。通过形参、实参结合传递函数宏指令不能压缩目标代码长度,占用内存较子程大。,汇编语言源程序的格式,54,3.3.1 概述 3.3.2 顺序程序 3.3.3 分支程序 3.3.4 循环程序 3.3.5 子程序 3.3.6 汇编语言程序举例 3.3.7 系统功能调用,3.3 汇编语言程序设计基础,55,3.3.7 常用的DOS与BIOS中断功能调用,1.DOS中断 DOS除了给用户提供了命令行服务以外,还为汇编语言程序员提供了大量的子程序,这些子程序包含了从基本输入输出到内存管理、磁盘读写、文件系统等各个方面,使用这

27、些子程序,使得汇编语言程序员不必搞清大量的设备接口、数据结构等细节,即可完成所需功能,简化了汇编语言的编程。由于DOS提供的这些子程序被看作是DOS系统功能的一部分,因而人们把对这些子程序的调用又称为DOS功能调用。,一、DOS中断与系统功能调用,56,DOS提供的这些子程序位于DOS的基本系统文件IBMBIO.COM和IBMDOS.COM中,随着DOS的加载而进入内存,即只要能启动DOS就可以使用。DOS的这些子程序是以中断的方式向系统及应用程序提供服务的,故必须采用软中断指令INT进行调用。,随着DOS的发展,所提供的功能(子程序)越来越多,不可能每一个子程序都占用一个中断号,于是采用让它

28、们共用一个中断号,即21H号的办法,进入这一个中断后,DOS再根据应用户程序中子程序编号的设置来确定用户程序到底想调用哪一个子功能。,常用的DOS与BIOS中断功能调用,57,2.DOS系统功能调用(1)DOS功能调用的方法设置入口参数,如果所调用的子程序不需参数,则可省略此步。欲调用的子程序编号AH。发中断调用指令INT 21H。,常用的DOS与BIOS中断功能调用,58,(2)DOS基本I/O功能调用 01功能键盘输入 入口参数:无 出口参数:所读取的字符ASCII码在AL内。,功能:扫描键盘,若有按键按下,将字符ASCII码放入AL 中,同时在屏幕上显示这个字符,然后返回。若 无键按下,

29、该调用等待直到有键按下为止。,例:MOV AH,01 INT 21H,常用的DOS与BIOS中断功能调用,59,08功能键盘输入。入口参数:无 出口参数:所读取的字符ASCII码在AL内。功能:同01号类似,但是不在屏幕上显示输入的字 符,在读取密码时常用本功能。,例:MOV AH,08 INT 21H,常用的DOS与BIOS中断功能调用,60,10号功能字符串输入入口参数:DS:DX指向输入缓冲区。输入缓冲区具有如下格式:第一个字节:指明准备接收的最大字符数,包括回车符。第二个字节保留,由DOS在功能调用结束后填入实际输入的字符个数(不包括最后的回车符)。用户输入的字符串从第三个单元开始存放

30、出口参数:用户实际输入字符个数在缓冲区第二个单元中,常用的DOS与BIOS中断功能调用,61,DATA SEGMENTBUF DB 8;指明最大字符数 DB?;保留,供DOS填入实际字符数 DB 8 DUP(?);用户输入的字符存放区DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF MOV AH,10 INT 21H;其他操作 MOV AH,4CH INT 21HCODE END,常用的DOS与BIOS中断功能调用,62,02H功能显示字符(一个字符)调用方法:DL

31、要显示的字符或其ASC代码 AH02H INT 21H 注:如果字符是控制符,则实际执行相应的功能。例:在屏幕上显示一个换行符(0AH)MOV DL,0AHMOV AH,02INT 21H;实际上将光标转到下一行上去。,常用的DOS与BIOS中断功能调用,63,09H功能字符串输出显示 调用方法:DX要显示的字符串首地址 AH09H(调用号)INT 21H注:预先将字符串存放于DX表示的首地址区域,字符串 必须以“$”作为结束符,常用的DOS与BIOS中断功能调用,64,4CH功能终止当前程序并返回操作系统。调用方法:MOV AH,4CH INT 21H,常用的DOS与BIOS中断功能调用,6

32、5,例:编一段程序先提示用户输入一个字符串,然后读取用户的输入,并将用户输入的数据在下行输出。程序如下:,DATA SEGMENTMESSAGE DB PLEASE INPUT A STRING:$;定义输入提示BUF DB 10,?,10 DUP(?)DATA ENDS,MOV DX,OFFSET MESSAGE MOV AH,9 INT 21H;显示输入提示信息,CODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX,DOS 功能调用举例,66,MOV DX,OFFSET BUFMOV AH,10INT 21H;接收用户

33、输入,MOV AH,4CHINT 21HCODE ENDSEND START,MOV DX,OFFSET BUF+2;用户实际输入字符起始处DXMOV AH,9INT 21H;显示用户输入的字符,MOV BL,BUF+1;用户实际输入字符数BLMOV BH,0;将BX高8位清0,使BX=用户实际输入字符数MOV BYTE PTR BUF+2BX,$;在用户输入的字符结束处放置一个“$”,MOV AH,2MOV DL,0AH;0AH为换行符ASCII码INT 21H;屏幕换行,DOS 功能调用举例,67,3.3.1 概述程序:是完成特定功能的一组指令的有序集合一、程序设计的步骤分析课题确定算法画

34、流程图编写程序上机调试、修改,二、程序的基本结构 顺序结构、分支结构、循环结构和子程序结构。,汇编语言程序设计基础,68,3.3.2 顺序程序设计 程序有3种基本结构,即顺序结构、分支结构和循环结构。任何复杂的程序都是由基本结构组成的。顺序程序是最简单程序设计。特点:这种程序不使用分支、循环结构,程序按顺序执行,只能完成相对简单的操作。硬件支持是IP自动加1,从内存取出一个指令字节,IP自动加1。,顺序程序设计,69,例3-17 查表求平方值,程序分析:(1)在内存中建平方表TABL;在XX单元放置015的数;在YY单元预留存储平方值的单元。(2)计算表启始地址的偏移量(3)计算所查数值在表中

35、的偏移地址,从该地址取出单元的内容送YY单元。,70,DATA SEGMENTTABL DB 0,1,4,9,16,25,36,49,64,81 DB 100,121,144,169,196,225XX DB X;X为015的正整数YY DB?DATA ENDSSTACK SEGMENT PARA STACKSTACK DB 50 DUP(?)STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,顺序程序设计举例,例3-17 查表求平方值,71,BEGIN:MOV AX,DATAMOV DS,AXMOV BX,OFFSET TABLMO

36、V AH,0MOV AL,XXADD BX,AXMOV AL,BXMOV YY,ALMOV AH,4CHINT 21HCODEENDSEND BEGIN,顺序程序设计举例,72,例31:从键盘输入两个一位数,在屏幕显示它们的积。程序分析:(1)从键盘上输入两个数,调用DOS 01功能。(2)把AL中的ASCII码转换为数值。(3)两数相乘,把积用ASCII码表示。(除10)(4)把积显示在屏幕上,调用02功能。,顺序程序设计举例,73,CODESEGMENTASSUME CS:CODEBEGIN:MOV AH,1INT21HMOVBL,ALINT21HSUBAL,30HSUBBL,30HMUL

37、BLMOV BL,10DIVBL,顺序程序设计举例,74,ADDAX,3030HMOVBX,AXMOVDL,BLMOV AH,02HINT 21HMOVDL,BHINT21HMOVAH,4CHINT 21HCODE ENDSEND BEGIN,顺序程序设计举例,75,例:字节存储单元DAT中有2位数据为65H,要求将该数据显示到屏幕上。,DATA SEGMENTDAT DB65HDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVDL,DAT MOVBL,DL;暂存至AL寄存器 MOVCL,4 SHR

38、DL,CL ADDDL,30H;高位十六进制数据6转换为ASCII码 MOVAH,02H INT21H;显示 MOVDL,BL ANDDL,0FH ORDL,30H;低位十六进制数据5转换为ASCII码 INT21H;显示 MOVAH,4CH INT21HCODEENDS ENDSTART,76,1.分支程序二要素(1)判断:运算结果的状态标志CF,PF,ZF,SF,OF;(2)转移:主要是条件转移指令Jcc 单标志位判断JC,JZ,JO,JP,JS,JAE等;多标志位判断JA,JG,JGE等。,3.3.3 分支结构程序,分支结构程序,77,分支结构程序,2.采用比较指令和转移指令实现分支 C

39、MP Dest,src;Dest-src Jcc 标号,78,例:在字节存储单元X、Y中各有一个无符号数。根据这两个无符号数的大小,在屏幕显示XY或XY。,分析:用CMP指令比较两个无符号数大小,根据其对标志位的影响用无符号条件转移指令实现转移。1、比大小:XAL,比较AL与Y的大小。2、调用02功能显示比较结果。,分支结构程序举例,79,DATASEGMENTXDB98HYDB0A0HDATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,XCMPY,AL;比较JAYGX;Y大于X则转YGEXMOVAL,J

40、MPDISP,分支结构程序举例,80,YGX:MOVAL,DISP:MOVDL,X;显示比较结果MOVAH,2 INT21HMOVDL,ALINT21HMOVDL,YINT21HMOVAH,4CHINT21HCODE ENDS ENDSTART,分支结构程序举例,81,例3-20:数据块传送程序,程序分析:(1)用字符串传送指令MOVSB实现数据块传送。目的串偏移地址送DI,源串偏移地址送SI。(2)如何判断源数据块与目的数据块是否有交叠:两数据块不交叠的条件是:源数据块末地址目的数据块首地址 不重叠DF置0,重叠从末地址开始传送DF置1,分支结构程序举例,82,DATASEGMENTSTRG

41、 DB 1000 DUP(?)STG1EQU STRG+7STG2EQU STRG+25STRSEEQU 50DATA ENDSSTACKSEGMENT PARA STACK STACKSTARNDB 100 DUP(?)STACKENDS,例3-20:数据块传送程序,分支结构程序举例,83,COSEGSEGMENTASSUME CS:COSEG,DS:DATA,ES:DATA,SS:STACK MOV AX,DATAMOV DS,AXMOV ES,AXMOV CX,STRSEMOV SI,OFFSET STG1MOV DI,OFFSET STG2CLDPUSH SIADD SI,STRSE

42、1,分支结构程序举例,84,CMP SI,DIPOP SIJB OKSTD;减量方式传送 ADD DI,STRSE 1;指向数据块底部ADD SI,STRSE 1OK:REP MOVSB;重复传送50个数据MOV AH,4CHINT 21H CODE ENDSEND BEGIN,分支结构程序举例,85,在内存中连续存放的一系列跳转地址、跳转指令或关键字组成一个决定程序分支的跳转表。主要问题是计算表地址表地址=表基地址+偏移量,3、利用跳转表实现分支,分支结构程序举例,86,例3-21:某工厂有8种产品的加工程序R0R7,分别放在以SBR0、SBR1SBR7为首地址的内存区域中,8个地址的偏移地

43、址放在以BASE为首地址的跳转表内。,跳转地址组成的跳转表:,分支结构程序举例,87,DATASEGMENTBASEDW SBR0,SBR1,SBR2,SBR3DW SBR4,SBR5,SBR6,SBR7BNDB X;X为07之间的正整数DATAENDSCOSEGSEGMENTASSUME CS:COSEG,DS:DATAMOV AX,DATAMOV DS,AXMOV AL,BN,分支结构程序举例,88,MOV AH,0ADD AL,ALMOV BX,OFFSET BASEADD BX,AXMOV AX,BXJMP AXMOV AL,4CHINT 21HCODEG ENDSEND BEGIN,

44、分支结构程序举例,89,3.3.4 循环结构程序,在进行程序设计时,会出现某段程序反复多次执行的情况,则可用循环程序结构来实现。采用循环程序结构不仅使程序变得简洁清晰,而且减少程序对内存的占用。,1、循环程序的结构 循环程序一般由4部分构成:,循环结构程序,90,(1)初始化部分 为循环程序作准备工作,如置循环次数、地址指针或关键字,寄存器置初值及标志位设置等。(2)循环工作部分 是循环结构的主体。,(3)参数调整部分 地址指针或循环次数的修改等,以便继续循环。,(4)循环控制部分 循环条件的检查,以判断是否继续循环。,循环结构程序,91,(a)先工作后判断循环条件,(b)先判断循环条件后工作

45、,循环结构程序,2、循环程序结构,92,DATA SEGMENTTABLE DW a1,a2,a3,a4,a5,a6,a7,a8,a9,a10 DW a11,a21,.a20.DW a91,a92,a100 YY DW?DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATAMOV AX,DATAMOV DS,AX,3、循环程序举例,i=1,2,100,例3-23 计算Y=,循环结构程序,93,MOV AX,0 MOV BX,OFFSET TABL MOV CX,100 LOP:ADD AX,BX INC BX INC BX DEC CX JNZ LOP MOV

46、 YY,AX MOV AH,4CH INT 21H CODEDEGMENTEND BEGIN,循环结构程序,94,例3-4 统计数组中负元素的个数分析:(1)在数据段中放入若干个带符号数,并计算个数。(2)设计一个计数器(2)从数据段中取数并判断是否负数,若是计数器加1。设计成循环程序。初始化:计数器清0,用OFFSET取偏移地址,置循 环次数。与0相比,用带符号跳转指令JGE判正负,满足条 件,计数器加1,修改参数。否则直接修改参数。,循环结构程序,95,数据块的定义如下:DATASEGMENTD1DB-1,-3,5,6,-9;定义数组COUNTEQU$-D1RSDW?;存放负数个数DATA

47、 ENDS,循环结构程序,96,代码段程序为:CODESEGMENTASSUME CS:CODE,DS:DATAMOV AX,DATAMOV DS,AXMOV BX,OFFSET D1;建立数据指针 MOV CX,COUNT;设置计数器初值MOV DX,0;设置结果初值,循环结构程序,97,LOP1:MOV AL,BXCMP AL,0JGE JUSINC DXJUS:INC BXDEC CXJNZ LOP1;或LOOP LOP1MOV RS,DXMOV AH,4CHINT 21HCODESEGMENTEND BEGIN,98,MOV CX,0LOP:AND AX,AX JZ STP SAL A

48、X,1 JNC LOP INC CX JMP LOPSTP:HLT这是一个”先判断后执行“的结构。,例3-25 统计寄存器AX中1的个数,循环结构程序,99,3.3.5 子程序定义及结构一、概述1、子程序结构(1)结构:子程序的第一条语句前有过程名入口地址的符 号表示出口是返回指令RET。(2)调用与返回:主程序用CALL指令调用子程序,子程序用 RET指令返回主程序(3)子程序文件:子程序说明与子程序清单。,子程序定义及结构,100,子程序说明:功能描述:包括子程序名称、功能以及性能指标(如执行时间)等;所用寄存器和存储单元;子程序的入口、出口参数;子程序中又调用的其它子程序;调用实例(可无

49、)。,子程序定义及结构,101,主程序与子程序的连接寄存器和工作单元中内容的保护,即保护现场,用PUSH指令和POP指令,可以安排在子程序中,也可以安排在主程序中。通常安排在子程序中。参数的传递,即主程序如何把入口参数带入子程序,子程序又如何把出口参数带回主程序。,子程序应用中应注意的问题:,子程序定义及结构,102,主程序名为MAIN,子程序名为SUM。采用堆栈传递参数,即主程序把参数压入栈,子程序出栈。(1)在存储器中开辟一个20个字的堆栈段,并计算栈顶偏移地址:STACK SEGMENT PARA STACK SPAE DW 20 DUP(?)TOP EQU LENGTH SPAE ST

50、ACK ENDS,例3-28 求数组之和,子程序定义及结构,103,DATASEGMENTARY1DB 100 DUP(?)SUM1DW?ARY2DB 150 DUP(?)SUM2DW?COUNT1EQU SUM1-ARY1 COUNT2EQUSUM2-ARY2DATAENDS,(2)在内存数据段中放置两个数组ARY1,ARY2,预留求和单元并计算数组的长度。,子程序定义及结构,104,定义代码段:MAIN SEGMENT ASSUME CS:MAIN,DS:DATA,SS:STACK MOV AX,DATA MOV DS,AX传递参数调用子程序:MOV AX,SIZE ARY1 PUSH A

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号