当前位置:
文档之家› [计算机软件及应用]第六章 微型计算机的程序设计
[计算机软件及应用]第六章 微型计算机的程序设计
HLT
h ;暂停
6
例2:将内存(10050H)单元的内容拆成两段,每
段4位,并将它们分别存入内存(10051H)和 (10052H)单元。即(10050H)单元中的低4位放 入(10051H)的低4位,(10050H)单元中的高4位 放入(10052H)的低4位,而(10051H)和 (10052H)的高4位均为零)。
h
15
h
16
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寄存器
h
13
(3)根据流程图编制程序如下:
CLC
;清除CF
CMP AX,BX ;AX-BX,结果不返回
JC AA
;CF=1转AA去执行(即AX<BX时转移)
SUB AX,BX ; AX ← AX-BX
MOV DI,2800H ;结果指针DI=2800H
MOV [DI],AX ;结果送到2800H和2801H单元,
10050H 被加数低8位 10053H 加数高8位
10051H 被加数高8位 10054H 和的低8位
10052H 加数低8位 10055H 和的高8位
被加数+加数→AX
AX →(10054H)和(10055H)单元
暂停
图6-2 简单程序流程图
h
5
(双字节相加)
(5)编制的程序如下:
MOV AX,1000H
MOV [SI+2], AL
h
9
三、分支程序
分支程序是利用条件转移指令,使程序执行到某一 指令后,根据条件(即上面运算的情况)是否满足, 来改变程序执行的次序,这类程序使计算机有了判断 作用。一般来说,它经常是先用比较指令或数据操作 及位检测指令等来改变标志寄存器各个标志位。然后 用条件转移指令进行分支。
【例1】求AX累加器和BX寄存器中两个无符号 数之差的绝对值,结果放在内存(2800H)单 元中。
(1)分析题目:此题目中,AX累加器和BX寄
存器中的数是不知道的。对两个不知大小的
数相减并求绝对值,显然应该先解决哪一个
值稍大些,然后再用大数减小数的方法,才
可求得绝对值。
h
12
(2)根据指令系统中的比较指令,编出判断大小的 换件,即可解决问题。下图为该例题的程序流程图。
内存地址 内容 10050H 7AH 10051H 0AH 10052H 07H
h
8
(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
(4)绘制程序流程图(见图6检查
(7)程序调试
h
2
h
3
二、简单程序 这种程序的形式最简单,计算机执行程
序的方式是“从头到尾”,逐条执行指令语句, 直到程序结束,这是程序的最基本形式。
例1:用数据运算指令,对两个16位数相加 运算。这两个数从地址10050H开始连续存放, 结果放在这两个数之后。
;将0FFH输出到73H端口 ;暂停
HLT
;暂停
AA:SUB BX,AX ;BX ← BX-AX
MOV DI,2800H
MOV [DI],BX
HLT
h
14
例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) 编制的程序如下:
分支程序执行完后可以立即结束,也可以转到公 共点结束,见图6-4所示。分支程序可以再分支,各分 支程序之间没有对应关系,分支程序只要求在转移指 令中给出目标地址,即可实现程序分支。
h
10
h
11
在编写程序流程时,我们必定会用到棱 形判断框。在编好流程图写助记符程序时,建 议先按上下流程线写。写完上下流程线上的各 框环节后,再写分支部分里的框框。
解:(1)分析题目
(2)确定算法
(3)绘制流程图(见图6-2)
(4)内存空间分配(见表6-1)
h
4
开始
初始化 段地址DS:1000H 被加数指针SI←50H 加数指针 DI ← 52H 和的指针BX ← 54H 清除AX和CF
被加数→AX
表6-1 双字节相加时的内存分配
内存 地址
内容
内存 地址
内容
MOV DS,AX
;DS=1000H
MOV SI,50H
;被加数指针SI=50H
MOV DI,52H
;加数指针DI=52H
MOV BX,54H
;和的指针BX=54H
CLC
;清CF
X0R AX,AX
;清AX
MOV AX,[SI] ;取一个字到AX
ADC AX,[DI] ;AX←AX+[DI]+CF
MOV [BX],AX ;存一个字到[BX]
第六章 微机的程序设计
在了解和熟悉了8086/8088指令系统的 基础上,本章将介绍程序设计的一般过程, 以及几种典型的程序形成的编写方法。
h
1
一、程序设计步骤 程序是计算机命令(语句)的有序集
合,当用计算机求解某些问题时需要编制 程序。汇编语言程序设计步骤如下:
(1)分析问题
(2)建立数学模型
(3)确定算法
解:
(1)分析题目
(2)确定算法
(3)绘制流程图(见图6-3)
(4)内存空间分配
h
7
开始
初始化
用间址方法取数→AL
用逻辑与指令将该数 “与”0FH取得低四位,存入 内存(10051H)单元
再取出原数→AL
逻辑右移得到高4位, 存入内存(10052H)单元
暂停 图6-3 拆字程序流程图
表6-2 拆字程序的内存分配