辽 宁 工 业 大 学 课 程 设 计 说 明 书 (论文)
INT 21H ADD CL,30H MOV DL,CL MOV AH,2 INT 21H
MOV DX,OFFSET BUFF MOV AH,9 INT 21H NEXT:INC BH CMP BL,BH JL DONE JMP L1 DONE:
MOV AX,OFFSET PF; CALL DISPMSG CALL PFC
PFC PROC;声明子程序,求平方差
WORK: MOV AL,BYTE PTR X MUL AL MOV Z,AX
MOV AL,BYTE PTR Y MUL AL CMP Z,AX JB INT1 SUB Z,AX JMP INT2 INT1: SUB AX,Z MOV Z,AX
8
;CL=CL+30H ;DL=CL
;输出DL中的内容
;将BUFF的首地址给DX
;BH+1
;BL与BH做比较 ;跳转到JL ;跳转到L1
;将PF的首地址给AX
辽 宁 工 业 大 学 课 程 设 计 说 明 书 (论文)
MOV C,'-' INT2: MOV CX,5H MOV DI,4H MOV BX,0AH MOV AX,Z WORK2: MOV DX,0 DIV BX
ADD DL,30H
MOV S[DI],DL DEC DI CMP AX,0H JZ W2EXIT LOOP WORK2 W2EXIT: MOV AL,C MOV S[DI],AL MOV DX,OFFSET CTRL MOV AH,09H INT 21H
MOV DI,0
WORK3: INC DI CMP S[DI],0H JZ WORK3 LEA DX,S[DI] MOV AH,09H INT 21H MOV AH,4CH INT 21H RET PFC ENDP
9
;返回DOS
辽 宁 工 业 大 学 课 程 设 计 说 明 书 (论文)
MOV AH,4CH ;返回DOS
INT 21H CODE ENDS ;代码段结束标志 END START
;程序结束标志
运行结果:
图2.4 运行结果 图
10
辽 宁 工 业 大 学 课 程 设 计 说 明 书 (论文)
第3章 课程设计总结
首先要对这个问题进行分析,选择你所想用的算法,使这个程序能键盘输入自己想求的两个数,回车结束,即可看到该算法求出的公约数。对这次试验,我只能用一些简单的代码进行编程,由于我的编程水平有限,我所用的代码也很简单,在算法中,存在一个问题有待改进,那就是输入的两个数之后,第一次只能求出公约数,再输入一次才能求出平方差,而且,平方差输出前面没有提示。
先用辗转法求出两个数的最大公约数,再求出最大公约数的所有约数并显示,先用小的一个数除大的一个数, 得第一个余数; l再用第一个余数除小的一个数, 得第二个余数; 又用第二个余数除第一个余数, 得第三个余数; l这样逐次用后一个数去除前一个 余数,直到余数是0为止。那么, 最后一个除数就是所求的最大公 约数(如果最后的除数是1,那么 原来的两个数是互质数)。然后所求出的最大公约数的约数都是这两个数的公约数。实验中充分熟悉了辗转相除法。
从这次实验中,我复习了汇编语言代码,同时也通过辗转算法解决了求解出最大公约数这个问题。之前也尝试过其他算法,从这个试验的结果我了解到了算法的优与劣的差别,虽然得到的是同样的结果,但是需要的时间和资源却相差很大,这提示我们在以后写算法的时候要找出最优算法。可见汇编语言编程的人来说是多么的重要,在以后写程序过程中要时刻提醒自己找最优算法,当然得先学会分析。在以后的学习中我要学会多实践、多分析,在不停的改正错误中提高自己。
11
辽 宁 工 业 大 学 课 程 设 计 说 明 书 (论文)
参考文献
[1] 方立友.微机原理与汇编语言实用教程,北京:清华大学出版社,2007 [2] 朱定华.微机原理、汇编与接口技术(第2版),北京:清华大学出版社,2010 [3] 周杰英.微机原理、汇编语言与接口技术,北京:人民邮电出版社,2011
[4] 钱晓捷.16/32位微机原理、汇编语言及接口技术(第3版),北京:机械工业出版社, 2011 [5] 姜蓉.微机原理汇编语言及接口技术.西安:西安交通大学出版社,2006
源文件代码:DATA SEGMENT BUFF DB 0DH,0AH,'$'
IN_MSG1 DB 'PLEASE ENTER A NUMBER:',0DH,0AH,'$'
IN_MSG2 DB 'PLEASE ENTER ANOTHER NUMBER:',0DH,0AH,'$' OUT_MSG DB 'THE COMMON NUMBER(S) IS(ARE):',0DH,0AH,'$' PF DB 'PING FANG CHA:',0DH,0AH,'$'
LOAD DB 'PRESS ANY KEY TO CONTINUE$' x dw 0 y dw 0 z dw 0 c db 0h s db 6 dup(0h),'$' ctrl db 0dh,0ah,'$' DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV AX,OFFSET IN_MSG1 ; 提示输入第一个数据 CALL DISPMSG
CALL READSID ; 输入第一个数据 MOV BX,AX MOV x,BX
12