昆明理工大学信息工程与自动化学院学生实验报告
(2011 —2012 学年第一学期)
课程名称:汇编语言程序设计开课实验室:信自楼445 2011年 11月 25日
年级、专业、班计科092 学号200910405213 姓名王益荣成绩
实验项目名称子程序设计
指导教
师
万小容教
师
评语教师签名:
年月日
注:报告内容按实验须知中七点要求进行。
一、实验目的
1、掌握子程序的设计方法;
2、输入并汇编求N!程序;
3、观察并记录运行结果。
二、实验原理及基本技术路线图(方框原理图)
初始化区间上下限。然后把要找的数与边界元素(表中最小数和最大数)比较,若匹配则表示找到,显示查找0次。若不是边界元素,则在表中折半查找该值,若未找到则显示NO FOUND信息。若找到,在屏幕上显示找到的字符,并显示查找次数。所显示的第一位是输入的字符,第二位是找到的字符,第三和第四位是查找次数。
FACT 子程序
保存BP 内容,建立帧首地址
保存寄存器内容
取结果地址
取N
N=0?
恢复寄存器内容
N !存入结果单元
N !=N*(N-1)!
取(N-1)!
调用FCAT ,求(N-1)
(N-1)入栈
结果地址入栈
返回
N !=1
Y
N
主程序
结果地址入栈
结果地址入栈
结果地址入栈
返回
三、所用仪器、材料(设备名称、型号、规格等)计算机一台、先建立一个txt文件写好源程序代码。
四、实验方法、步骤
1、建立obj文件
2、链接obj文件且建立exe文件
3、u命令
4、d命令
5、r命令
6、g命令
7、t命令查看每一步运行结果
将AX的地址值124A赋给DS:
把BUF的值5赋给AX:
调用FACT的函数,并把MOV RESU,DX的偏移地址入栈:
将AX的值5和1比较:
结果大于1,跳转到NEXT处执行:
将AX的值5入栈,再将AX的值减1:
AX的值减1后变为4,从新调用FACT函数,并将POP AX的偏移地址入栈:
继续执行AX的值与1比较,大于则将AX的值入栈,并将AX的值减1后调用FACT,再将POP AX的偏移地址入栈的操作,直到AX的值变为1:
AX的值等于1后,执行MOV DX,1:
RET返回到最后一次入栈的POP AX处:
将AX的值2出栈后与1相乘,结果存在DX中:
返回到倒数第二次入栈的POP AX的偏移地址出,取出AX的与DL相乘后存入DX,直到入栈的所有AX的值出栈:
所有AX的出栈后,RET返回到第一次入栈的MOV RESU,DX的偏移地址处执行,存入最后的DX的值78H,程序结束:
一、实验过程原始记录(数据、图表、计算等)
STAG SEGMENT STACK 'S'
DW 64 DUP('ST')
STAG ENDS
DATA SEGMENT
BUF DW 5
RESU DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA,SS:STAG
START: MOV AX,DATA
MOV DS,AX
MOV AX,BUF ;取出数值N送AX
CALL FACT ;调用子程序
MOV RESU,DX ;存储结果
MOV AH,4CH ;返回DOS
INT 21H
FACT PROC NEAR ;子程序定义开始
CMP AX,1 ;AX的值(N)和1比较
JA NEXT ;大于1,转NEXT
MOV DX,1 ;等于1,则其阶乘值为1
RET ;返回
NEXT: PUSH AX ;AX的值(N)压栈
DEC AX ;AX的值减1
CALL FACT
;递归调用子程序求(N?1)!送DX POP AX ;弹出值(N)送AX
MUL DL ;AX=AL*DL,即N!=N(N?1)!
MOV DX,AX ;存入DX
RET ;返回
FACT ENDP
;子程序定义结束
CODE ENDS
END START
一、实验结果、分析和结论(误差分析与数据处理、成果总结等。其中,绘制曲线
图时必须用计算纸)
结果出来了,虽然基本读懂程序但还是不太懂,希望在以后的学习中在掌握。
七、教师必须按照上述各项内容严格要求,认真批改和评定学生成绩。