版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第5章 汇编语言程序设计主要内容:汇编语言源程序的格式及上机过程汇编语句源程序的编写汇编语言程序的设计(一) 顺序与分支结构汇编语言程序的设计(二) 循环结构与子程序25.1汇编语言源程序的格式及上机过程本节学习要求 学会在DEBUG 调试环境下察看程序结果 学会简单汇编程序的编辑、运行过程 掌握常见的输入及显示方法 3计算机语言发展过程 机器语言汇编语言高级语言FORTRANBASICCOBOLPASCALC/C+/C#JAVA.2022年9月6日 4机器语言:依赖于机器的低级语言,书写格式为二进制代码。 优点:执行速度快,效率高。 缺点:表达的意义不直观,编写、阅读、调试较困难。 汇编语
2、言:一种符号语言,与机器语言一一对应;使用助记符 优点:用户理解容易 缺点:不能被机器直接识别高级语言:独立于机器的通用语言,接近人类的自然语言。 优点:易学易用,可移植性较好 缺点:目标代码冗长,占用内存多,执行效率不高 5汇编语言源程序的格式 例 编程实现多字节加法,如 S=3B74AC60F8H+20D59E36C1HF8H60HACH74H3BHC1H36H9EHD5H20H被加数、和加数DATA1DATA2 6CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX, DATA MOV DS, AX MOV CX, 5 MOV SI, 0 C
3、LC LOOPER:MOV AL, DATA2SI ADC DATA1SI,AL INC SI DEC CX JNZ LOOPER MOV AH, 4CH INT 21HCODE ENDS END STARTDATA SEGMENT DATA1 DB 0F8H, 60H, 0ACH, 74H, 3BH DATA2 DB 0C1H, 36H, 9EH, 0D5H, 20H DATA ENDS7 汇编语言源程序的组织结构 汇编语言源程序采用的是分段结构,即一个汇编语言源程序由若干段组成(一般由数据段和代码段组成),每一个段以SEGMENT语句开始,以ENDS语句结束,整个程序的结尾是END语句。
4、在代码段中下面的内容是不可缺少的:(1) 定义段(使用SEGMENT/ENDS语句定义)(2) 约定段寄存器和段的关系(即物理段和逻辑段的关系,使用一个或多个ASSUME语句实现)(3) 装填段寄存器(只装填数据型段寄存器)(4) 设置返回DOS的方法2022年9月6日 8例如:MYDARA SEGMENT; 定义数据段起始语句 ; 定义数据MYDATA ENDS; 定义数据段终止语句MYCODE SEGMENT; 定义代码段起始语句ASSUME CS:MYCODE,DS:MYDATA; 约定段寄存器和段的关系START: MOV AX,MYDATA; 装填相应的段寄存器MOV DS,AX ;
5、 完成所需功能的程序段MOV AH,4CH; 设置返回DOSINT 21HMYCODE ENDS; 定义代码段终止语句END START; 程序结束9 汇编语言语句的类型和格式 1. 语句分类 指令性语句:也称指令语句,指令系统的指令,汇编后产生目标代码。 指示性语句:也称伪指令语句,告诉汇编程序如何汇编,汇编后不产生目标代码。 宏指令语句:自定义语句,由指令语句和伪指令语句组成的指令集合,不展开时不产生目标代码。 2. 语句格式 汇编语言是由一条条的语句组成的,其每条语句的格式如下:10 名字语句前缀助记符操作数;注释 其中带方括号的部分表示任选项,既可以有,也可以没有。(1) 名字 “名字
6、”是语句的符号地址,对于指令语句,“名字”称为标号,其后必须加冒号“:”;对于伪指令语句“名字”可以是变量名、段名、过程名等,其后不能加冒号“:”。 “名字”一般都有三个属性:段属性、偏移属性和类型属性。 段属性:表示“名字”所在段的起始地址(即段地址)。11 偏移属性:表示“名字”所在段的起始地址到定义该“名字”的地址之间的字节数(即偏移量)。偏移量是一个16位无符号数。 类型属性:表示该名字的数据或地址的类型。 对于标号和过程名,类型属性有NEAR和FAR两种,表示只能在段内被引用还是可以在其它段被引用; 对于变量类型属性有BYTE(字节)、WORD(字)、 DWORD(双字)、 QWOR
7、D(四字)、TBYTE(十字节)等,表示数据区中存取操作对象的大小。 对于段名只有段属性,表示段的起始地址(段地址),而没有偏移属性和类型属性。12(2) 助记符 在指令语句中,表示该指令语句的操作码,在伪指令语句中称为定义符,它们指出其语句的功能。(3) 操作数操作数即为操作的对象。在指令语句中,可能有单操作数或双操作数,也可能无操作数或隐含操作数;而在伪指令中可能有更多个操作数。当操作数不止一个时,相互之间应该用逗号隔开。 可以作为操作数的有:常数、寄存器、标号、变量和表达式等。 131) 常量:是在指令中出现的哪些固定值,可以分为数值常数和字符串常数两类。2) 寄存器:80868088C
8、PU的寄存器可以作为指令的操作数。3) 变量:是存储器中某个数据区的名字,因此在指令中可以作为存储器操作数。4) 表达式:使用运算符把常数、寄存器、标号、变量等连接起来的运算式。 表达式分为数值表达式和地址表达式两种。 表达式中常用的运算符有以下几种:14 算术运算符:、和MOD(模除, 即两个整数相除后取余数)等。 逻辑运算符:AND、OR、XOR、NOT等。 关系运算符:EQ、NE、LT、GT、LE、GE等。 分析运算符:SEG、OFFSET、TYPE、SIZE、LENGTH等。 合成运算符:PTR、THIS、SHORT等。 其它运算符: :、LOW、HIGH等 (4) 注释 注释是对汇编
9、语句的功能或汇编程序的说明。15上机环境硬件系统软件应用软件 操作系统:DOS系统编辑器: 汇编程序:连接程序:用户开发的程序:等CPU、存储器(ROM、RAM)、I/O接口、输入、输出设备汇编语言源程序的上机过程16上机过程.EXE文件手写程序.ASM文件.OBJ文件编辑程序编辑汇编程序汇编连接程序连接EDITMASMLINK有语法错误无法正常连接有算法错误2022年9月6日 17 (1) 编辑程序 DOS 环境下用 EDIT 编辑器 WINDOWS 环境下用 记事本 (2)汇编源程序 宏汇编程序 MASM.EXE 或小汇编程序汇编程序主要有以下功能: 检查源程序中语法错误,给出错误提示信息
10、 产生目标文件(.OBJ)、列表文件(.LST)及交叉引用文件(.CRF) 展开宏指令18MASM宏汇编的提示信息及回答交叉参考文件用的文件名(缺省:无交叉参考文件)Cross :(交叉参考文件名)列表文件名(缺省:无列表文件)Source :(源列表文件名)目标文件名(缺省:源文件名.OBJ)Object :(目标文件名)欲汇编的.ASM源文件名(缺省:命令中的文件名)Source filename.ASM:(源文件名)回 答提 示 信 息19LINK的提示信息及回答用到的库文件名(缺省:无库文件)Libraries.LIB:(库文件名)建立连接映象文件名(缺省:无连接映象文件)List f
11、ile NUL.MAP:(连接映象文件名)欲连接的.OBJ文件名(缺省:命令中的文件名)Run file .EXE:(可执行文件名)回 答提 示 信 息 (3) 连接目标文件 通过 LINK.EXE 程序实现 将多模块连接,产生一个.EXE文件 连接库文件(.LIB)及产生连接映象文件(.MAP)20 (4) 运行程序 当我们建立了可执行文件后,就可以直接在DOS下执行该程序。 程序调试 DEBUG是一种面向汇编语言的动态调试工具,共有19条命令。DEBUG提供了可以跟踪、测试程序的环境和条件,使编辑者能够对.EXE和.COM文件的执行进行动态跟踪调试,能够较快地查找出文件的错误和检查程序的运
12、行结果。 还可以利用DEBUG直接编写一段小的汇编程序,并进行调试和运行。21 DEBUG 常用命令 A 起始地址 汇编并保存一段指令语句 U 起始地址 反汇编 T =起始地址 单步执行(执行一条语句) R 寄存器 显示或修改寄存器内容 D 存储单元逻辑地址 显示存储单元 (80个字节/次) N 文件名 定义文件 L 装入文件*DATA SEGMENT NUM DB 82H,68H,88H SUM DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV BX,OFFSET NUMMOV AL,
13、BXINC BXADD AL,BXINC BXADD AL,BXMOV SUM,ALMOV AH,4CHINT 21HCODE ENDS END START例:2022年9月6日 235.1.3 汇编语言和DOS操作系统的接口 1. 用户程序在存储器中的位置ROMRAMDOS磁 盘应用程序其他系统程序引导程序ROM BIOS系统检测程序内存FFFFFH00000H模块模块用户程序空间1KB 中断向量表24 2.用户程序的装入完成以下操作: 确定内存可用部分 以便存放要执行的 .exe 文件。 建立程序段前缀 PSP (Program Segment Prefix) 程序段前缀大小100H, 即
14、256个字节。 存放执行过程中的控制信息。 PSP最开始的两个字节 CD20, 是一条 INT 20H指令。 装入可执行程序.exeSPDS、ES代码段INT 20H数据段CS:IPSSPSP(256字节)用户程序 没有定义堆栈段的用户程序装入情况SPDS、ESINT 20H数据段代码段堆栈段CS:IPSS用户程序 定义了堆栈段的用户程序装入情况附加段PSP(256字节)25DSEG SEGMENT STRING1 DB 1,2,3,4,5DSEG ENDSESEG SEGMENT STRING2 DB ?ESEG ENDSSSEG SEGMENT STACK STACK DW 10 DUP(
15、?) TOP LABEL WORDSSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEG ASSUME ES:ESEG,SS:SSEG START: MOV AX,DSEG MOV DS,AX MOV AX,ESEG MOV ES,AX MOV AX,SSEG MOV SS,AX MOV SP,OFFSET TOP LEA SI,STRING1 LEA DI,STRING2 MOV CX,5 CLD REP MOVSB MOV AH,4CH INT 21HCSEG ENDSEND START26 3.返回DOS的方法 执行用户程序后,若要返回 DOS状态,即在
16、屏幕上出现 DOS提示符,等待输入新的命令,应在用户程序的最后安排完成此功能的程序段。 为了保证用户程序执行完后,能回到DOS,可使用如下两种方法: (1) 非标准方法:调用INT 21H的4CH功能,例如: MOV AH,4CH INT 21H27 (2) 标准方法:借用PSP首单元的INT 20H返回DOS。 这种方法较麻烦。由于执行INT 20H的前提是CS:IP必须指向PSP首单元,否则执行INT 20H反而会造成死机,因此在EXE文件汇编格式中,不能直接执行INT 20H。用下列方法可使在需返回DOS时,CS:IP指向PSP首单元。 把主程序定义成一个远过程。即:过程名 PROC F
17、AR RET过程名 ENDP 28 在给DS、ES赋初值之前,用下列三条指令,把PSP首单元的逻辑地址压入堆栈,即 PUSH DS ;PSP段地址压栈 MOV AX,0 ;或用XOR AX,AX指令 PUSH AX ;PSP段首单元的偏移地址 ;压栈(偏移地址为0000H) 采取了以上措施之后,程序在返回DOS的时候,执行一条RET指令即可返回DOS。因为这条RET指令是远过程中的RET指令,它将从栈顶弹出四个字节,即把PSP首单元的逻辑地址反弹到CS:IP之中,于是CPU就自动从PSP首单元取出INT 20H,执行它返回DOS。29例:DATA SEGMENT NUM DB 82H,68H,
18、88H SUM DB ?DATA ENDSCODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA START: PUSH DS XOR AX,AX PUSH AX MOV AX,DATAMOV DS,AXLEA BX, NUMMOV AL,BXINC BXADD AL,BXINC BXADD AL,BXMOV SUM,AL RET MAIN ENDPCODE ENDS END START305.2 伪指令语句宏汇编程序MASM提供了约几十种伪指令,其中有一些伪指令小汇编ASM不支持,例如宏处理伪指令等。1.数据定义伪指令 数据定义伪指令的一般格式为:
19、变量名 伪操作符 操作数,操作数 DB 定义变量的类型为BYTE,给变量分配字节或字节串操作数。 DW 定义变量的类型为WORD,给变量分配字操作数。31 DD 定义变量的类型为DWORD,给变量分配双字操作数。 除了常数、表达式和字符串外,问号“?”也可以作为数据定义伪指令的操作数,此时仅给变量保留相应的存储单元,而不赋与变量某个确定的初值。 当同样的操作数重复多次时,可用重复操作符“DUP”表示,其形式为: n DUP(初值,初值)32 例: 画图说明下列伪指令所定义的数据在内存中的存放形式。ARV1 DB 3+4,43H,-2ARV2 DW 474FH,1,?COUNT EQU 2ARV
20、3 DB 2 DUP(1,COUNT DUP(2)ARV4 DD ARV3ARV5 DB ABARV6 DW AB 解:假设此数据段的段地址为1234H,即 DS1234H,则有:1234H:0000H01H02H03H04H05H06H07H08H1234H:0009H0AH0BH0CH0DH0EH0FH10H11H12H13H14H15H1234H:0016H07H43HFEHARV14FH47H01H00HARV201H02H02H01H02H02HARV309H00H34H12HARV441H42HARV542H41HARV633 2. 符号定义伪指令 EQU(赋值伪指令)名字 EQU
21、 表达式注:不需对同一符号重复定义 (等号伪指令) 名字表达式注:对同一符号可重复定义,其它与EQU同 LABEL(类型定义伪指令) 名字 LABEL 类型 34 4.段定义伪指令 段定义伪指令的用途是在汇编语言源程序中定义逻辑段,常用的段定义伪指令有SEGMENTENDS和ASSUME等 SEGMENTENDS 伪指令 段名 SEGMENT 定位类型组合类型类名 段名 ENDS 定位类型。定位类型给出实际段起点的类型。它有PAGE(页类型)、PARA(节类型)、WORD(字类型)、BYTE(字节类型)四种类型。其中PARA为默认值。35 组合类型。组合类型在多模块程序设计中表示该段和其它同名
22、段间的组合连接方法。组合类型有PUBLIC、COMMON、AT、MEMORY、STACK等。 类别。类别是程序员任选的一个字符串,使用时必须用单引号括起来。其作用是在连接时决定各逻辑段的装入顺序。 ASSUME 伪指令 它是用来说明逻辑段和物理段关系的伪指令,即告诉汇编程序在指令执行期间内存的哪一段是数据段,哪一段是堆栈段,哪一段是代码段。 ASSUME 段寄存器名:段名,段寄存器名:段名,36 ORG 伪指令 伪指令ORG指出其后的程序段或数据块的起始地址的偏移量。其格式为: ORG 表达式 5.过程定义伪指令 过程名 PROC NEAR/FAR 过程名 ENDP375.3 宏指令及其使用
23、1.宏指令、宏定义和宏调用 宏指令是源程序中具有独立功能的一段程序代码。在汇编语言中,如果在源程序中需要多次使用同一个程序段,可以将这个程序段定义(宏定义)为一个宏指令,然后每次需要是,即可简单地用宏指令名来代替(称为宏调用),从而避免了重复书写,使源程序更加简洁、易读。 宏定义由MASM宏汇编程序提供的伪指令实现。38 1. 宏定义 宏指令名 MACRO 形式参数 ENDM 2. 宏调用 宏指令名 实际参数 这就是说,只要在源程序中写上已定义过的宏指令名就算是调用该宏指令了。 3. 宏展开宏体39 具有宏调用的源程序被汇编时,每个宏调用将被MASM进行宏展开。 宏展开实际上是用宏定义时设计的
24、宏体去代替相应的宏指令,并用实际参数一一取代形式参数。 由此可见,使用宏的过程共有三步:首先进行宏定义;然后可以进行宏调用;最后,汇编时由MASM进行宏展开。40 例 若源程序中多处需要将AL和CL寄存器中的两位压缩型的BCD数相加,并将和送回CL寄存器,则可象下述这样定义宏指令,然后在需要的地方进行调用。 DECADD MACRO ADD AL,CL DAA MOV CL,AL ENDM显而易见,这是一个无形式参数的宏定义。41 如果对分别存放在任意8位寄存器或存储单元中的两个压缩型的BCD数进行加法运算,则可将上例宏定义改写为 DECADD1 MACRO OPR1,OPR2 MOV AL,
25、OPR1 ADD AL,OPR2 DAA MOV OPR1,AL ENDM 这是一个带有两个形式参数的宏定义。宏指令为 DECADD1。 例如有以下宏调用:42 DECADD1 DL, BUFFER DECADD1 AREA1, AREA2则汇编时进行宏展开,得到以下指令: DECADD1 DL, BUFFER + MOV AL, DL + ADD AL, BUFFER + DAA + MOV DL, AL DECADD1 AREA1, AREA2 + MOV AL, AREA1 + ADD AL, AREA2 + DAA + MOV AREA1, AL 43 2.宏指令与子程序(过程) 在汇
26、编语言程序设计中,宏指令和子程序都给设计者提供了很大方便。他们都是可被程序多次调用的程序段,并且调用前必须由设计者根据需要按一定格式进行定义。然而,宏指令和子程序由于定义方法和其格式不同,因此,使用中有许多不同之处,主要是空间和时间的差异。 44 子程序由CALL指令调用,由RET指令返回,所以汇编后子程序的机器码只占有一个程序段,不管调用多少次均如此,较为节约内存。宏指令在每次宏调用处宏展开时,宏体都要占一个程序段,调用次数愈多,占用内存愈多。因此从内存空间开销来说,子程序优于宏指令。45 从程序的执行时间来分析,每调用一次子程序都要保护和恢复返回地址(断点)及寄存器内容(现场)等,要消耗较
27、多的时间。宏指令调用时不需要这个过程,执行时间较短。因此,从执行时间来分析,宏指令又优于子程序。 综上所述,当某一需多次访问的程序段较长,访问次数又不是太多时,选用子程序结构较好。当某一需多次访问的程序段较段,访问次数又很频繁时,选用宏指令结构显然要更好些。46 5.4 常用系统功能调用和BIOS中断调用 微型计算机系统为汇编用户提供了两个程序接口来使用计算机的硬件资源,一个是DOS功能调用,另一个是ROM中的BIOS(basic input/output system) 功能调用。DOS功能调用和BIOS功能调用都是由一系列的服务子程序构成的,但调用与返回不是使用子程序调用指令 CALL和返
28、回指令RET,而是通过软中断指令INT n 和中断返回指令IRET调用和返回的。 软中断(INT n指令)可分为三部分:47 ROM BIOS中断,占用类型号为10H1FH。 DOS中断,占用类型号为 20H3FH。目前使用的有20H27H和2FH,其余类型号保留。 自由中断,占用类型号为40HFFH,可供系统或应用程序设置开发的中断处理程序用。 1)DOS中断及功能调用 目前DOS常用的9类中断(20H27H和2FH)分为两种: DOS专用中断:INT 22H、INT 23H和INT 24H,用户不能使用。 DOS可调用中断:INT 20H、INT 27H(程序退出); INT 25H、IN
29、T 26H(磁盘RW中断);INT 2FH(假脱机打印文件);INT 21H(系统功能调用)。48 2)BIOS中断调用BIOS中断功能依功能分为两种,一种为系统服务程序,另一种为设备驱动程序。其中中断类型号为10H、16H和17H的是显示器、键盘和打印机的驱动子程序。 键盘输入子程序:INT 16H。 显示输出子程序:INT 10H。 打印输出子程序:INT 17H。493) DOS及BIOS功能调用方法对于所有的功能调用,使用时一般需要经过以下三个步骤: 子程序入口参数送相应寄存器。 子程序编号(功能号)送AH寄存器: MOV AH,功能号。 发中断请求: INT n(系统功能调用使用IN
30、T 21H指令)。50功能号功 能入口参数出口参数01H带回显的字符输入(单字符输入)(AL)输入字符02H字符显示(单字符输出)(DL)输出字符09H字符串显示 (字符串输出)(DS:DX)缓冲区首地址0AH字符串缓冲输入(字符串输入)(DS:DX)缓冲区首地址4)系统功能调用 系统功能调用是指INT 21H中断。它是可供系统程序和应用程序调用的一个极其重要的中断,内含近百个已经标准化了的系统调用子功能。它是构成操作系统内核的主要成分。 这里我们主要介绍他的几个成用的功能。如下表所示。51INT 21H 常用功能介绍 (1)键盘输入(1# 功能) 功能: 键盘输入一个字符,将其ASCII 码
31、存放于AL,并在屏幕上显示该字符 输入字符ASCII码AL MOV AH,01H INT 21H (2)字符显示(2# 功能) 功能:在屏幕上显示任意单个字符 待输出字符ASCII码DL MOV DL,A MOV AH,2 INT 21H2022年9月6日 52INT 21H 常用功能介绍 (3)字符串输(10#功能) 功能: 键盘输入一串字符存至存储区 存储区起始单元地址(段地址:偏移量)(DS:DX) 存储区特点: 首字节为存储区最大长度M(1255); 第二字节存放输入字符串的实际长度; 第三字节以后为用户输入内容(含结束标识回车的ASCII码0DH53例 从键盘输入一串字符,个数小于5
32、0 其程序设计方法是:DATA SEGMENT BUF DB 50 DB ? DB 50 DUP(?)DATA ENDSCODE SEGMENT MOV AX,DATA MOV DS,AX LEA DX, BUF MOV AH, 10 INT 21H CODE ENDS50BUF预留字节数实际字节数用户输入内容2022年9月6日 54INT 21H 常用功能介绍 (4)字符串显示(9 # 功能) 功能:屏幕上显示一串以$结尾的字符 待显示字符串首单元地址(DS:DX)DATA SEGMENT BUF DB HOW DO YOU DO?$DATA ENDS CODE SEGMENT MOV DX
33、,OFFSET BUF MOV AH,9 INT 21HCODE ENDSHOW DOBUF输出内容O YU DO?$555.5 汇编语言程序设计通常,编制一个汇编语言源程序应按如下步骤进行: 明确任务,确定算法。 绘制流程图。 根据流程图编写汇编语言程序。 上机调试程序。程序的基本结构有四种:顺序结构、分支结构、循环结构和子程序结构。56一、顺序程序设计顺序结构也称线性结构,其特点是其中的语句或结构被连续执行。顺序程序是最简单的,也是最基本的一种程序结构。这种结构的程序从开始到结尾一直是顺序执行的,中途没有任何分支。从这种结构的流程图来看,除了有一个起始框,一个终止框外,就是若干执行框,没有
34、判断框。S1S2S3开始结束57例1求两个数的平均值。这两个数分别存放在X单元和Y单元中,而平均值放在Z单元中。源程序编制如下:DATA SEGMENT X DB 5FH Y DB 57H ZDB ?DATA ENDSSTAC SEGMENT STACK STACK DW 20H DUP(?) TOP LABEL WORDSTAC ENDS58CODESEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACSTART: PUSH DS MOV AX, 0 PUSH AX MOV AX, DATA MOV DS, AX MOV AX, STAC MO
35、V SS, AX MOV SP, OFFSET TOP MOV AL, X ADD AL, Y MOV AH, 0 ADC AH, AH SHR AX, 1 MOV Z, AL RETMAIN ENDPCODEENDS END START59二、分支程序设计分支程序结构也称条件结构,通常是在两种或两个以上的不同的操作中选择其中的一个,如下图所示:分支是通过条件转移指令来实现的。分支结构有一个共同点:运行方向总是向前的。条件S1S2条件SS1S2Sn条件NNYY60例2 现有一符号函数:1 当X0时Y= 0 当X=0时 -1 当X0时假定X为-25,且存放在VARX单元中,函数值Y存放在VARY
36、单元,试编写程序根据X的值确定函数Y的值。根据题意画出流程图如下:61实现符号函数程序的流程图开始ALXAL0?Y-1结束AL0Y1Y0YYNN62DSEGSEGMENTVARXDB -25VARYDB ?DSEGENDSCSEGSEGMENTASSUME CS:CSEG,DS:DSEGSTART:MOV AX, DSEGMOV DS, AXMOV AL, VARXCMP AL, 0JGE NEXTMOV AL, 0FFHJMP HALTNEXT:JE ZAREMOV AL, 1JMP HALTZARE:MOV AL, 0HALT:MOV VARY, ALMOV AH, 4CHINT 21HC
37、ODEENDSEND START63三、循环程序设计循环程序结构就是重复执行某一段程序,直到某个条件出现为止。循环程序结构同分支程序结构有相似之处,都是根据条件来实现的,只不过循环是一种运动方向总是向后的分支程序结构。因此,循环可以用分支来实现。循环初始状态循环控制条件循环体YN循环初始状态循环体循环控制条件NY641.循环程序的组成一个循环程序通常由四部分构成: 初始化部分建立循环初始值。如初始化地址指针,计数器,其他循环参数的起始值等。 工作部分它是循环程序的这主要部分,是为完成某种特定功能而设计的程序段。 修改部分为保证正确的循环而修改某些参数。如修改计数器的值、操作数地址等。 控制部分
38、65判断循环结束条件是否成立。这是循环程序设计的关键。通常判断循环是否结束的办法有两种: 用计数控制循环:循环是否已进行预定次数,它适用于已知循环次数的循环程序设计; 用条件控制循环:循环终止条件是否已成立,它适用于未知循环次数的循环程序设计。2.循环控制方法 用计数控制循环66例 在xx单元开始的连续单元中存放有10个无符号字节数,从中找出中最大者送yy单元。根据题意,我们把第一个数先送入AL寄存器中,然后将AL中的数与后面的9个数逐个进行比较。如果AL中的数较小,则两数交换;如果AL中的数大,则不交换。在比较过程中,AL中始终保持较大的数,这样,比较9次后,则最大的数在AL中,最后把AL中
39、的数(最大者)存入yy单元。由此可画出程序的流程图:67从一批数中求最大者流程图 开始 ALxx,BXxx的有效地址,CX9 BXBX+1 AL BX? AL,BX中的数交换 CXCX-1 CX=0? yyAL 结束 YYNN68DATASEGMENTxx DB 49,38,65,12,97,13,55,27,28,85yy DB ?DATAENDSCODESEGMENTASSUME CS:CODE, DS:DATASTART: MOV AX, DATA MOV DS, AX LEABX, xx MOV AL, BX MOV CX, 9LOOP1: INC BX CMPAL, BX JAE N
40、EXT XCHG AL, BX NEXT: LOOP LOOP1 MOV yy, AL MOV AH, 4CH INT 21HCODEENDSEND START69(2)用条件控制循环有些情况无法确定循环次数,但是循环何时结束,可用某种条件来确定。这时,编制程序主要是寻找控制条件及对控制条件的检测。例 从自然数1开始累加,直到累加和大于1000为止,统计被累加的自然数的个数,并把统计的个数送入n单元,把累加和送入sum单元。根据题意,被累加的自然数的个数事先是未知的,也就是说,循环的次数是未知的,因此不能用计数器方法控制循环。但题目中给定一个重要条件,即累加和大于1000则停止累加,因此,可以
41、根据这一条件控制循环。我们用CX寄存器统计自然数的个数,用AX寄存器存放累加和,用BX寄存器存放每次取得的自然数。70 程序的流程图如下所示。 开始 初始化 AX0, CX0, BX0 BXBX+1 AXAX+BX, CXCX+1 AX1000? nCX, sumAX 结束 YN71 DATAS SEGMENT n DW ? sum DW ? DATAS ENDS STACK SEGMENT PARA STACK stack DW 100 DUP(?) STACK ENDS CODES SEGMENT MAIN PROC FAR ASSUME CX:CODES, DS:DATAS, SS:ST
42、ACK START:PUSH DS MOV AX, 0 PUSH AX MOV AX, DATASMOV DS, AX72MOV CX, 0 MOV AX, 0 MOV BX, 0 LOOPT:INC BX ADD AX, BX INC CX CMP AX, 1000 JBE LOOPT MOV n, CX MOV sum, AX RET MAIN ENDP CODES ENDS END START733.多重循环程序设计 多重循环又称循环嵌套,即循环套循环。有些问题比较复杂,单重循环难以解决,必须使用多重循环。在使用多重循环时,必须注意以下几点: 内循环必须完整地包含在外循环内,内外循环不能
43、相互交叉。 内循环既可以嵌套在外循环中,也可以几个内循环并列存在。可以从内循环中直接跳到外循环,但不能从外循环直接跳进内循环中。 防止出现“死循环”。无论是外循环,还是内循环,千万不要使循环返回到初始部分, 这一点应当特别注意。 74 每次通过外循环再次进入内循环时,初始条件必须重新设置。例6利用逐次求大数的方法对内存单元ARRAY开始的一字节为单位的无符号数进行从大到小排序。根据题意,排序方法为:编制程序如下:4938651297135527788549496565979738384949656578788585786555493827131212ARRAYALBXSISISISISISIS
44、ISISIBXSISISISISISISISI75 DATA SEGMENT ARRAY DB 49,38,65,12,97,13,55,27,28,85 DATAENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV DX, 9 LEA BX, ARRAY LOOP0: MOV AL, BX MOV SI, BX+1 MOV CX, DX LOOP1: CMP AL, SI JAE NEXT XCHG AL, SI NEXT: INC SI LOOP LOOP1 MOV BX, AL INC B
45、X DEC DX JNZ LOOP0 MOV AH, 4CH INT 21H CODE ENDS END START76四、子程序设计子程序又称为过程,它相当于高级语言的过程或函数,是一个独立的程序段,能完成某些确定的功能,并能别其它程序调用。当一个子程序不被调用,且该子程序完成确定的功能后,便返回调用程序处。1.过程的定义和调用过程的定义采用过程定义伪指令,其格式为:过程名 PROC 类型RET 过程名ENDP77过程的调用采用指令语句CALL,其格式为:CALL 过程名 段内调用CSEG SEGMENTCALL SUBTMOV AH,4CHINT 21H SUBT PROC NEARRET
46、 SUBT ENDPCSEG ENDS78 段间调用XSEG SEGMENT YSEG SEGMENTCALL SUBT1 CALL SUBT1MOV AH,4CH YSEG ENDSINT 21H SUBT1 PROC FARRET SUBT1 ENDPXSEG ENDS79 2.寄存器内容的保护和恢复 通常主程序和过程的设计是分开的,因而他们所使用的寄存器往往会发生冲突。为避免冲突,应在进入过程时,将该过程所用到的寄存器内容保护起来,称为保护现场。而从过程返回主程序前,再将这些寄存器的内容恢复,称为恢复现场。保护现场和恢复现场通常分别用堆栈压入指令和弹出指令来实现。例如:80SUBPR PROC FARPUSH AXPUSH BXPUSH CXPUSH DXPOP DXPOP CXPOP BXPOP AXRETSUBPR E
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 单位房产买卖合同格式
- 时尚石英表购销合同
- 门窗施工分包合同
- 借款诀窍合同(2024年版)
- 2024房屋抵押合同范本
- 作品再版权转让合同(2024年版)
- 专职技术员工劳务派遣合同(2024年版)
- 2024资产担保合同范本
- 反担保合同范文
- 文言文学习之我见
- 《华为集团介绍》课件
- 消防应急演练培训课件
- 微生物发酵过程优化方案
- 奥林匹克标准体育馆设施配置
- 节日景观布置投标方案(技术方案)
- 小学生主题班会:自立自强勇攀高峰模板
- 资方和项目方的合作协议范本
- 习作单元解读及其教学策略
- 八年级地理上册第一、二章测试题及(答案)
- 【语文】黄冈市四年级上册期末复习试卷(含答案)
- 期中测试卷(试题)北师大版三年级上册数学
评论
0/150
提交评论