发布时间 : 星期二 文章微机原理实验之子程序设计更新完毕开始阅读84a4e1b169dc5022aaea005a
子程序设计实验
一、实验目的
1.学习子程序的定义和调试方法。
2.掌握子程序、子程序的嵌套、递归子程序的结构; 3.掌握子程序的程序设计及调试方法。
二、实验设备
PC 机一台,TD-PITE 实验装置一套。
三、实验内容及步骤
1.求无符号字节序列中的最大值和最小值
设有一字节序列,其存储首地址为3000H,字节数为08H。利用子程序的方法编程求出该序列中的最大值和最小值。程序流程图如图4-1所示。
图4-1 程序流程图
实验程序
SSTACK SEGMENT STACK DW 64 DUP(?) SSTACK ENDS
CODE SEGMENT ASSUME CS:CODE
START: MOV AX, 0000H MOV DS, AX MOV SI, 3000H MOV CX, 0008H CALL BRANCH HERE: JMP HERE BRANCH PROC NEAR JCXZ A4 PUSH SI PUSH CX PUSH BX MOV BH, [SI] MOV BL, BH CLD A1: LODSB CMP AL, BH JBE A2 MOV BH, AL JMP A3 A2: CMP AL, BL JAE A3 MOV BL, AL A3: LOOP A1 MOV AX, BX POP BX POP CX POP SI A4: RET BRANCH ENDP CODE ENDS END START
; 数据区首址
; 调用子程序
实验步骤:
(1)根据程序流程图编写实验程序; (2)经编译、链接无误后装入系统;
(3)键入E3000命令,输入8个字节的数据,如:D9 07 8B C5 EB 04 9D F9; (4)运行实验程序;
(5)点击停止按钮,停止程序运行,观察寄存器窗口中AX的值,AX应为F9 04,其中AH中为最大值,AL中为最小值;
(6)反复测试几组数据,检验程序的正确性。
程序说明:该程序使用BH和BL暂存现行的最大值和最小值,开始时初始化成首字节的内容,然后进入循环操作,从字节序列中逐个取出一个字节的内容与BH和BL相比较,若取出的字节内容比BH的内容大或比BL的内容小,则修改之。当循环操作结束时,将BH送AH,将BL送AL,作为返回值,同时恢复BX原先的内容。
2. 求N!
利用子程序的嵌套和子程序的递归调用,实现N!的运算。根据阶乘运算法则,可以得: N!=N(N-1)!=N(N-1)(N-2)!=…… 0!=1 由此可知,欲求N的阶乘,可以用一递归子程序来实现,每次递归调用时应将调用参数减1,即求(N-1)的阶乘,并且当调用参数为0时应停止递归调用,且有0!=1,最后将每次调用的参数相乘得到最后结果。因每次递归调用时参数都送入堆栈,当N为0而程序开始返回时,应按嵌套的方式逐层取出相应的调用参数。
定义两个变量N及RESULT,RESULT中存放N!的计算结果,N在00H~08H之间取值。
实验程序
SSTACK SEGMENT STACK DW 64 DUP(?) SSTACK ENDS
PUBLIC N, RESULT ;设置全局变量 DATA SEGMENT N DB ? ;N的范围在1~8之间 RESULT DW ? ;N!的结果存于该变量中 DATA ENDS
CODE SEGMENT ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA MOV DS, AX MOV AX, OFFSET RESULT PUSH AX MOV AL, N MOV AH, 00H PUSH AX MOV DI, 0000H CALL branch JMP START ;在此处设置断点,观察变量 branch: PUSH BP MOV BP,SP PUSH BX PUSH AX MOV BX,[BP+DI+06H] MOV AX,[BP+DI+04H] CMP AX,0000H JZ A1 PUSH BX DEC AX
A1: A2: CODE
PUSH AX CALL branch MOV BX,[BP+DI+06H] MOV AX,[BX] PUSH BX
MOV BX,[BP+DI+04H] MUL BX POP BX JMP A2
MOV AX, 0001H MOV RESULT, AX POP AX POP BX POP BP RET 0004H ENDS
END START
;递归调用
实验步骤
(1)依据设计思想绘制程序流程图,编写实验程序; (2)经编译、链接无误后装入系统;
(3)将变量N及RESULT加入变量监视窗口,并修改N值,N在00~08H之间取值; (4)在JMP START语句行设置断点,然后运行程序;
(5)当程序遇到断点后停止运行,此时观察变量窗口中RESULT的值是否正确,验证程序的正确性;
(6)改变变量N的值,然后再次运行程序,当程序停止在断点行后观察实验结果。 表4-2 阶乘表