实验六 计算N!的实验
一、实验要求:编写计算N!的程序。数值N由键盘输入,结果在屏幕上输出,N的范围为0~65535,
即刚好能被一个16位寄存器容纳。
二、实验目的:通过编制一个阶乘计算程序,了解高级语言中的数学函数是怎样在汇编语言一级上实现的。 三、实验说明:编制附乘程序的难点在于随着N的增大,共结果远不是寄存器所能容纳。这就必须把结果放在一个内存缓冲区中。然而乘法运算只能限制于两个字相乘,因此要确定好算法,依次从缓冲区中取数,进行两字相乘,并将DX中的高16位积作为产生的进位。程序根据阶乘的定义:N!=N*(N-1)*(N-2)*?*2*1,从左入右依次计算,结果首先将BP初始化为存放N值,然后使BP为N-1,以后BP依次减1,直至变化为1。每次让BP与BUF中的字单元按由低到高的次序相乘,低位结果AX仍保存在相应的BUF字单元中,最高位结果DX则进到进位这单元CY中,以作为高字单元相乘时从低字来的进位,初始化CY为0,计算结果的长度随着乘积运算而不断增长,由字单元LEN指示。当最高字单元与BP相乘时,若DX不为0,则结果长度要扩展。 四、实验程序框图: 五、实验程序: CRLF MACRO
MOV AH,02H MOV DL,0DH INT 21H
MOV AH,02H MOV DL,0AH INT 21H ENDM
DATA SEGMENT
MESS1 DB 'INPUT THE NUMBER ACCORDING TO HEXNUM!',0DH,0AH,'$'
MESS2 DB 'THE RESULT IS(HEX):$'
ERROR DB 'INPUT ERROR!',0DH,0AH,'$' LEN DW 1 CY DW ?
BUF DW 256 DUP (0) DATA ENDS
STACK SEGMENT
STA DW 32 DUP(?) TOP DW ? STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV SP,TOP MOV AH,09H
MOV DX,OFFSET MESS1
INT 21H ;显示输入提示信息 CALL GETNUM ;读取键入的N值 MOV BP,DX ;N值送BP CMP BP,0 JZ EEE CMP BP,1
JZ EEE ;N=0或N=1则转EEE MOV SI,OFFSET BUF ;缓冲区首址
MOV [SI],DX ;缓冲区初始化为值N
30
XXX: DEC BP ;N值减1 CMP BP,0001H
JZ LLL ;若为1则转结束LLL XOR BX,BX ;偏移指针清0 MOV WORD PTR [CY],0 ;进位单元清0
MOV CX,[LEN] ;当前结果长度送CX TTT: MOV AX,[SI+BX]
MUL BP ;相乘
ADD AX,[CY] ;加低位进位 JNC JJJ ;结果无进位转JJJ
INC DX ;有进位高位单元加1 JJJ: MOV [SI+BX],AX ;结果送缓冲区中
MOV [CY],DX ;高位单元送进位单元 INC BX
INC BX ;一个字长度 LOOP TTT ;循环 CMP DX,0000H
JZ BBB ;最后1次的进位为0则转BBB INC WORD PTR [LEN] ;长度加1
MOV [SI+BX],DX ;进位送缓冲区中 BBB: JMP XXX
EEE: MOV SI,OFFSET BUF
MOV WORD PTR [SI],1 ;结果为1 LLL: MOV AH,09H
MOV DX,OFFSET MESS2 INT 21H
MOV CX,[LEN]
MOV BX,CX ;长度 DEC BX
SHL BX,1 ;1个字为两个字节 CCC: MOV AX,[SI+BX] CALL DISP DEC BX
DEC BX ;显示结果 LOOP CCC
MOV AX,4C00H ;结束 INT 21H DISP1 PROC NEAR MOV BL,AL MOV DL,AL MOV CL,04 ROL DL,CL AND DL,0FH CALL DISPL MOV DL,BL AND DL,0FH CALL DISPL RET DISP1 ENDP
DISPL PROC NEAR ADD DL,30H CMP DL,3AH JB DDD ADD DL,27H
31
DDD: MOV AH,02H INT 21H RET DISPL ENDP
DISP PROC NEAR PUSH BX PUSH CX PUSH DX PUSH AX MOV AL,AH CALL DISP1 POP AX CALL DISP1 POP DX POP CX POP BX RET
DISP ENDP ;字符和数据显示子程序 GETNUM PROC NEAR PUSH CX XOR DX,DX GGG: MOV AH,01H INT 21H
CMP AL,0DH JZ PPP
CMP AL,20H JZ PPP
SUB AL,30H JB KKK CMP AL,0AH JB GETS CMP AL,11H JB KKK SUB AL,07H CMP AL,0FH JBE GETS CMP AL,2AH JB KKK CMP AL,2FH JA KKK
SUB AL,20H GETS: MOV CL,04 SHL DX,CL XOR AH,AH ADD DX,AX JMP GGG
KKK: MOV AH,09H
MOV DX,OFFSET ERROR INT 21H PPP: PUSH DX CRLF POP DX POP CX RET
32
GETNUM ENDP ;键盘字符读取子程序 CODE ENDS END START
33
实验七 字母的大小写转换
一、实验要求:
显示选择项菜单,接收键盘输入以确定大写转小写,小写转大写或返回DOS。然后根据提示输入字符串(以回车为结束符),程序按先前选择进行大小写转换并显示,之后返回选择项菜单。 二、实验目的:了解小写字母和大写字母在计算机内的表示方法,并学习如何进行转换。 三、实验程序框图:
开始 初始化 显示提示信息 返回DOS 调用DOS中断 接收键入的字符 Y 是3否 N Y N Y Y 是2否 是1否 等待键入字母并显示 等待键入字线并显示 是回车否 是回车否 N 小写不变,大写变小写存入小写缓行区 大写不变小写变大写存入大写缓行区 显示大写缓存区内容 显示小写缓存区内容
四、实验程序: CRLF MACRO MOV AHM02H MOV DL,0DH INT 21H MOV AH,02H MOV DL,0AH INT 21H
34
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库微机原理与接口实验指导书(2010版)(7)在线全文阅读。
相关推荐: