当前位置:文档之家› 汇编语言程序设计报告模板总结模板计划模板.docx

汇编语言程序设计报告模板总结模板计划模板.docx

《汇编语言》课程设计报告专业计算机科学与技术学生姓名张竹青班级Z计算机 151学号1560704132任课老师王志宏完成日期2017年12月29日目录1 概述 (1)1.1 设计目的 (1)1.2 设计内容 (1)2 系统需求分析 (1)2.1 系统目标 (1)2.2 主体功能 (1)2.3 开发环境 (2)3 系统概要设计 (2)3.1 系统的功能模块划分 (2)3.2 系统流程图 (3)4 系统详细设计 (4)4.1 界面设置 (4)4.2 选择算法设置 (4)4.3 十进制转换设置 (4)5 测试 (5)5.1 测试方案 (5)5.2 测试结果 (5)6 小结 (6)参考文献 (7)实现加减乘除四则运算的计算器1 概述1.1 设计目的使用汇编语言,通过实现简单计算器的一般功能,如加、减、乘、除的计算来了解并掌握 DOS系统功能的调试方法,学会画出编程的具体流程图,同时在程序设计过程中熟悉各种指令的应用和意义,以及如何进行上机编辑、汇编、连接和调试。

本课程设计也是对课堂上所学的基本理论知识和程序设计方法的巩固和深化,提高我们的编程思想、分析问题和解决问题的综合应用能力,能够编写较复杂的应用程序,最终达到熟练地掌握结构化程序设计技术和编写汇编源程序的基本方法的目的。

1.2 设计内容设计一个能实现加、减、乘、除计算的程序,要求该程序接受从键盘输入的十六进制数,当程序执行时需在文件名后直接跟上计算表达式,每当读到一个有效的表达式时对表达式进行相应的运算后,输出用十进制数或十六进制数表示的运算结果,如在命令提示符下执行结果如下:c:\tasm>js 3+252系统需求分析2.1 系统目标本次汇编语言课程设计的最终目的是要实现一个简单的加减乘除四则运算的计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。

具体功能如下:(1)调用中断把要做运算的两个数输入到屏幕上并用程序将他们存储起来(2)判断用户所输入的运算是四则运算中的哪一种运算(3)判断运算过程中是进位还是借位(4)选择用何种输出方式(5)实现清屏2.2 主体功能要求该程序接受的是十六进制数,执行相应的计算后,计算结果以十六进制数或十进制数输出。

本设计的使用说明如下:(1)按照提示选择数字 1,2,3,4(2) 1: ADD 加法(3) 2: SUB 减法(4) 3: MUL 乘法(5) 4: DIV 除法(6)输入一个小于四位的数字,回车(7)再输入一个小于四位的数字,回车(8)显示结果(9)退出按 0,选择 Y 或 N2.3 开发环境TASM5.0 集成环境3系统概要设计3.1 系统的功能模块划分本设计实现的模块图如图3-1 所示图 3-1概要模块(1)界面设置主要实现确定界面样式的功能,以菜单形式显示。

(2)选择算法设置用于选择加、减、乘、除法来进行运算。

(3)十进制转换设置应用十进制的转换算法来处理加、减、乘、除法四则运算。

3.2 系统流程图开始输入选择键XX=1?否X=2?否是十六进制加法是十六进制减法是否X=3?否X=4?否X=0?结束十六进制乘法是十六进制除法是Exit?Y退出程序N图 3-2 四则运算计算器执行过程流程图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-1 、图 5-2 、图 5-3 、图 5-4 所示图 5-1 加法的运算的结果截图图 5-2 减法的运算的结果截图图 5-3 乘法的运算的结果截图图 5-4 除法的运算的结果截图测试结束后,退出程序,如图5-5 所示:图 5-5退出程序6小结本次课程设计是运用汇编语言设计一个计算器,其主要功能是实现加减乘除四则基本运算,整个程序中主要分为:输入表达式,加法,减法,乘法,除法和以十六进制输出结果这几个部分。

本程序基本实现了四则运算的功能,但是只能单独进行某一种运算,没有实现混合运算的效果,由于程序会产生溢出现象,所以在除法运算中不能运算较大的数。

在编写过程中用到了很多基础知识,但是在程序运行时总会出现一些问题,由于汇编基础比较薄弱,所以有时会打错了程序代码,误解了知识点,不了解程序结构等,但是通过查阅资料,请教老师并和同学讨论,最终解决了所有问题,也成功的运行出了结果。

通过本次课程设计,不仅加深了我对汇编程序设计的认识,也提高了改写程序代码和动手操作的能力,还有编程的基本习惯和开发系统时应注意的流程,同时也对各种指令有了进一步的理解。

