汇编语言实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机学院
实验报告
(2016 ~2017学年度第二学期)
课程名称汇编语言程序设计实验名称计算阶乘
学号20154480506 姓名
张扬
专业
班级5班
软件工程
地点第一实验楼教师
凌云
一.实验题目
用汇编语言编写程序计算阶乘N!数值有键盘输入,结果在屏幕上面输出。二.流程图
三.实验代码
代码要配合程序界面进行说明
源代码:
DATAS SEGMENT
STRING DB "Please input a number(0-10000):" ,0dh,0ah ;提示用户输入数字字串
WRONGSTRING DB "Wrong input!!! Please input a number ! ",0ah,0dh,'$'
;用户输入错误提示
INPUTBUFFER DB 6,?,6 DUP(?)
;开辟出(留出)6个初值未知的字节单元空间
C10 DW 10 ;输入时进制转换的数
N DW ? ;要求阶乘的数
M DW ? ;步长
T DW ? ;进位
I DW ?
OUTPUTBUFFER DW 30000 DUP(?)
;开辟出(留出)30000个初值未知的字单元空间
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MAIN PROC ;主程序
;----------------------------------------------
CALL INPUT ;调用输入子程序
CALL FAC ;调用递归实现阶乘
MOV CX,DI
ROUTPUT: ;输出结果
PUSH CX
MOV DI,CX
CALL OUTPUT ;显示输入的数字
POP CX
DEC CX
CMP CX,0
JGE ROUTPUT
DISPLAYLENGTH: ;显示长度
MOV Dl,0DH
MOV AH,2
INT 21H
MOV Dl,0AH
MOV AH,2
INT 21h
EXIT: ;退出
MOV AH,07H
INT 21H
MOV AX,4C00H
INT 21H
MAIN ENDP
;---------------------------------------------- INPUT PROC NEAR ;输入子程序
LEA BX,STRING ;指向输入字符的地址 MOV CX, 33 ;循环的次数
DISSTRING:
MOV Dl,[BX]
MOV AH,2 ;显示一个字符在屏幕上 INT 21H
INC bx
LOOP DISSTRING ;循环输出显示
JMP INPUTINIT
WRONGINPUT: ;用户输入错误提示
LEA DX,WRONGSTRING
MOV AH,9
INT 21H
INPUTINIT: ;输入初始化
LEA DX,INPUTBUFFER ;装载输入缓冲区首地址
MOV AH,0AH ;输入功能代码
INT 21H ;从键盘输入一个数,以回车键结束 MOV AX,0 ;累加器清0
MOV Cl,INPUTBUFFER+1 ;循环次数
MOV CH,0
LEA BX,INPUTBUFFER+2 ;装载字符存放区首地址INPUTONE: ;输入过程
MUL C10 ;乘以要转换成的进制数
MOV Dl,[BX]
CMP Dl,'0' ;判断输入是否小于0
JB WRONGINPUT
CMP Dl,'9'
JA WRONGINPUT ;判断某位上的数字是否大于9
AND Dl,0FH
ADD Al,Dl
ADC AH,0 ;带进位的加法
INC BX ;加1
LOOP INPUTONE ;循环输入
MOV N,AX ;显示低位
MOV Dl,0DH
MOV AH,2
INT 21H
MOV Dl,0AH ;显示高位
MOV AH,2
INT 21H
RET
INPUT ENDP
;----------------------------------------------
FAC PROC NEAR
MOV CX,N ;取阶乘的次数n
MOV I,1D
MOV M,0D
PUSH DX
MOV DI,0D
MOV AX,DI
MOV BX,2D
mul BX ;计算n!=n*(n-1)!
MOV SI,AX ;将n!的值保存在si中
pop DX
MOV OUTPUTBUFFER[SI],1D CTRLI:
MOV T,0
MOV DI,0D
CTRLDI:
CMP DI,M JBE DONE jmp CMPC DONE:
PUSH DX MOV AX,DI MOV BX,2D
mul BX MOV SI,AX
POP DX
MOV AX,OUTPUTBUFFER[SI] MOV BX,I MUL BX ADD AX,T
ADC DX,0
MOV BX,10000 DIV BX MOV T,AX
PUSH DX MOV AX,DI MOV BX,2D MUL BX MOV SI,AX
POP DX
MOV OUTPUTBUFFER[SI],DX INC DI
JMP CTRLDI CMPC:
CMP T,0 JA THREE1 JMP NEXT THREE1: