汇编语言程序设计:循环与分支程序设计

发布时间:2024-01-11 10:01:30浏览次数:25
汇编语言程序设计辅导资料九主 题: 第五章 循环与分支程序设计(第 1-3 节)第五章第 1-3 节 概述 这周我们学习第五章中的第 1-3 节,循环与分支程序,循环与分支程序的一些经典的程序举例,通过仔细分析这些程序更好的理解和掌握循环程序及分支程序。循环和分支程序结构是汇编语言及其他一些高级语言常见的结构,因此我们要学习好这几种程序结构。第 1 节 汇编语言程序的四种结构1)汇编语言程序的四种结构:顺序结构、循环结构、分支结构、子程序结构,我们常见的为了实现一项一项的程序功能,常需要机器一条接一条的执行指令,这就是顺序结构;有时候我们需要反复执行同一个功能模块的程序段,这就是程序的循环结构 ;程序有时候需要根据不同的条件进入不同分支程序段,不同的分支程序完全不干扰,这就是分支结构的程序;子程序实际上就是 C 语言中的函数调用,为了便于对某些常见函数的功能调用,常将这些函数写入标准函数库,汇编语言称为子程序库,当使用他们时,可以像 C 语言函数调用一样的方式进行调用子程序程序结构。2)循环程序的结构形式:C 语言中我们常遇到 FOR 循环和 DO-WHILE 循环,在汇编中也有相类似的 DO WHILE 循环和 DO UNTIL 循环,这两种循环的区别就在于循环体是提前执行一次还是控制条件提前执行一次。虚幻程序一般由 3 部分结构组成: (1)设置循环的初始状态。如设置循环次数的计数值,以及为循环体正常工作而建立的初始状态等 (2)循环体。循环工作的主体,由循环的工作部分和修改部分组成。工作部分是为了完成程序功能而设计的主要程序段,循环的修改部分则是为了保证每一次重复循环时,参加执行的信息能有规律的变化而建立的程序段 (3)循环控制部分。这是循环程序设计的关键,每个循环程序必须选择循环控制条 件来控制循环的运行与结束。3)循环程序设计方法:根据课件和教材我们重点讲解几个典型而又简单的循环程序设计。一、第一个循环程序:试编制一个循环程序把 BX 寄存器内的二进制数用十六进制数的形式在屏幕上显示出来。 分析:我们知道一位十六进制需要 4 位二进制数进行表示,因此需要把 BX 寄存器中的二进制分为每 4 位为一组,转换为十六进制数然后在屏幕现实,为了把 BX 中数字全部转换完成显然要用到循环结构的程序设计。每次循环显示一个十六进制数位,并且循环次数是固定的,计数值为 4。 循环体部分要包括从二进制到所显示字符的 ASCⅡ 之间的转换,还必须包括每个转换后字符的显示,这样才能实现程序显示输出的功能。 循环程序具体控制部分,采用循环移位的方法,把所要显示的的 4 位二进制数移到最右面,从而便于对数码的加工处理。另外数码加工部分,由于 0-9 的 ASCⅡ 码为30H-39H, , 而 字 母 A-F 的 ASCⅡ 码 为 41H-46H, 我 们 知 道 39H 后 是3AH,3BH,3CH,3DH,3EH,3FH,40H,41H,因此当数码为 A-F 时候,除了要加 30H,还需要再加上 7H 才能正确显示 A-F 的 ASCⅡ 码。循环部分程序段如下: MOV CH,4 ;CX 高半字节作为循环计数器使用 ROTATE: MOV CL,4 ;CX 低半字节作为循环移位计数器使用、循环程序入口 ROL BX,CL ;循环左移指令 ROL,移动位数在 CL 中 MOV AL,BL ;结果存入 AL 寄存器中,便于后续加工 AND AL,0FH ;屏蔽 AL 寄存器高 4 位,只保留低 4 位 ADD AL,30H ;对结果加 30H 处理 CMP AL,3AH ;上述结果是否为 0 到 9 JL PRINTIT ;是,则根据条件跳转指令到标号 PRINTIT ADD AL,7H ;不是,上述结果再加 7HPRINTIT: MOV DL,AL ;将转换后的数码载入 DL 寄存器,因为显示输出必须将待显示数据放入 DL 中 MOV AH,2 ;指定功能号为 2 INT 21H ;DOS 功能调用 DEC CH ;至此我们已经处理好一次数据转换,相当于循环程序循环了一次,要对初始值 CH 进行修改,做减一处理 JNZ ROTATE ;条件跳转,继续循环小结:可见这一程序虽然比较简单,但是已经把循环程序 3 种结构全部包括进来,而且通过这一小程序能更加具体的把握循环程序设计中的技巧和注意事项。本程序关键的指令部分包括比较和条件跳转指令,循环位移指令,逻辑与运算指令等。 第 2 节 循环程序设计举例二二、第二个循环程序举例:从键盘接收十进制数并存入 BX 寄存器。 分析:本例子的条件(BX)决定了不可能从键盘输入任意数字,才能存入 BX 寄存器。从键盘读入的十进制数实际上是以 ASCⅡ 码形式存入键盘缓冲区的,比如我们输入一个十进制数 3,缓冲区中得到的数据是 31H,输入 4 得到的是 34H,等等情况,但是这些数据就是我们的待处理对象,我们采用减法指令,减去 30H,就得到相应的 3和 4。 另外我们从键盘输入的数字可能是大于 9 的数字,比如 24,215 等等,就必须使用循环程序,分别处理键盘缓冲区的数码,转换为十进制数,并把不同权重的数码按权相加,结果存储与 BX 寄存器中。示例程序段及释义如下: MOV BX,0 ;bx 清零 NEWCHAR: MOV AH,1 ;AH 功能号为 1 INT 21H ;DOS 功能调用 SUB AL,30H ;得到十进制数 JL EXIT ;输入数码小于 0,跳转 EXIT CMP AL,9 ;比较是否小于 9 JG EXIT ;大于 9,跳转 EXIT CBW ;字节到字符号扩展 XCHG AX,BX ;BX 和 AX 值交换,此时 AX 值为 0,BX 值为输入的 0 到 9 十进制数(第一次执行循环) MOV CX,10 ;CX 计数器值为 10 MUL CX ;乘积为 0,AX 为 0 XCHG AX,BX ;再次交换 AX、BX 的值,此时 BX 为 0,AX 为键盘输入的处理后的数码(第一次执行循环) ADD BX,AX ;将处理后的不同权重的数码相加,值存入 BX 寄存器中 JMP NEWCHAR ;检验键盘输入是否结束,未结束就继续执行循环程序 EXIT: MOV AX,4C00H ;DOS 功能调用,返回 DOS INT 21H 小结:本节循环程序比第一节中的循环程序稍微复杂一些,但是都是典型的循环程序,它的整个循环结构也很清晰。本程序使用的重要的指令有交换指令,条件跳转指令,比较指令等等。 第 3 节 循环程序设计举例三三、第三个循环程序举例:将正数 N 插入到一个已整续的字数组的正确位置,数组的首地址和末地址分别为 ARRY_HEAD 和 ARRY_END,其中所有数均为正数且已按递增的次序排列。 分析:由于数组的首末地址已知,因此数组的长度是确定的,要插入一个正确的数字 , 只需要找到正确的位置即可,这也是循环程序结束的条件,另外插入一个数字后,地址增量的各数字都要向前移动一个字。算法上,可以从数组的尾部向头部查找,可逐字取出数组中的一个数 K 与 N 作比较,K>N 时候,把 K 向前移动一个字,然后继续往后查找;如果 K≤N,则把 N 插在 K 之前就可以结束本次查找。根据上述分析得到的程序框图也画在上面了。 此外还需要注意数组边界问题,假如 N 小于数组中最小的数字,就会出现循环无法结束的情况,因此本程序利用所有数均为正数的条件,在 ARRAY_HEAD-2 单元中存放负 1,这样,即使 N 小于数组中所有数,但是必大于-1,这样就可以把 N 存放在数组的首地址存储单元中了。本例具体程序可以在课件和参考书中查找到。 本周要求掌握的内容如下:基本概念:汇编语言几种程序结构、循环结构的初始状态,循环体,循环控制部分、分子程序特点、子程序结构特点、几种典型的循环程序分析基本理论:理解汇编程序的几种结构及特点,并能正确的识别和编写相应结构的汇编程序,知道循环程序的 3 种结构的作用,会用条件转移指令和循环指令写出基本的循环控制部分,熟悉本周课程中的三个典型的循环程序实例习题:1、汇编程序有哪些基本程序结构: (循环,分支,顺序,子程序)2、循环程序由三部分组成,分别是: (A) 初始状态设置 (B)循环条件 (C)循环体 (D)循环控制部分 (ACD)3、假如从键盘输入一个数字 7,那么实际上存储到键盘缓冲区的数字是 37H (对,不考虑扫描码的情况)
文档格式: docx,价格: 5下载文档
返回顶部