微型计算机的程序设计举例

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

循环程序(1)
** 强制CPU重复执行某一指令
系统(程序段)的一种程序结构 形式。
** 循环结构程序简化了程序清
单书写形式,而且减少了内存空 间;循环程序并不简化程序执行 过程,相反,执行语句和时间会 有所增加。
** 循环程序分为单循环和多重 循环。
初始化
循环次数计数器 内存地址指针
循环体
程序部分
分配 内存 空间
编程 静态 检查
程序 调试
简单程序(1)
例1:用数据运算指令,对两个16位数做加法运算。这两个数从地址10050H开始连续 存放,低位在小地址一端,结果放在这两个数之后。
开始 初始化 内存分配 被加数→AX (被加数+加数)→ AX AX →(10054)和(10055)单元
暂停
MOV MOV MOV MOV MOV MOV ADD MOV HLT
AX, 1000H DS, AX SI, 50H DI, 52H BX, 54H AX, [SI] AX, [DI] [BX], AX
被加数 加数 和
10050H 10051H 10052H 10053H 10054H 10055H
简单程序(2)
例2:将内存(10050H)单元的内容拆成两段,每段4位,并将它们分别存入(10051H) 和(10052H)单元。即(10050H)单元中的低4位放入(10051H)的低4位,(10050H) 单元中的高4位存入(10052H)的低4位,而(10051H)和(10052H)的高4位均为零。
1个时钟节拍=1/10M =0.1μs
循环次数=延时时间/一次循环时间=1000/(23×0.1)≈435=1B3H
开始
CX=1B3H(循环次数) LP1
PUSHF和POPF

CX=CX-1
CX=0?

暂停
MOV CX,1B3H LP1: PUSHF
POPF LOOP LP1 HLT
延时1秒的程序可以怎样设计??
上面的程序段
POP
SI
POP
CX
POP

POPF
RET
注意事项: 1)在保护现场和恢复现场的工作中,要将子 程序中使用的寄存器的内容压入堆栈; 2)压入和弹出堆栈要遵循“先入后出”的原 则; 3)入口信息:所需处理的数据在哪里?
SI:数据指针;CX:循环次数 4)出口信息:结果存放到哪里?
[2000H]内存单元 5)最后一条指令为RET。
开始
指针SI=2001H 循环计数器CL=[SI] 设初始最大值00→AL 修改指针SI←SI+1

AL ≤[SI]?

AL←[SI]
修改指针SI←SI+1
CX←CX-1

CX=0?

AL中已是最大值 送内存[2000H]单元
结束
子程序调用
MAX: PUSHF PUSH AX PUSH CX PUSH SI
微型计算机的程序设计举例微型计算机的程序设计举例微型计算机的程序设计举例微型计算机的程序设计举例程序设计步骤程序设计步骤分析问题建立数学模型确定算法绘制绘制流程分配内存内存空间编程静态检查程序调试简单程序简单程序1例例11
微型计算机的程序设计举例
程序设计步骤
分析 问题
建立 数学 模型
确定 算法
绘制 流程 图
** 子程序的说明包括:子程序名、
入口出口参数等。
** 子程序的嵌套和递归等调用技
巧。
子程序(2)
例1:找出一个数据块中的最大数。数据块的长度在 内存(2001H)单元,数据本身从(2002H)单元开 始存放。找出的最大数放到(2000H)单元。设这段 数据中的数都是无符号的8位数。
MOV SI,2001H
分支程序(4)
例2:从外设71H端号中取一个数M,判断其值是否在10和20之间。如果M≥20,则送0FFH 给外设73H端口;如果M<10,则送00H给外设73H;如果10≤M<20,则送88H给外设73H。
开始
输入71H号端口 的值→AL

AL值≥10?

AL值≥20?

