计算机与信息工程学院实验报告
计算机与信息工程学院实验报告
姓 名 班 级 同 组 实验者 课 程微机与接口 名 称 主 讲 教 师 实验心得: 学 号 联 系 电 话 实验室 名 称 实 验 实验三 序 号 辅 导 教 师 专 业 Email 实 验 日 期 实 验子程序设计 项 目 查表程序设计 指 导 教 师 学生签名: 2011 年 11月 20 日 成绩评定及教师评语: 成绩: 教师签名: 年 月 日
·1·
计算机与信息工程学院实验报告
2.7 子程序设计实验
一、 实验内容
80X86指令系统提供子程序的基本指令,编写程序实现循环并运行程序,观察结果。 二、 实验目的及要求
1. 学习子程序的定义和调用方法。
2. 掌握子程序、子程序的嵌套、递归子程序的结构。 3. 掌握子程序的程序设计及调试方法。
三、 实验环境
PC机一台,TD-PITE实验装置或TD-PITC实验装置一套。 四、 实验方法过程(步骤)
.1、80X86指令系统提供了实现子程序的基本指令,编写程序。 2、加载程序并编译程序。
3、调试通过后全速运行并观察实验结果。 4、编写实验报告。 五、 算法描述
1. 求无符号字节序列中的最大值和最小值
设有一字节序列,其存储首地址为3000H,字节数为 08H。利用子程序的方法编程求出该序列中的最大值和最小值。
图1.求和
·2·
计算机与信息工程学院实验报告
图1.求无符号字节序列中的最大值和最小值
2. 求N!
利用子程序的嵌套和子程序的递归调用,实现N!的运算。
定义两个变量N及RESULT,RESULT中存放N!的计算结果,N在00H~08H之间取值。
六、 源程序清单
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 ; 子程序,返回参数在AX中 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
·3·
计算机与信息工程学院实验报告
POP CX POP SI A4: RET BRANCH ENDP CODE ENDS
END START 2. 求N!
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 PUSH AX ·4·
计算机与信息工程学院实验报告
CALL branch ;递归调用 MOV BX,[BP+DI+06H] MOV AX,[BX] PUSH BX
MOV BX,[BP+DI+04H] MUL BX POP BX JMP A2 A1: MOV AX, 0001H
A2: MOV RESULT, AX ;结果存入RESULT中 POP AX POP BX POP BP RET 0004H CODE ENDS END START
七、 运行结果及分析
1. 求无符号字节序列中的最大值和最小值
结果AX为F904,其中AH 中为最大值,AL 中为最小值。 调试窗口里输入E 0000:3000命令,然后输入 3000=D9(数据个数) 3001=07 3002=8B 3003=C5 3004=EB 3005=04 3006=90 3007=F9
运行程序运行程序,由程序代码可知结果在解析式的值存入AX中,运行后直接在寄存器查看窗口就可以查看AX的值. 程序使用BH和BL暂存最大值和最小值,开始时初始化成首字节的内容,然后进入循环操作,从字节序列中逐个取出一个字节的内容与BH和BL相比较,若取出的字节内容比BH的内容大或比BL的内容小,则修改它们。当循环操作结束时,将BH送AH,将BL送AL,作为返回值,同时恢复BX原先的内容。
2. 求N!
修改N 值,N 在00~08H 之间取值,当N从00~08H变化时,可得阶乘表。
程序中N的阶乘,用一递归子程序来实现,每次递归调用时将调用参数减1,即求(N-1)的阶乘,并且当调用参数为0时停止递归调用,且0!=1,最后将每次调用的参数相乘得到最后结果。因每次递归调用时参数都送入堆栈,当N为0而程序开始返回时,按嵌套的方式逐层取出相应的调用参数。
根据实验要求,改变变量N的值,运行程序,观察RESULT的值。
·5·