[计算机软件及应用]第六章 微型计算机的程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

开始
初始化 段地址DS:1000H 被加数指针SI←50H 加数指针 DI ← 52H 和的指针BX ← 54H 清除AX和CF 被加数→AX 被加数+加数→AX AX →(10054H)和(10055H)单元
表6-1 双字节相加时的内存分配
内存 地址 内容 内存 地址 内容
10050H 被加数低8位 10051H 被加数高8位 10052H 加数低8位
延时时间 1ms X 347次 一次循环时间 21.4 0.125 s
换成十六进制数为176H。
(3)编制的程序如下: START: MOV CX,176H ;初始化,设定循环次数CX=374 LP1: PUSHF POPF ;循环体
LOOP LP1
HLT
;CX←CX-1,若CX≠0转LP1
;DS=1000H ;被加数指针SI=50H ;加数指针DI=52H ;和的指针BX=54H ;清CF ;清AX ;取一个字到AX ;AX←AX+[DI]+CF ;存一个字到[BX] ;暂停
例2:将内存(10050H)单元的内容拆成两段,每
段4位,并将它们分别存入内存(10051H)和 (10052H)单元。即(10050H)单元中的低4位放 入(10051H)的低4位,(10050H)单元中的高4位 放入(10052H)的低4位,而(10051H)和 (10052H)的高4位均为零)。
在编写程序流程时,我们必定会用到棱 形判断框。在编好流程图写助记符程序时,建 议先按上下流程线写。写完上下流程线上的各 框环节后,再写分支部分里的框框。
【例 1】求 AX 累加器和 BX 寄存器中两个无符号 数之差的绝对值,结果放在内存(2800H)单 元中。 ( 1 )分析题目:此题目中, AX 累加器和 BX 寄 存器中的数是不知道的。对两个不知大小的 数相减并求绝对值,显然应该先解决哪一个 值稍大些,然后再用大数减小数的方法,才 可求得绝对值。
(2)程序流程图如图6-l0所示。
(3)编制的程序如下:
例2: 要求设计一个软件延时程序,延时时间 约1ms左右。
(1)分析题目:此题是想让计算机做一些 无用的操作,来拖延时间。我们可以从指令 手册中查得各条指令所需的时间节拍,但一 般指令执行时间只有几个时钟周期,亦即只 有几个微秒,为了能用较少的指令来编较长 时间的延时,我们可以利用循环程序结构。
10053H 加数高8位 10054H 和的低8位 10055H 和的高8位
暂停
图6-2 简单程序流程图
(双字节相加)
(5)编制的程序如下: MOV AX,1000H MOV DS,AX MOV SI,50H MOV DI,52H MOV BX,54H CLC X0R AX,AX MOV AX,[SI] ADC AX,[DI] MOV [BX],AX HLT
5、子 程 序
子程序相对主程序而言,是一个子的程 序段,确切地说,它是被父程序调用的程序。 子程序调用示意图如图6-13所示。 什么样的程序适合设计子程序呢?一般是 有公用性、重复性或相对独立性的程序应设计 子程序,这种结构给程序设计与调试带来许多 方便。
1、子程序调用与返回
子程序调用与返回由CALL和RET指令实现。 子程序调用方式有近程调用、远程调用、直接 调用和间接调用。 子程序调用实际是程序的转移,但它与转 移指令有所不同,调用指令CALL执行时要保护 返回地址,而转移指令不考虑返回问题。每个 子程序都有RET指令负责把压入栈区的返回地 址弹出送IP或CS:IP(段间返回),实现子程 序返回。
一个循环程序一般由四部分组成:初始化、循环 体、循环控制和循环结束处理,它的程序结构框图见 图6-8所示。其中各部分的内容如下:
(1)初始化:它完成建立循环次数计数器,设 定变量和存放数据的内存地址指针(常用间址 方式)的初值,装入暂存单元的初值等; (2)循环体:这是程序的处理部分; (3)循环控制:它包括修改变量、修改指针, 为下一次循环做准备,以及修改循环计数器 (计数器减1),判断循环次数到了没有。到了 则结束循环;不到,则继续循(即转移回去, 再执行一次循环体)。 (4)结束处理:它主要用来分析和存放程序的 结果。
(2)程序流程图如图6-11所示。
在这个框图中,初始化部分由于没有数据操 作问题,因此也就不用设置间接地址指针。另外, 延时的时间主要取决于循环体及循环次数。我们从 手册上可以查得PUSHF和POPF指令分别为 10和 8个时钟节拍,LOOP BX指令为 3.4个时钟节拍在 此循环体需要用10+8+3.4=21.4拍,而每个时钟 节拍是根据此系统的晶振频率而定的。假设此系统 用的是8Hz的晶振,则每个时钟节拍需要0.125微秒 因此我们可以根据下列公式算出循环次数:
三、分支程序
分支程序是利用条件转移指令,使程序执行到某一 指令后,根据条件(即上面运算的情况)是否满足, 来改变程序执行的次序,这类程序使计算机有了判断 作用。一般来说,它经常是先用比较指令或数据操作 及位检测指令等来改变标志寄存器各个标志位。然后 用条件转移指令进行分支。 分支程序执行完后可以立即结束,也可以转到公 共点结束,见图6-4所示。分支程序可以再分支,各分 支程序之间没有对应关系,分支程序只要求在转移指 令中给出目标地址,即可实现程序分支。
(2)根据指令系统中的比较指令,编出判断大小的 换件,即可解决问题。下图为该例题的程序流程图。
(3)根据流程图编制程序如下:
CLC CMP AX,BX JC AA SUB AX,BX MOV DI,2800H MOV [DI],AX HLT AA:SUB BX,AX MOV DI,2800H MOV [DI],BX HLT ;清除CF ;AX-BX,结果不返回 ;CF=1转AA去执行(即AX<BX时转移) ; AX ← AX-BX ;结果指针DI=2800H ;结果送到2800H和2801H单元, ;暂停 ;BX ← BX-AX
第六章
微机的程序设计
在了解和熟悉了8086/8088指令系统的 基础上,本章将介绍程序设计的一般过程, 以及几种典型的程序形成的编写方法。
一、程序设计步骤 程序是计算机命令(语句)的有序集 合,当用计算机求解某些问题时需要编制 程序。汇编语言程序设计步骤如下: (1)分析问题 (2)建立数学模型 (3)确定算法 (4)绘制程序流程图(见图6-1) (5)内存空间分配 (6)编制程序与静态检查 (7)程序调试
在编写这种两次判断的问题时,应注意其次序,否则, 有可能出现重复或矛盾。例如上面的问题,两次判断可以安排 成如图6-7所示的四种流程图形式。 图6-7(c)中的这种方法,即是我们已经在例2中采用的 方法。图(b)的这种方法是等效于图(c)的方法,因此也 是可用的。但对于图(a)的这种方法,由于已判断在LP0处 的AL已大于等于20,再判是否大于10,就多此一举了,因此 不可能出现LP2的流程,从而分不出中间值的情况。再看图 (d)的方法,在逻辑上就有矛盾,即然 AL不大于等于10, 处于LP1,也就不可能出现AL 20的可能,因此加判是否大 于20的环节是不合理的。 所以说,在应用判断环节时,要十分注意把握住这些逻 辑关系和标志位的意义。
对于上例,如果我们想再延长1000倍时间(即想 延时1s),我们可以采用双循环的方法来解决。如下图 所示程序流程图。
1000=3E8H
对应的程序如下: MOV BX, 3E8H LP2: LP1: MOV CX,176H PUSHF ;延时1ms程序段
POPF
LOOP LP1 DEC JNZ HLT BX LP2 ; BX←BX-1 ;ZF=0时,转至LP2,即BX≠0时转
START: IN AL,71 CLC CMP AL,10 JC LP1 CMP AL,20 JC LP2 MOV BL,0FFH LP3: MOV AL, BL OUT 73H,AL HLT LP1: MOV BL,00 JMP LP3 LP2: MOV BL,88H JMP LP3
;将71H端口的字节读入AL ;清除CF ;AL-10,结果不返回 ;小于10转LP1 ; AL-20,结果不返回 ; 10AL<20 转LP2 ;将0FFH送入BL寄存器 ;将0FFH输出到73H端口 ;暂停
解: (1)分析题目 (2)确定算法 (3)绘制流程图(见图6-3) (4)内存空间分配
开始
表6-2 拆字程序的内存分配
初始化 用间址方法取数→AL
内存地址
10050H
内容
7AH
用逻辑与指令将该数 “与”0FH取得低四位,存入 内存(10051H)单元
再取出原数→AL 逻辑右移得到高4位, 存入内存(10052H)单元
ቤተ መጻሕፍቲ ባይዱ
2.子程序设计与应用应注意的问题 (1)现场保护与恢复 调用子程序后,CPU处理权转到了子程序,在 转子前,CPU有关寄存器和内存有关单元是父程序 的工作现场,若这个现场信息还有用处,那么在调 用子程序前要设法保护这个现场。保护现场的方式 很多。多数情况是在调用子程序后由子程序前部操 作完成现场保护,再由于程序后部操作完成现场恢 复。现场信息可以压入栈区或传送到不被占用的存 储单元,也可以避开这些有用的寄存器或存储单元, 达到保护现场的目的。 恢复现场是保护现场的逆操作。当用栈区保 护现场时,还应注意恢复现场的顺序不能搞错,否 则不能正确地恢复父程序的现场。
循环程归分为单循环和多重循环,两重以上 循环程称为多重循环,如图6-9所示。
循环控制方式有多种,如计数控制、条件控 制、状态控制等。计数控制事先已知循环次数, 每次循环加或减计数,并进行判定总次数以达到 控制循环。条件控制事先不知循环次数,在执行 循环时判定某种条件真假来达到控制循环的目的。 状态控制可事先设定二进制位的状态,或由外界 干预、测试得到的开关状态,决定循环与否。 不管哪一种控制循环方式,最终都是要达到 控制循环的目的。若考虑不周,会造成死循环, 对这一点要注意。
(4)循环程序
循环程序是强制CPU重复执行某一指令系列(程 序段)的一种程序结构形式,凡是要重复执行的程序 段都可以按循环结构设计。循环结构程序简化了程序 清单书写形式,而且减少了占内存空间。值得注意的 是循环程序并不简化程序执行过程,相反,增加了一 些循环控制等环节,总的程序执行语句和时间会有所 增加。
二、简单程序 这种程序的形式最简单,计算机执行程 序的方式是“从头到尾”,逐条执行指令语句, 直到程序结束,这是程序的最基本形式。 例1:用数据运算指令,对两个16位数相加 运算。这两个数从地址10050H开始连续存放, 结果放在这两个数之后。 解:(1)分析题目 (2)确定算法 (3)绘制流程图(见图6-2) (4)内存空间分配(见表6-1)
10051H
10052H
0AH
07H
暂停 图6-3 拆字程序流程图
(5)编制的程序如下:
MOV AX, 1000H MOV DS, AX MOV SI, 50H MOV AL, [SI]
AND AL, 0FH
MOV [SI+1],AL MOV AL, [SI] MOV CL, 4 SHR AL, 4 MOV [SI+2], AL
例2:我们要编一个程序。从外设 71H号中一个数 M,判断其值是否在 10和 20之间,即10M<20。 如果M20,则送0FFH给外设73H; 如果M<10,则送00H给外设73H; 如果 10 M<20,则送88H给外设73H。 (1) 分析题目;根据题意,我们可以看出这是一个需 要两次判断M大小的问题。我们可以先判M是否大于 10,再判M是否大于20。 (2) 根据解决问题的思路,我们先画出程序流程图, 如下图所示。从图6中程序流程图来看,两个分支都 要“回归”原程序。 (3) 编制的程序如下:
【例1】求两个多字节数之和。这两个数在 10050H地址开始的内存单元中,连续存放, 低位在小地址一端,结果放在这两个数之 后。设这两个多字节数均为八个字节长。 (1)分析题目:这是一个重复累加内存单 元中数的问题,因此可以用循环程序形式 解决。因为 8086/8088指令系统可以16位 处理,所以,循环次数是四次。
相关文档
最新文档