并且我发现一个好的汇编程序不仅要正确可行,还要有健壮性,当用户输入非法的数据,使运行环境改变时,程序能恰当地作出反应或进行处理,不会产生莫名奇怪的输出结果。

因为完成设计的时间较短,并且对汇编语言知识比较生疏,设计之中难免有一些错误和不妥之处,同时也需要改进,所以真诚的希望尊敬的老师批评指正。

参考文献[1]曹加恒 . 新一代汇编语言课程设计 [M]. 北京:高等教育出版社, 2013[2]杨路明 . 汇编语言程序设计 [M]. 长沙:中南大学出版社, 2015[3]王爽 . 汇编语言 [M]. 北京:清华大学出版社, 2016附录附录源程序清单IN16 MACRO;完成从键盘接受二个数并转换为十六制数,第一个数由SI 指向,第二个数存放在 BX 中LEA DX,PR;DX指向 PR换行CALL OUTPUT ;LEA DX,INPUT1;DX指向 INPUT1,提示输入第一个数CALL OUTPUTCALL INPUT;把输入的数存放在 BX中LEA SI,RESULT;SI指向 RESULTMOV [SI],BX;把第一个十六制数存入RESULT的第一个位置LEA DX,PR;DX指向 PR,换行CALL OUTPUTLEA DX,INPUT2;DX指向 INPUT2,提示输入第一个数CALL OUTPUTCALL INPUT;把输入的数存放在 BX中ENDM;宏结束DATA SEGMENT;数据段BUF DB ' ',0DH,0AHDB '*------- WELCOME TO CALCULATOR SYSTEM ---------*',0DH,0AHDB '*---1:ADD--2:SUB--3:MUL--4:DIV--0:QUIT---------*',0DH,0AHDB '*----------2011*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 21HRETOUTPUT ENDPCHOOSE PROC NEAR;选择函数MOV AH,1;从键盘接受一个数INT 21HCMP AL,'1';与 1 比较JE YES1;等于 1 就跳转到 YES1,进行加法CMP AL,'2';与 1 比较JE YES2;等于 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 就看是否为 yCMP AL,'y';与 y 比较JNE START;不是 y 就跳转到 STARTEXIT0:MOV AH,4CH;结束本程序INT 21HYES1:CALL JIA;调用 JIA 函数JMP START;调用完之后跳转到STARTYES2:CALL JIAN;调用 JIAN 函数JMP START;调用完之后跳转到STARTYES3:CALL CHENG;调用 CHENG函数JMP START;调用完之后跳转到STARTYES4:CALL CHU;调用 CHU函数RETCHOOSE ENDP;选择函数结束WRONG PROC NEAR;报错函数LEA DX,PR;DX指向 PR换行LEA DX,WRO;DX指向 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 OUTBX;调用显示 BX寄存器的内容RETJIAN ENDP;加法函数结束CHENG PROC NEAR; 乘法函数IN16;调用宏 , 接受键盘输入的两个十六进制数,第一个数由 SI 指向,第二个数存放在 BX中MOV DX,0;把 DX清零MOV AX,BX;把第二个数赋给 AXMUL WORD PTR[SI];AX 乘 [SI] 并把结果存放到 DX,AX中 , 是字的操作MOV BX,AX;将 AX 赋给 BXPUSH BX;将 BX 压栈,显示下面 DX的内容时要将DX的值赋给 BXPUSH 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];将第一个数赋给 AXMOV DX,0;将 DX清零DIV BX;AX除 BX,结果存放到 DX,AX, DX存放余数, AX存放商PUSH DX;压栈 DXPUSH AX;压栈 AXLEA DX,PR;DX指向 PR,换行CALL OUTPUTLEA DX,PR4;DX指向 PR4,显示‘ A / B= ’CALL OUTPUTPOP AX;出栈 AXMOV BX,AX;将 AX 赋给 BX,将商给 BXCALL OUTBX;显示 AX 寄存器的内容,即显示商LEA DX,PR5;DX指向 PR5,显示省略号CALL OUTPUTPOP DX;出栈 DXMOV BX,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;是则跳转到 PRINTITADD AL,7H;是 A-F 再加上 7HPRINTIT:MOV DL,AL; 将 AL 赋给 DLMOV AH,2INT 21H;显示 ALDEC CH;CH-1再赋给 CHJNZ ROTATE;CH!=0则跳转到 ROTATERET;CH=0则结束OUTBX ENDP;显示寄存器 BX内容函数结束CODE ENDSEND MAIN。

相关主题