程序有顺序、循环、分支、子程序四种结构形式。顺序结构是指完全按顺序逐条执行的指令序列,这在程序段中是大量存在的,但作为完整的程序则很少见,因此在本文不做讨论。
分支程序设计
计算机程序在执行过程中,可以改变程序的执行顺序,根据一定的条件进行转移,使程序完成更复杂的功能。汇编语言提供了无条件转移指令和条件转移指令。
- 分支程序根据条件是真或假决定执行不同的程序段
- 判断的条件是各种指令,如CMP、TEST等执行后寄存器中的状态位
- 通过转移指令可以实现分支控制
单分支结构
例:
START: MOV AX,DATA
MOV DS,AX
LEA SI,BUF
MOV AL,[SI]
CMP AL,[SI+1]
JNB NEXT ;如果X1不小于X2,则转到NEXT
MOV AL,[SI+1] ;如果X1小于X2,则将A2送给AL
NEXT: CMP AL,[SI+2]
JNB NEXT1
MOV AL,[SI+2]
NEXT1: MOV Y,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
跳跃表法
根据不同的条件跳转到多个分支之一执行,将各个分支的地址存放在连续的数据区,称为跳跃表。
循环程序的组成
例:将ARRAY数组中的50个数求和,并将和存入字变量S中。
MOV AX,0 ;累加求和寄存器清0
MOV BX,OFFSET ARRA Y ; 数组始址送BX中
MOV CX,50 ;循环控制计数初始化
AGAIN : ADD AX,[BX]
ADD BX,2 ;数组地址增2,BX指向下一个元素
DEC CX ;循环控制计数减1
JNZ AGAIN ;计数不为0时继续循环
MOV S,AX ;计数为0时循环结束,和存于S中
保证循环正常执行和结束的条件:
➊正确地初始化循环控制计数和初始条件
❷正确地检测循环条件
❸必须保证能达到循环结束条件(例如在循环体内有修改循环控制值的指令)
一个循环程序通常由四部分构成:
(1)初始化部分
建立循环初始值。如初始化地址指针,计数器,其他循环参数的起始值等。
(2)工作部分
它是循环程序的这主要部分,是为完成某种特定功能而设计的程序段。
(3)修改部分
为保证正确的循环而修改某些参数。如修改计数器的值、操作数地址等。
(4)控制部分
判断循环结束条件是否成立。
通常判断循环是否结束的办法有两种:
①用计数控制循环:循环是否已进行预定次数,它适用于已知循环次数的循环程序设计;
②用条件控制循环:循环终止条件是否已成立, .它适用于未知循环次数的循环程序设计。
循环指令
跳转指令
jmp
格式:Jump short 标号
jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP; jmp指令要给出两种信息:转移的地址,转移的距离(段间转移、段内短转移,段内近转移)
其他跳转指令:
LOOP 重复控制
格式: LOOP OPR
执行的操作: (CX) ←(CX)-1。 若CX≠0,跳转到标号OPR处循环执行;若CX=0,则退出循环,执行LOOP的下一条指令。
LOOPZ/LOOPE 条件重复控制
格式: LOOPZ/LOOPE OPR
执行的操作: (CX) = (CX)-1。 若CX≠0,并且ZF=1,则跳转到标号OPR处循环执行; 若CX=0,或者ZF=0,则执行下一条指令。
LOOPNE/L OOPNZ 条件重复控制
格式: LOOPNE/LOOPNZ shortlabel
操作:计数寄存器CX减1,如果零状态标志位ZF=0且CX≠0时,转向shortlabel指定循环入口执行,如果ZF=1或CX=0则执行后续指令。