资源描述
word1. 设计目标运用汇编语言,制作一个计算的程序,实现简单计算器的一般功能,能够在DOS界面下进展简单的加、减、乘、除的简单计算。程序应有操作提示、输入和输出。自动闪烁光标,并提示输入信息。输入正确的数值等符号后可以进展正确的运算,程序计算其结果值并输出。程序无需查错功能,所输入的都是正确的四如此运算表达式,并且表达式中运算分量均为无正负号整数,运算符为 +、-、*、/,最后结果以十进制数表示。且程序主界面需为一个由*组成边框的矩形窗口。汇编语言直接同计算机的底层软件甚至硬件进展交互,它具有如下一些优点:能够直接访问与硬件相关的存储器或I/O端口;能够不受编译器的限制,对生成的二进制代码进展完全的控制;能够对关键代码进展更准确的控制;能够根据特定的应用对代码做最优的优化,提高运行速度;能够最大限度地发挥硬件的功能。2. 软件设计主模块:首先提供一个主界面,提示用户按要求输入具体的数据和所要进展的操作,输入完毕后给出结果。如果输入过程中发现非法输入,如此立即给与提示,程序自动刷新界面,提示继续输入。计算显示完毕后,按提示选择是否要继续计算,不选择继续如此完毕。对屏幕上输入字符串的承受,为INPUT语句段,见源代码,主要是将数字和运算符分开存放。MATCH子程序,子程序内有三次跳转,将运算符选择正确的语句进展计算。由于操作符只有+、-、*、/,没有涉与到括号,不用考虑括号的匹配问题。流程图如下:图1 主模块流程图子模块:完成对数据的进一步加工处理,转换格式并得出结果。首先根据输入调用对应的“+、“-、“*、“/四个函数模块,这是本程序的核心模块,其他局部的一些小模块都是为这几个模块服务的,大致的流程图如如下图2:图2 子模块流程图STACK SEGMENT STACK DB 200 DUP(0)STACK ENDSDATA SEGMENT OPS DB ? OPD DB ? OPER DB ? TIT DB* ,0DH,0AH DB* Made By * ,0DH,0AH ;0DH代表回车 DB* Tong Xin Ji Suan Qi Xiao Zu * ,0DH,0AH ;0AH代表换行 DB* Chang qian Zuo xin Wang xin * ,0DH,0AH DB* Wang da yong Tang kuan long * ,0DH,0AH DB* + - * / * ,0DH,0AH DB* Y,y:continue N,n:quit * ,0DH,0AH DB*Calculate*$,0DH,0AH Tip1 DB Input the first operator (0-9):$,0DH,0AH Tip2 DB Please input the oper (+,- ,*,/) :$,0DH,0AH Error DB Error! Plese input the oper again:$,0DH,0AH Tip3 DB Input the second operator (0-9):$,0DH,0AH Result DB -the result is:$,0DH,0AH Quit DB Choose repeat or quit? (Y/y/N/n) :$,0DH,0AH Tsave DB ?DATA ENDSCODE SEGMENT ASSUME CS: CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA ;初始化 DS:DX MOV DS,AXRemain: MOV BL,0 ;Oper(恢复)初始状态 MOV OPS,BL MOV OPER,BL MOV OPD,BL LEA SI,OPS ;OPS的偏移地址送给SI LEA DI,OPD ;OPD的偏移地址送给DI CALL Enter LEA DX,TIT MOV AH,9 INT 21H CALL Input1 ;调用输入第一个操作数 CALL Operat ;调用输入操作符 CALL Input2 ;调用输入第二个操作数 CALL Calculate ;调用计算方法 CALL StrQuit ;调用判断程序再次执行 MOV AH,1 INT 21H CMP AL,Y JE Remain CMP AL,y ;选择Y返回Remain继续执行 JE Remain CMP AL,N JE EXIT CMP AL,n JE EXIT EXIT:MOV AH,4CH ;假如不是Y如此完毕 INT 21H ;输入操作数子程序-Input1 PROC NEAR CALL Enter LEA DX,Tip1 ;输入第一个操作数提示- MOV AH,9 INT 21H ;十进制输入提示BCDin1: MOV AH,1 INT 21H CMP AL,0DH JE EndBCDin1 ;等于回车如此返回继续输入运算符 CMP AL,30H BCDin1 ; 9时转exitinD 退出 AND AL,0FH ;去除高位 MOV SI,AL INC SI LOOP BCDin1EndBCDin1: CALL Enter ;回车换行 RET Input1 ENDPInput2 PROC NEAR CALL Enter LEA DX,Tip3 ;输入第二个操作数提示- MOV AH,9 INT 21H ;十进制输入提示BCDin2: MOV AH,1 INT 21H CMP AL,0DH JE EndBCDin2 ;等于回车如此返回继续输入运算符 CMP AL,30H BCDin1 ; 9时转exitinD 退出 AND AL,0FH ;去除高位 MOV SI,AL INC SI LOOP BCDin2EndBCDin2: CALL Enter ;回车换行 RET Input2 ENDP;输入操作符子程序-Operat PROC NEARReOperat: CALL Enter LEA DX,Tip2 ;输入操作符提示 MOV AH,9 INT 21H MOV AH,1 INT 21H CMP AL,+ JE OperSave ;假如为+,如此存在oper CMP AL,- JE OperSave CMP AL,* JE OperSave CMP AL,/ JE OperSave JMP OperErrorOperError: CALL Enter LEA DX,Error ;输入操作符的错误提示 MOV AH,9 INT 21H JMP ReOperatOperSave: MOV OPER,AL RETOperat ENDP;计算方法子程序-Calculate PROC NEAR CALL Enter ;回车换行 MOV BL,OPER CMP BL,+ JZ ADCProc ;假如为加法,如此转到adcProc CMP BL,- JZ SUBProc CMP BL,* JZ MULProc CMP BL,/ JZ DIVProcADCProc: CALL StrResult ;加法 MOV AL,OPS ADC AL,OPD CALL Displ JMP endCalculate SUBProc: ;减法 CALL StrResult MOV AL,OPS SUB AL,OPD CALL Displ JMP endCalculateMULProc: ;乘法 CALL StrResult MOV AL,OPD MUL OPS CALL Displ JMP endCalculateDIVProc: ;除法 CALL StrResult MOV AH,0 MOV AL,OPS DIV OPD CALL Displ JMP endCalculateendCalculate: RETCalculate ENDPDispl PROC NEAR MOV Tsave,AL MOV AH,0 MOV AL,Tsave MOV BL,100 DIV BL ;除以100 CALL Output ;显示百位数 MOV AL,AH MOV AH,0 MOV BL,10 DIV BL ;除以10 CALL Output ;显示十位数 MOV AL,AH CALL Output ;显示个位数 RETDispl ENDPStrResult PROC NEAR LEA DX,Result MOV AH,9 INT 21H RET StrResult ENDPOutput PROC NEAR ;十进制输出 PUSH AX ADD AL,30H ;将AL中的十进制数变成ASCII码 MOV DL,AL MOV AH,2 INT 21H POP AX RETOutput ENDP;回车换行子程序-Enter PROC NEAR MOV DL,0AH MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H RETEnter ENDP;判断程序再次执行子程序-StrQuit PROC NEAR CALL Enter ;回车换行 LEA DX,Quit MOV AH,9 INT 21H RETStrQuit ENDP CODE ENDS END START3. 系统调试(1)在屏幕上显示一个由*组成边框的矩形窗口;(2)自动闪烁光标,并提示输入信息;(3)能够完成单项表达式的输入、显示和运算;(4)编制并调试出程序。 单击开始,启动运行,输入cmd,启动命令提示符,进入DOS系统。如如下图: 图3 启动命令提示符源程序名存为qian.asm,在dos下进入F盘,再cd masm进入masm文件夹,再键入masm qianqian是源程序文件名提示是否更改文件名不改直接回车,系统会提示是否生成.lst文件和.crf文件直接回车跳过,这样就生成了qian.obj 键入link qianqian是源程序文件名,提示是否更改文件名不改直接回车提示是否生成.map和.lib文件直接回车,这样就生成了qian.exe,再在DOS下键入qian源程序文件名就进入程序执行。如图4:图4 执行方法在计算器内,输入数字测试本程序的正确与否。按照提示输入第一个十进制数,如“6,回车。下一步,会提示请输入运算符,如加“+,回车。最后一步,输入第二个十进制数,如“3,回车。如此显示出其运算结果。如如下图5所示:图5 实现加法运算同上,可实现减法、乘法、除法运算,分别如图6,图7,图所示8:图6 实现减法运算图7 实现乘法运算图8 实现除法运算运算完毕后,会提示是否继续下一个运算,输入“Y如此继续运算,并返回主界面,输入“N如此完毕程序。当运算符输入不合法时,如此会提示重新输入运算符,如如下图9:图9 错误提示4. 总结设计的这个程序主要是进展表达式的四如此运算,由于操作符只有+、-、*、/,没有涉与到括号,因此设计起来要容易一点,不用考虑括号的匹配问题。另外,跳转时汇编语言的一大难点,再编程之前最好要画出流程图,这样在写跳转时不容易出错,且不会出现重复操作语句段。输入局部看似简单,实际要考虑到很多细。比如一开始没想到存入的数据可能会符号存进内存后的一样;如何判段存数算法应该完毕,对应的存入数和符号。编写的五个子程序经编译、后,没有发现错误,可设计出的计算器程序出现一些不足,如本计算器只能进展一位十进制数的计算,也很少在计算的优先级,进制转化之间下功夫,致使计算器运算能力不足。还有本程序只能判断输入的运算符的合法性,不能判断输入的十进制数的正确与否,即使错误,也显示提示下一步的操作。参考文献1 詹仕华. 汇编语言程序设计M. : 中国电力, 2008.2:73-1022 宋彩莉, 王禾. 汇编语言程序设计学习指导M. 某某: 某某交通大学, 2008.2:45-873 李敬兆, 陈子旭. 汇编语言程序设计M.某某: 中国科学技术大学, 2008.9:173-1974 钱晓捷, 周玲. 新汇编语言程序设计M. : 电子工业, 2006.3:101-1205 周佩玲, 彭虎, 傅忠谦. 微机原理与借口技术M. : 电子工业, 2007.1:113-1416 马春燕. 微机原理与接口技术基于32位机实验与学习辅导M. : 电子工业, 2007.1:23-707 何小海, 严华. 微机原理与借口技术M. :科学, 2006.7:143-1808 王爽, 胡雄. 汇编语言M. : 清华大学, 2009.9:29-709 曹加恒, 谢子殿. 新一代汇编语言课程设计M. : 高等教育, 2006.3:113-13810 杨路明. 汇编语言程序设计M. 某某: 中南大学, 2008.5:173-203精彩文档
展开阅读全文