微机原理实验之子程序设计 联系客服

发布时间 : 星期二 文章微机原理实验之子程序设计更新完毕开始阅读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 阶乘表