LP1 令AL=00
LP2
** 被父程序调用的程序段,一般
具有公用性、重复性或相对独立性。
** 调用方式分近程调用、远程调
用、直接调用和间接调用。
** 子程序调用与返回由指令CALL
和RET实现,负责把返回地址CS:IP 压入、弹出堆栈,实现子程序返回。
** 主程序和子程序间信息或数据
的传递通过寄存器、内存单元的数据 区或堆栈区实现。
循环程序(6)
利用堆栈或寄存器等保存外层循环的计数器CX
MOV CX, 03E8H
LP2:PUSH CX
MOV CX,01B3H
LP1:PUSHF
外层循环
POPF
内层循环
LOOP LP1
POP CX
LOOP LP2
HLT
;外层循环次数 ;外层循环次数压入堆栈保存 ;内层循环次数
;恢复外层循环次数
子程序(1)
条件1 Y
N
Y
条件2
N
分支程序段2
分支程序段3
分支程序段1
** 建议先按上下流程写程序,再
写分支部分。
结束
结束
分支程序(2)
例1:求AX累加器和BX寄存器中两个无符号数之差的绝对值,结果放在内存DS段 2800H单元中。
开始
初始化,清除CF
AX-BX→ FR

CF=1?

分支程序
BX-AX → BX BX →(2800H)和(2801H)单元
MOV CL,[SI]
;以数据长度作为循环次数
INC SI
;指针指向第一数
MOV AL,00
;设置初始最大值00H
XOR LP: CLC
CH,CH
;将CX高8位置零 ;清标志位CF
CMP AL,[SI]
JC
BB
JMP AA
BB:MOV AL,[SI] AA:INC SI
LOOP LP
MOV [2000H],AL
循环控制
修改变量和指针 判断循环次数
结束处理
分析和存放 程序结果
循环程序(2)
例1:求两个8字节数之和。这两个数在10050H开始的内存单元中连续存放,低位在小地 址一端,结果存放在这两个数之后。
开始
初始化(地址,循环次数,CF)
取一个字→AX
AX=AX+[DI]+CF
保存AX→[BX]
SI=SI+2 DI=DI+2 BX=BX+2 CX=CX-1
AX-BX →AX AX →(2800H)和(2801H)单元
暂停
分支程序(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
CLC CMP AX, BX JNC AA XCHG AX,BX AA: SUB AX,BX MOV DI,2800H MOV [DI],AX HLT
MOV MOV MOV MOV AND
AX, 1000H DS, AX SI, 50H AL, [SI] AL, 0FH
① 10050H 10051H 10051H
② AL 0FH 0 0 0 0 1 1 1 1 ③ AL 0 0 0 0

MOV [SI+1], AL
MOV AL, [SI]

MOV SHR

令AL=88H
令AL=0FFH
LP3
输出AL值到
73H号端口
暂停
分支程序(5)
IN
AL,71H
CLC
CMP AL,10
JC LP1
CMP AL,20
JC LP2
MOV AL,0FFH
LP3: OUT 73H,AL
HLT
LP1: MOV AL,00H
JMP LP3
LP2: MOV AL,88H
JMP LP3
是 CX=0?
否 暂停
循环程序(3)
MOV AX,1000H MOV DS,AX MOV SI,50H MOV DI,58H MOV BX,60H MOV CX,4 CLC AA: MOV AX,[SI] ADC AX,[DI] MOV [BX],AX PUSHF ADD SI,2 ADD DI,2 ADD BX,2 POPF LOOP AA HLT
SI CF
DI

BX



10050H
10057H 10058H
1005FH 10060H
10067H
循环程序(4)
例2:设计一个延时程序,延时时间为1ms左右。
分析:通过计算机的无用操作来达到延时的目的。其中:
PUSHF指令: 10个时钟节拍; POPF指令:8个时钟节
LOOP 指令:5时钟节拍;
循环程序(5)
将上面1ms延时程序循环1000次(1000 =03E8H)
开始 BX=3E8H(循环值)
延时1ms程序

BX=BX-1
BX=0?

暂停
MOV BX,3E8H LP2: MOV CX,1B3H LP1: PUSHF
POPF LOOP LP1 DEC BX JNZ LP2 HLT
嵌套循环能否用两个LOOP指令完成?
CL, 4 AL, CL
AL
⑤ 0 0000
MOV [SI+2], AL
HLT
分支程序(1)
** 利用条件转移指令,在程序执
行到某一指令后根据条件改变程序 执行的顺序。
** 使计算机有了判断作用。
** 先用比较指令、数据操作指令
改变标志寄存器的标志位,再用条 件转移指令判断,给出目标地址, 进行分支。
相关文档
最新文档