当前位置:
文档之家› 微机原理第五章 程序设计-dsh
微机原理第五章 程序设计-dsh
INT
COSEG
21H
ENDS END START
第三节 分支程序
计算机可根据不同条件进行逻辑判断,从而选择不同 的程序流向。程序的流向是由 CS和 IP决定的,当程序 的转移仅在同一段内进行时,只需修改偏移地址 IP的 值;如果程序的转移是在不同的段之间进行,则段基 址 CS和偏移地址 IP均需要修改。 转移指令分为无条件转移指令和条件转移指令。 在进行分支程序设计时,首先要根据处理的问题用比 较、测试的方式,或者用算术运算、逻辑运算使标志 寄存器产生相应的标志位,根据转移条件选择转移指 令。
INC INC DEC JNZ
BX BX CX LOP ; ;控制部分
修改部分
MOV YY,AX MOV AH,4CH INT CODE ENDS 21H
END
START
一.循环的基本结构
1.先执行,后判断结构
流程图如右:
入口
初始化部分
循环体
修改部分
N
循环 结束? Y 出口
例2. 编程统计数据块中正数的个数,
Y
RS END (DX)
DATA
SEGMENT
D1
COUNT RS DATA CODE
DB,-1,-3,5,7,-9,·,-6 · ·
EQU DW ENDS SEGMENT ASSUME CS:CODE,DS:DATA $-D1 ?
START:
MOV
AX,DATA
MOV
MOV MOV MOV
DS,AX
JMP JUS2
BIGD: JG JUS1 ;x>0转移 ;x=0
MOV AL, 0
JMP
JUS1: JUS2:
JUS2
;x>0
MOV AL, 1 MOV YY, AL MOV AH, 4CH INT 21H
CODE
ENDS
END START
例2. 数据块搬移程序 程序要求把内存中一数据块(源数据块)传送到内存的另一 存储区(目标数据块)。为了程序的通用性,应考虑以下三种 情况: (1)两块分离 (2)两块重叠,源数据块首址<目标数据块首址 (3)两块重叠,源数据块首址>目标数据块首址 根据图示三种情况分析,可得出以下规律:
当源数据块首址>目标数据块首址:从数据块首地址开始传送。
当源数据块首址<目标数据块首址:从数据块末地址开始传送。
(1)两块分离
(2)两块重叠
(3)两块重叠
源数 据块
• • • • • •
源数 据块
目标 数据 块 目标数 据块 源数 据块
目标 数据 块
传送方向任意
源数据块首址<目标 数据块首址。传送从 数据块末地址开始
例4. 编程计算 C ai bi a1 b1 a2 b2 a3 b3 a4 b4
i 1 4
设aibi为 8位无符号数,运算结果不超过 16位二进制数。 解: BUFA中存放a1,a2,a3,a4, BUFB 中存放b1,b2,b3,b4,存 储单元 C中放结果。SI 放 BUFA偏移地址,DI 放 BUFB偏 移地址,CX 作计数器。 流程图及程序如下:
DW a11,a12,·a20 · ·
YY
DATA CODE
DW?
ENDS SEGMENT ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA MOV MOV DS,AX AX,0
MOV
MOV
BX,OFFSET TABL
CX,20 ;
初始化
LOP:
ADD
AX,[BX]
; 循环体
1.分析问题,建立数学模型
2.确定算法
3.编制程序流程图
4.编制程序
5.调试程序
一个源程序的基本格式如下: DATA SEGMENT
• • •
;存放数据项的数据段
DATA EXTRA
ENDS SEGEMNT
• • •
;存放数据项的附加段
EXTRA STACK1 STACK1 CODE
ENDS SGMEN PRA STACK •
DW
ENDS
?
SEGMENT PARA STACK ENDS SEGMENT
ASSUME CS:COSEG
ASSUME DS:DATA ASSUME SS:STACK1 START: MOV AX , DATA
MOV MOV ADD MOV
DS , AX DX,VARX DX,VARY CL , 3 ;DX ;DX X X+Y
(2)程序流程图和程序如下:
(X+Y)*8-X = 2
开始
预置段寄存器 DX X DX (DX)-X DX左移3次 (X+Y)*8
DX X+Y
DX右移得
((X+Y)*8-X)/2
RESULT DX 结束
DATA VARX VARY
SEGMENT DW 0006H DW 0007H
RESUL
DATA SACK1 SACK1 COSEG
COSEG
SEGMENT
ASSUME CS:COSEG, DS:DATA, SS:STACK1
START: MOV
AX, DATA
MOV
MOV MOV
DS, AX
AH, 0 AL, XX
MOV
ADD MOV MOV MOV
BX, OFFSET TABLE
BX, AX AL, [BX] YY, AL AH, 4CH
源数据块首址>目标 数据块首址。传送从 数据块首地址开始
程序流程图如下:
START
预置段R
SI 源数据块首址 DI 目标数据块首址 CX 传送字节数
N
SI SI+CX-1 DI DI+CX-1 (DI) (SI)
SI>DI?
Y
(DI) (SI)
SI SI-1 DI DI-1 CX CX-1
SI SI+1 DI DI+1 CX CX-1
BX,OFFSET D1 CX,COUNT DX,0
LOP1:
MOV CMP JLE INC
AL,[BX] AL,0 JUSTI DX BX CX LOP1
JUSTI:
INC DEC JNZ
MOV
MOV INT CODE ENDS END
RS,DX
AH,4CH 21H
START
2.先判断,后执行结构
INT CODE ENDS END START 21H
第二节 顺序结构程序
例1 编制程序,求下列公式中的Z值,并将结果存放 到RESULT单元中。
Z
设X,Y的值分别存放在VARX,VARY单元中, 运算结果不超过16位。 解:(1)存储单元 RESULT 用来存放结果,VARX 和 VARY 放 X、 Y的值。寄存器 DX 放中间运算结果,左移 1 位相当于乘 2,右 移 1 位相当于除 2,所以可以用左移 3 位得到乘以 8 的结果。
N
CX=0?
CX=0?
END
N
Y
Y
编程如下: DATA DA SEGMENT DB 200 DUP (‘1,2,3,4,5’)
DA1
DA2
EQU
EQU
DA+10H
DA+50H 50
COUNT EQU DATA STACK1 ENDS
SEGMENT PARA STACK
DW
STACK1 COSEG
20H
ENDS
DUP (0)
SEGMENT ASSUME CS:COSEG,DS:DATA
ASSUME
SS:STACK1
MOVE:
MOV AX,DATA
MOV DS,AX MOV CX,COUNT MOV SI,OFFSET DA1 MOV DI,OFFSET DA2 ;源串首偏址 SI ;目标串首偏址 DI
1 x>0 其中 x为8位有符号数 y= 0 x=0 -1 x<0 开始 解:设 x的值放在 XX单元中, y的值放在 YY单元中。寄存器
选用 AL存放中间结果。 预置段R AL X N AL>0 N AL -1 AL 0 Y AL 结束 Y AL>0 Y AL 1
例1. 符号函数
流程图及程序如下:
a
i 1
20
i
设 a1,a2,·a20是一组无符号十六位二进制数,并设其 · · 和不大于2个字节 。 解:定义数组名TABL存放 a1~a20;和存放于单元YY中。 中间结果存于寄存器AX中。BX寄存器为地址指针, CX寄存器作计数器。 程序如下
DATA
TABL
SEGMENT
DW a1,a2,·a10 · ·
DATA XX YY
SEGMENT DB DB x ?
DATA
CODE
ENDS
SEGMENT ASSUME CS:CODE, DS:DATA
START: MOV AX,DATA MOV DS, AX
MOV AL, XX
CMP JGE MOV AL, 0 BIGR AL,-1 ;x-0建标志位 ;x> 0转移 ;x<0
START
预置段R SI 0 DI 0 C 0 CX 4 AX 0 C=C+ai*bi
SI SI+1 DI DI+1
N CX-1=0? Y END
入口
流程图如右
初始化部分
循环 结束?
N 循环体
Y 出口
修改部分
例3. AX寄存器中有一个 16位的二 进制数,编程统计其中值为 1的位的 个数,并将结果存于CX中。