2022年汇编语言课程设计报告——实现加减乘除四则运算的计算器.docx
精品学习资源汇编语言课程设计报告 2021 - 2021 年度第 2 学期实现加减乘除四就运算的运算器专业电脑科学与技术学生班级学号指导老师完成日期欢迎下载精品学习资源目录目录11 概述01.1 设计目的01.2 设计内容02 系统需求分析02.1 系统目标02.2 主体功能02.3 开发环境03 系统概要设计13.1 系统的功能模块划分13.2 系统流程图24 系统具体设计25 测试35.1 测试方案35.2 测试结果36 小结4参考文献5附录6附录 源程序清单6欢迎下载精品学习资源实现加减乘除四就运算的运算器1 概述1.1 设计目的本课程设计是在学完教学大纲规定的全部内容、完成全部实践环节的基础上, 旨在深化同学学习的汇编语言课程基本学问,进一步把握汇编语言程序设计方法, 提高分析问题、解决问题的综合应用才能;1.2 设计内容能实现加、减、乘、除的运算;该程序接受的是 16 进制数;执行时,需要在文件名后直接跟上运算表达式,如在命令提示符下执行结果如下:c:tasm>js 3+252 系统需求分析系统目标本次汇编语言课程设计的最终目的是要实现一个简洁加减乘除四就运算的运算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四就运算;比方,十进制数的加减乘除四就运算;我们曾经学习过两个具体数字进行加减法运算,但是对于简洁运算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序储备起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算仍是除法运算也未可知,为此我们仍要判定用户所输入的运算是四就运算中的哪一个运算;此外,运算过程中的进位或是借位,挑选用什么样的方式进行输出,如何实现清屏等也是要解决的问题;主体功能系统分析主要包括设计的功能分析和系统的流程,功能分析放在首位,每一个软件都要能满意肯定的功能才有使用价值;依据功能需求来创建应用程序;本设计的功能如下:1 、输入 2 个数,先判定是加减运算仍是乘除运算,再进行运算2 、判定符号是否为运算符3 、回车为换行符4 、用十进制或十六进制输出运算结果2.3开发环境欢迎下载精品学习资源界选十面择进设算制置法转设换置设置图 3-1概要模块3 系统概要设计系统的功能模块划分此题目实现的模块图如图 3-1 所示四就运算运算器程序设计(1) 界面设置主要实现确定界面样式的功能,以菜单形式显示;(2) 挑选算法设置用于挑选加、减、乘、除法来进行运算;(3) 十进制转换设置应用十进制的转换算法来处理加、减、乘、除法四就运算;欢迎下载精品学习资源3.2系统流程图开始输入挑选键 x是X=1.十六进制加法否是X=2.十六进制减法否是X=3.十六进制乘法否是X=4.十六进制除法否是X=0.提示出错!否否X=Y/y.?是结 束4 系统具体设计4.1 界面设置通过定义数据段,利用 09H显示出功能列表;通过定义数据段,以字符串的形式输入每个提示信息,利用 09H键盘输入并回显命令显示每一个功能提示,是运算器的功能列表有序清楚的显示在屏幕上;4.2 挑选算法设置第一挑选要进行的四就运算,假设挑选1,就进行加法;假设挑选2,就进行减法;假设挑选 3,就进行乘法;假设挑选 4,就进行除法;加法:先输入第一个小于 4 位十六进制数存入 SI 中,在输入其次个小于4 位十六进制数存入 BX中,然欢迎下载精品学习资源后显示 BX 和SI 中的内容相加存在 BX中;减法:先输入第一个小于 4 位十六进制数存入 SI 中,在输入其次个小于4 位十六进制数存入 BX中,然后显示 BX 和SI 中的内容相减存在 BX中,然后用 NEG来求反,即为第一个数减去其次个数的差, 显示 BX的内容即为差;乘法:先输入第一个小于4 位十六进制数存入 SI 中,在输入其次个小于 4 位十六进制数存入 BX中,把 BX的值给 AX,然后让 AX乘以SI , 然后再分别将 DX,AX中的内容赋给 BX,接着依次显示 DX,AX的内容,即为积;除法:先输入第一个小于4 位十六进制数存入 SI 中,在输入其次个小于4 位十六进制数存入 BX中,将SI 赋给 AX作被除数,让 BX作除数,得到的商存放在 AX中, 余数放在 DX中,然后依次赋给 BX,将其依次显示即为商;4.3 十进制转换设置要完成十进制转换成十六,一般采纳除十六取余法来完成,其大致过程如下: 将待转换的数除以 16 得到第一个商和余数,此第一个余数就是所求的十六进制数的各位,再用第一个商除以 16,得到其次个商和余数,此其次个余数就是所求十六进制数的十位,重复这一过程直至商为0,此时的余数就是所求十六进制数的最高位;在内存中安排一缓冲区,用来存放以上别离出来的使十进制数的每一位,然后 再逐个转换成 ASCII 码,转换成 ASCII 码的过程很简洁,就是给每个十六进制位加上 30H即可,最终送显示器输出;5 测试5.1 测试方案对程序源代码进行功能调试和功能验证;程序代码运行胜利后,分别检验测试其加、减、乘、除功能,并对结果进行分析;当用户挑选0 时,输入 Y 或 N打算是否退出程序;5.2 测试结果输入数字进行加减乘除运算,运算结果如以下图所示:图 5.2.1运算结果欢迎下载精品学习资源测试终止后,退出程序,如以下图所示:图 5.2.2退出程序6 小结程序的主要功能是实现四就运算,整个程序中主要分为,输入算式,加法,减法,乘法,除法和以十进制显示结果这几个部分;本程序基本实现了四就运算的功能,但仍没能实现带有括号的四就运算,仍有在除法运算中不能运算较大的数,会产生溢显现象; 一开头的时候自己编出来的程序有许多问题, 特别是在循环程序上, 因此查阅了不少资料,也请教了好几个同学帮着修改,调试了好久才能正常运行;由于才能有限,程序仍是有不完善的地方;这次的综合试验让我对汇编有了更深刻的熟悉,对各种指令有了进一步的懂得;欢迎下载精品学习资源参考文献1 刘其明. 汇编语言程序设计教程 .徐州:中国矿业高校出版社 , 20欢迎下载精品学习资源附录附录 源程序清单IN16 MACRO;完成从键盘接受二个数并转换为十六制数,第一个数由SI 指向,其次个数存放在 BX 中LEA DX,PRCALL OUTPUT;DX指向 PR换行LEA DX,INPUT1CALL OUTPUT;DX指向 INPUT1,提示输入第一个数CALL INPUTLEA SI,RESULT;SI把输入的数存放在BX中指向 RESULTMOV SI,BX LEA DX,PRCALL OUTPUT;DX把第一个十六制数存入RESULT的第一个位置指向 PR,换行LEA DX,INPUT2CALL OUTPUT;DX指向 INPUT2,提示输入第一个数CALL INPUTENDM;把输入的数存放在BX中宏终止DATA SEGMENT;数据段BUF DB ' ',0DH,0AHDB '*- WELCOME TO CALCULATOR SYSTEM*',0DH,0AHDB '*-1:ADD-2:SUB-3:MUL-4:DIV-0:QUIT*',0DH,0AHDB '*- 2021*6*21*',0DH,0AHDB 0DH,0AH,'Please input the choose number:','$' INPUT1 DB 'Please input the first number xiao yu 4 wei:','$'INPUT2 DB 'Please input the second number xiao yu 4 wei:','$' RESULT DW .,.;存放键盘输入的两个十六制数WRO DB 'You input the number is wrong,please input again:',0DH,0AH,'$' PR DB 0DH,0AH,'$' ;将光标移到下一行起始位置PR1 DB 'A + B=$'PR2 DB 'A - B=$' PR3 DB 'A * B=$' PR4 DB 'A / B=$'欢迎下载精品学习资源PR5 DB '.$'PR6 DB 'Are you sure exit.Y/N$'DATA ENDS;数据段落定义终止CODE SEGMENTMAIN PROC FAR;主函数ASSUME CS:CODE ,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA DX,BUF;DX指向 BUF换行CALL OUTPUT;调用显示字符串函数换行SUB AX,AX;AX清零CALL CHOOSE;调用挑选函数JMP START;跳转到 STARTRETMAIN ENDPINPUT PROC NEAR;定义 INPUT 函数,就是将从键盘输入的数按原十六进制数存放在BX中MOV BX,0;BX清零NEWCHAR:MOV AH,1INT 21H;接受键盘输入一个字符CMP AL,0DH;输入的字符与回车比较JE EXIT;是回车就终止CMP AL,'A'与 A 比较JAE H0;大于等于就跳转到H0CMP AL,'0'与 0 比较JAE H1;大于等于就跳转到H1H0:SUB AL,37H;由于 41-A=37, 完成把字母字符转换成对应的十六进制数JMP ADDTO;跳转到 ADDTOH1:SUB AL,30H;把 0 到 9 的字符转换成对应的十六进制数JMP ADDTO;跳转到 ADDTOADDTO:MOV CL,4;相当于让 BX乘以 16SHL BX,CL;将 BX 规律左移欢迎下载精品学习资源MOV AH,0;将 AX 清零ADD BX,AX;AX+BX送到 BXJMP NEWCHAR;跳转到 NEWCHAR把,其次个输入的字符存放到BX的其次位 EXIT: RETINPUT ENDPOUTPUT PROC NEAR; 显示字符串函数MOV AH,09HINT 21H RETOUTPUT ENDPCHOOSE PROC NEAR;挑选函数MOV AH,1;从键盘接受一个数INT 21HCMP AL,'1'与 1 比较JE YES1;等于 1 就跳转到YES1,进行加法CMP AL,'2'JE YES2;与 1 比较等于 2 就跳转到YES2,进行减法CMP AL,'3'与 1 比较JE YES3;等于 3 就跳转到YES2,进行乘法CMP AL,'4'与 1 比较JE YES4;等于 4 就跳转到YES2,进行除法CMP AL,'0'与 0 比较JE EXIT1;等于 4 就跳转到EXIT1, 终止程序CALL WRONG;假如不是 0 到 4 之间的数就提示出错EXIT1: LEA DX,PR;DX指向 PR换行CALL OUTPUTLEA DX,PR6;DX指向 PR6,确认是否退出CALL OUTPUTMOV AH,1;从键盘接受一个数INT 21HCMP AL,'Y'与 Y 比较JE EXIT0;不是 Y 就看是否为 y CMP AL,'y'与 y 比较JNE START;不是 y 就跳转到 START欢迎下载精品学习资源EXIT0:MOV AH,4CH;终止本程序INT 21HYES1:CALL JIA;调用 JIA 函数JMP STARTYES2:CALL JIAN;调用完之后跳转到调用 JIAN 函数STARTJMP START;调用完之后跳转到STARTYES3:CALL CHENG;调用 CHENG函数JMP START;调用完之后跳转到START YES4:CALL CHU;调用 CHU函数RETCHOOSE ENDP;挑选函数终止WRONG PROC NEAR;报错函数LEA DX,PR;DXLEA DX,WRO;DX指向 PR换行指向 WRO,提示输入有错,请重新输入JMP START;跳转到 STARTRETWRONG ENDP;报错函数终止JIA PROC NEAR;加法函数IN16;调用宏 , 接受键盘输入的两个十六进制数,第一个数由SI指向,其次个数存放在 BX中ADD BX,SI;把第一个数加其次个数存放到BX中LEA DX,PR;DX指向 PR,换行CALL OUTPUTLEA DX,PR1;DX指向 PR1,显示 A + B= CALL OUTPUTCALL OUTBX;调用显示 BX寄存器的内容函数RETJIA ENDP;加法终止JIAN PROC NEAR;减法函数IN16;调用宏 , 接受键盘输入的两个十六进制数,第一个数由SI指向,其次个数存放在 BX中SUB BX,SI;其次个数减第一个数 , 结果存放到 BX中NEG BX;对结果取反后才是A-B 的值 , 才是第一个数减去其次个数LEA DX,PR;DX指向 PR,换行欢迎下载精品学习资源CALL OUTPUTLEA DX,PR2;DX指向 PR2,显示 A - B= CALL OUTPUTCALL OUTBXRET;调用显示 BX寄存器的内容JIAN ENDP;加法函数终止CHENG PROC NEAR; 乘法函数IN16;调用宏 , 接受键盘输入的两个十六进制数,第一个数由 SI 指向,其次个数存放在 BX中MOV DX,0MOV AX,BX;把 DX清零把其次个数赋给 AXMUL WORD PTRSI;AX乘SI并把结果存放到 DX,AX中, 是字的操作MOV BX,AX;将 AX 赋给 BXPUSH BX;将 BX 压栈,显示下面 DX的内容时要将 DX的值赋给 BX PUSH DX;将 DX压栈,由于下面要换行输出,会转变DX的值 LEA DX,PR;DX指向 PR,换行输出CALL OUTPUTLEA DX,PR3;DX指向 PR3,显示 A * B= CALL OUTPUTPOP DX;将 DX出栈,要将做乘法后DX的内容显示出来MOV BX,DX;把 DX给 BXCALL OUTBX;显示 DX的内容POP BX;将 BX 出栈CALL OUTBX;显示 AX 的内容RETCHENG ENDP;乘法函数终止CHU PROC NEAR;除法函数IN16;调用宏 , 接受键盘输入的两个十六进制数,第一个数 SI 指向, 其次个数存放在 BX中MOV AX,SI;将第一个数赋给 AX MOV DX,0;将 DX清零DIV BX;AX除 BX,结果存放到 DX,AX, DX存放余数, AX存放商PUSH DX;压栈 DXPUSH AX;压栈 AX欢迎下载精品学习资源LEA DX,PRCALL OUTPUT;DX指向 PR,换行LEA DX,PR4;DX指向 PR4,显示 A / B= CALL OUTPUTPOP AX;出栈 AXMOV BX,AX;将 AX 赋给 BX,将商给 BXCALL OUTBX;显示 AX 寄存器的内容,即显示商LEA DX,PR5;DX指向 PR5,显示省略号CALL OUTPUTPOP DXMOV BX,DX;出栈 DX将 DX赋给 BX,即将余数赋给BX,CALL OUTBX;显示 DX寄存器的内容,显示余数RETCHU ENDP;除法函数终止OUTBX PROC NEAR; 显示 BX 寄存器的内容函数MOV CH,4;CH等于 4ROTATE:MOV CL,4;CL等于 4ROL BX,CL;将 BX 循环左移 4 位MOV AL,BL;将 BL 赋给 ALAND AL,0FH;将 AL 的高位置 0ADD AL,30H;AL+30H可将 AL 变为对应的 ASCII 的值CMP AL,3AH;判定是否是 0-9 之间JL PRINTIT;是就跳转到 PRINTIT ADD AL,7H;是 A-F 再加上 7H PRINTIT:MOV DL,AL;将 AL 赋给 DLMOV AH,2INT 21H;显示 ALDEC CH;CH-1再赋给 CHJNZ ROTATE;CH.=0就跳转到 ROTATE RET;CH=0就终止OUTBX ENDP;显示寄存器 BX内容函数终止CODE ENDS END MAIN欢迎下载