程序的基本结构分为顺序、分支、循环、子程序
一、顺序结构
顺序结构程序是最简单的也是最基本的一种程序结构形式。这种结构的程序有程序的开头顺序的执行直到程序结束为止,执行过程中没有任何分支。
例:用查表的方法将一位十六进制数转换为与它相应的ASCII码
DATA SEGMENT
TABLE DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 41H,42H,43H,44H,45H,46H
NUMBER DB 8
ASCII DB ? ;数据定义
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX ;数据加载
MOV BX, OFFSET TABLE
MOV AL, NUMBER
XLAT ;换码指令
MOV ASCII, AL
MOV AH, 4CH
INT 21H ;返回
CODE ENDS
END START
2、分支结构
可以事先把各种可能出现的情况和处理的方法写在程序里,然后由计算机自动做出判断,并跳转或调用相应的程序处理。
特点:其运行方向是向前的,再确定的条件下,只能执行多个分支中的一个分支。
分支结构的分类
(1)双分支结构
求a、b、c三个数中的最大值,并将其存入max单元。
Data segment
a dw 64
b dw 9
c dw 30
max dw ?
Data ends
Stack segment
db 100 dup(?)
Stack ends
Code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds,ax
mov ax,a
cmp ax,b
ja q1
mov ax,b
q1: cmp ax,c
jg q2
mov ax,c
q2: mov max,ax
mov ah,4ch
int 21h
code ends
end start
(2)多分支结构
是有若干个条件,每一个条件对应一个基本操作。分支程序就是判断产生的条件,哪个条件成立,就执行哪个条件对应操作的程序段。也就是说,从若干分支中选择一个分支执行。
三、循环结构
需要多次重复执行相同的或相似的功能
1、循环程序结构
(1)初始化部分:设置循环执行的初始化状态。
(2)循环体部分:需要多次重复执行的部分。
(3)循环控制部分:用于控制循环体的执行的次数。循环体每次执行后,应该修改循环条件,是循环能够在适当的时候终止执行。
2、循环控制方法
(1)计数控制法
对于已知的循环程序次数,一般采取计数控制法来控制循环。CX 寄存器作为循环计数器。
【例1】设有两个长度为8个字节的无符号数分别存放在以NUM1、NUM2为首地址的连续的内存单元中,将两个数相加,并将结果存入SUM内存单元中。
【分析】8个字节可以当成4个字来运算,用循环带进位加4次即可。
SHUJU SEGMENT
NUM1 DQ 1234506A812D778FH
NUM2 DQ 3E543289A566398CH
SUM DQ ?
SHUJU ENDS
DAIMA SEGMENT
ASSUME CS:DAIMA,DS:SHUJU
KAISHI: MOV AX,SHUJU
MOV DS,AX
LEA BX,NUM1
LEA SI,NUM2
LEA DI,SUM
MOV CX,4
CLC
JIXU: MOV AX,WORD PTR [BX]
ADC AX,WORD PTR [SI]
MOV WORD PTR [DI],AX
ADD BX,2
ADD SI,2
ADD DI,2
LOOP JIXU
MOV AH,4CH
INT 21H
DAIMA ENDS
END KAISHI
(2)条件控制法
循环次数未知,知道结束时的条件。
【例2】编写程序完成求1+2+3+……N的累加和,直到累加和超过1000为止。统计被累加的自然数的个数送CN单元,累加和送SUM。
【分析】用寄存器处理比较快速。因为结果要求送两种数,可分别用AX、BX操作。
DATA SEGMENT
SUM DW ?
CN DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX ;初始化
MOV AX,0 ;0送AX
MOV BX,0 ;0送BX
LP: INC BX ;BX加1
ADD AX,BX ;求累加和
CMP AX,1000 ;条件控制
JBE LP ;≤1000转
MOV SUM,AX
MOV CN,BX ;送结果
MOV AH,4CH
INT 21H ;返回DOS
CODE ENDS
END START
(3)混合控制法
嵌套多种控制循环。
四、子程序
主程序:往往要调用子程序或处理中断, 暂停主程序,执行子程序或中断服务程序。
子程序:子程序又称为过程。在一个实际程序中,有些操作要执行多次,把要重复执行(subroutine)操作编为子程序。也常把一些常用的操作标准化、通用化成子程序。
模块化程序设计方法按照各部分程序所实现的不同功能把程序划分成多个模块,各个模块在明确各自的功能和相互间的连接约定后,就可以分别编制和调试程序,最后再把他们连接起来,形成一个大程序。
子程序结构是模块化程序设计的基础
调用子程序时需保留内容:
① 调用子程序:
将CALL下条指令地址即IP值保留下来(8086中段寄存器CS和指令指针IP),才能保证子程序执行完后准确返回主程序继续执行。
② 执行子程序时:
通常用到内部寄存器,执行结果会影响标志位,必须在调用子程序之前将现场保护起来。
③ 子程序嵌套或子程序递归(自调自):
保留许多信息,而且保证正确返回(且后进先出)。后保留先取出原则(即LIFO-LAST In First out)。