第4章-汇编语言源程序举例-循环程序设计

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

汇编语言程序设计举例2
4.4.4 循环程序设计
循环程序结构由循环初始化、循环体和循环控制三部分组成。

循环程序结构有两种:先执行后判断和先判断后执行。

设置循环初值
设置循环初值
满足循环控制条件吗?
循环体
循环体
满足循环控制条件吗?




图4-10循环控制程序结构
循环控制应该使循环在有限的次数后结束。

在循环次数确定的情况下,可用循环次数作为控制条件,这时常用LOOP指令实现控制循环。

循环控制的方法有很多,如标记控制循环,开关量控制循环,逻辑尺控制循环等,在不同的场合使用不同的方法。

【例4-10】在数据段中从BUFF单元开始存放100个字节类型的无符号数,编写程序找出其中最大的数并存入MAX单元中。

DATA SEGMENT ‘DATA’
BUFF DB 100 DUP(?) ;定义100个数据
MAX DB ?
DATA ENDS
CODE SEGMENT ‘CODE’
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
MOV CX, 99 ;设置循环次数
LEA SI, BUFF ;数据首地址送SI
MOV AL, [SI] ;取第一个数
INC SI
CON: CMP AL, [SI] ;与第二个数比较大小
JNC NEXT ;若AL≥[SI],则跳转NEXT处
MOV AL, [SI] ;AL< [SI], 替换AL NEXT: INC SI ;修改地址指针
LOOP CON ;测试循环条件CX=0?
MOV MAX, AL
MOV AH, 4CH
INT 21H
CODE ENDS
END START
4.4.5 过程设计
如果在一个程序的多个地方或多个程序中都用到相同功能的程序段,这个程序段常常设计为过程。

过程又称为子程序或函数。

过程使程序结构模块化,程序更加清晰、易读易懂,而且节省存储空间。

过程的缺点是连接过程和从它返回时需要花费系统少量的时间。

CALL指令连接到过程,RET指令从过程返回。

例如,计算S=12+22+…+N2的子程序。

平方和子程序
;CX是入口参数,调用之前应该预置CX=N,并且1 ≦ N ≦ 50。

;DX为出口参数,N个数的平方和存在DX中。

GO PROC NEAR;近过程定义
MOV DX, 0
MOV BL, 1;BL表示自然数
MOV AL, BL
CC:MUL BL;AL*BL结果存在AX中
ADD DX, AX;当N≤50时,不会产生进位
INC BL
MOV AL, BL
LOOP CC;CX为计数器
RET;过程返回
GO ENDP;过程定义结束
调用平方和过程求20个数的平方和:DATA SEGMENT ‘DATA’
CON EQU 20
SUM DW ?
DATA ENDS
CODE SEGMENT ‘CODE’
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
MOV CX, CON;设置过程的入口参数CX
CALL GO;调用过程
MOV SUM, DX;保存出口参数
MOV AX, 4C00H
INT 21H
GO PROC NEAR;近过程定义
MOV DX, 0
MOV BL, 1;BL表示自然数
MOV AL, BL
CC:MUL BL;AL*BL结果存在AX中
ADD DX, AX;当N≤50时,不会产生进位
INC BL
MOV AL, BL
LOOP CC;CX为计数器
RET;过程返回
GO ENDP;过程定义结束
CODE ENDS
END START
过程有两种属性:NEAR、FAR
由整个软件使用的过程应该写为远过程FAR(global,全局),由指定任务使用的过程应该写为近过程NEAR(local,局部)。

近过程必须和调用程序在同一个段,远过程可以随意。

SUMS1PROC NEAR
ADD AX,BX
ADD AX,CX
ADD AX,DX
RET SUMS1ENDP SUMS2PROC FAR
ADD AX,BX
ADD AX,CX
ADD AX,DX
RET SUMS2
ENDP
1. 近过程调用和返回
执行CALL指令时,首先将下一条指令的偏移地址IP压入堆栈,然后将过程的首地址赋给IP,CPU 开始执行过程。

执行RET指令时(C3H),从堆栈中弹出返回地址装入IP,程序返回到CALL指令之后的那条指令。

2. 远过程调用和返回
执行CALL指令时,首先将下一条指令的CS:IP压入堆栈,然后将过程的首地址赋给CS:IP,CPU开始执行过程。

执行RET指令时(CBH),从堆栈中弹出返回地址装入CS:IP,程序返回到CALL指令之后的那条指令。

(3)保护与恢复现场
如果一个过程被多次调用,保护与恢复(主程序)现场就非常重要。

主程序每次调用过程时,主程序的现场不会相同,直接在主程序中保护现场就非常不易。

保护与恢复现场的工作只能在过程中进行。

过程中用到了什么就保护什么,即过程破坏了什么就保护什么。

原则上:寄存器、存储单元、状态标志等压入堆栈或存入特定空间中,然后过程才可以使用它们,使用完后再恢复它们原来的值,即恢复主程序现场。

保护和恢复现场常使用PUSH和POP指令。

例如平方和子程序应该进一步完善如下:
GO PROC NEAR
PUSH AX
PUSH BX
MOV DX, 0
MOV BL, 1
MOV AL, BL CC:MUL BL
ADD DX, AX
INC BL
MOV AL, BL
LOOP CC
POP BX
POP AX
RET
编制过程文件时,应该认真书写过程说明,方便并保证其他程序能够正确调用该过程。

过程说明通常以注释的形式出现。

例如
;过程名:GO
;过程功能:N个数的平方和
;入口参数:CX=N
;出口参数:DX为平方和结果
(5)过程嵌套与递归
过程可以调用其它过程,称为过程嵌套或子程序嵌套,嵌套的层次不限,但要注意堆栈空间是否够用。

过程也可以调用自己,称为递归调用。

子程序B B 返回
子程序A 主程序子程序
C
C 返回A 返回
中断服务程序设计
计算机系统的中断处理是通过执行中断服务程序完成的。

中断服务程序类似远过程,它们的区别只有一点,中断服务程序的返回指令使用IRET而不是RET。

例如,设计一个AX、BX、CX、DX累加的中断服务程序。

NUM-INTS PROC FAR
ADD AX,BX
ADD AX,CX
ADD AX,DX
IRET
NUM-INTS ENDP。

相关文档
最新文档