汇编语言课程设计报告——实现加减乘除四则运算的计算器
汇编语言程序设计————计算器

课程设计说明书题目: 表达式计算器学号:班级: 计算机创新实验班姓名:廖福轩目录一.设计内容 (2)二.设计方案 (2)1、主程序模块、 (2)2、赋权值模块、 (2)3、加减乘除运算子程序模块、 (2)4、调用赋权宏子程序模块、 (2)5、回车换行宏模块、 (2)6、9号功能显示字符串宏模块、 (2)三.设计框图 (3)四.程序代码 (4)五.运行结果 (9)六.设计总结 (9)计算器汇编语言程序设计一.设计内容从键盘输入一个十进制两位数的四则运算表达式,如23*56-(8*19)/6+67-8=,编程计算表达式的值,输出十进制结果(有可能就是三位或四位十进制),+-*/位置任意。
并要求程序能反复执行直道对“还要继续不?(y/n)”之类的提示回答“n”或“N”为止。
四则运算主要包括以下几个模块:(1)主程序模块、(2)赋权宏模块、(3)加减乘除运算子程序模块、(4)调用赋权宏子程序模块、(5)回车换行宏模块、(6)9号功能显示字符串宏模块、二.设计方案1、主程序模块、主程序初始化数据段,调用显示宏show显示界面,输入字符或数字并判断,调用子程序dyfq调用赋权宏fq为符号赋权,从而判断优先级,调用加减乘除运算子程序ys对判断出的相应运算符进行运算,输出运算结果,判断就是否继续,继续则返回输入,不继续则退出程序、2、赋权宏模块、通过定义宏fq,定义了变元a,b进行参数传递,并使用替换运算符&使变元a与标号s对应、接着给对应的符号赋予权值,将其权值存入ch中、3、加减乘除运算子程序模块、运算模块实现了将ax入栈保存,然后将ax,bx赋值为0,判断cl中的符号就是否为乘号*,若为乘号*则将number中的数字与其下一位的数字相乘,并把结果存入该位置,类似的若不为乘号*则接着判断就是否为除号/,若为除号/则进行除法运算,然后判断就是否为加法,为加法则进行加法运算,接着判断就是否为减法,为减法则进行减法运算并将结果存入当前的计算的第二个数的位置、4、调用赋权宏子程序模块、该模块实现了调用赋权宏fq为(,),*,/,+,-,=等符号分别赋权值为5,1,4,4,3,3,0、从而可以通过设定的权值来判断优先级、5、回车换行宏模块、通过2号功能的输出功能,将0dh赋予dl输出,再调用2号功能,将0ah赋予dl输出,从而实现回车换行功能、6、9号功能显示字符串宏模块、通过定义宏show,用9号显示功能,通过变元str将字符串显示出来。
汇编语言课程设计_四则运算计算器设计

目录1 设计目的 (1)2 概要设计 (1)2.1 系统总体分析 (1)2.2 主模块框图及说明 (2)3 详细设计 (3)3.1 主模块及子模块说明 (3)3.2 各模块详细设计 (3)3.2.1 判定运算符模块设计 (3)3.2.2取运算数模块 (3)3.2.3计算模块 (4)3.2.4结果处理模块 (5)3.2.5输出模块 (5)3.2.6错误处理模块 (6)4 程序调试 (7)4.1 运行界面分析 (7)4.2 调试过程及分析 (7)5 心得体会 (8)5.1 设计体会 (8)5.2 系统改进 (8)参考文献 (10)附录 (11)实现加减乘除四则运算的计算器1 设计目的汇编语言是继机器语言后出现的计算机程序设计语言,是计算机所能提供给用户使用的最快而又最有效的语言,也是能够利用计算机所有硬件特征并能够直接控制硬件的惟一语言。
因而了解之一语言的特性,并熟练掌握这一语言并应用于开发中便是计算机专业学生所必需掌握的技能之一。
本课程设计通过加减乘除四则运算计算器的设计,增强对于汇编语言寄存器、指令、伪指令、中断等的理解。
可通过编写的汇编程序完成基本的加减乘除四则运算。
主要功能:能实现加减乘除的计算;该程序接受的是16进制数;执行时,需在文件名后直接跟上计算表达式,如在命令提示符下执行结果如下:C:\tasm>js 3+252 概要设计2.1 系统总体分析四则运算计算器应当实现对用户输入表达式的处理。
根据用户输入的表达式,完成加减乘除四则运算。
程序自动判定表达式输入,并完成对于输入的16进制数的转换,同时计算结果并以10进制数输出。
对于异常情况程序应当进行处理,保证程序的正确运行。
设计一个计算器,在DOS界面下输入<程序名> <表达式>可直接输出运算结果。
例如在DOS界面中输入JS 3+6,可直接输出9。
程序接受16进制数输入,以十进制数输出运算结果。
对于输出错误情况,程序自动给出错误提示,若输入的格式有误,程序给出“JS <Expression> [10]”(即输入样例)提示,若输入的表达式有误,程序给出“Error in expression !”(即表达式错误)提示。
汇编语言课程设计四则运算计算器

*******************实践教学*******************兰州理工大学技术工程学院2013年春季学期汇编语言实训课程设计题目:四则运算计算器专业班级:计算机科学与技术姓名:___郭利强_____学号: 11730108指导教师:刘树群成绩:计算机科学与技术专业(11级)汇编语言实训课程设计任务书题目:四则运算计算器班级: 11计算机科学与技术1班学生姓名:郭利强学号: 11730108 题目类型:软件工程(R)指导教师:刘树群一.题目简介四则运算计算器,主要是为了解决数学中的加、减、乘、除四则运算的问题。
通过该题目的设计过程,可以培养学生结构化程序设计的思想,加深对汇编语言基本语言要素和流程结构的理解,针对汇编语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。
得到软件工程的综合训练,提高解决实际问题的能力。
二.设计任务1、查阅文献资料,一般在5篇以上;2、要求可以进行四则运算;3、完成软件结构设计和算法设计;4、完成系统的软件开发和测试工作;5、撰写设计说明书;6、做好答辩工作。
三.主要内容、功能及技术指标1、实现功能及指标:①使用Win32的窗口程序模式,实现四则运算程序的设计与开发;②界面友好。
2、问题分析及解决方案框架确定:充分地分析和理解问题本身,弄清要求做什么。
在确定解决方案框架过程中,综合考虑系统功能,考虑怎样使系统结构清晰、合理、简单和易于调试。
最后确定每个过程和函数的简单功能,以及过程(或函数)之间的调用关系,并画出函数之间的调用关系图。
3、详细设计和编码:定义相应的存储结构,确定各个函数的算法,并画出流程图,在此基础上进行代码设计,每个明确的功能模块程序一般不超过200行,否则要进一步划分。
4、上机前程序静态检查:上机前程序静态检查可有效提高调试效率,减少上机调试程序时的无谓错误。
静态检查主要有两种途径:用一组测试数据手工执行程序;通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑。
汇编语言简单计算器程序课程设计报告

汇编语言课程设计报告( 2010 -- 2011 年度第 2 学期)课题名称: 实现加减乘除四则运算的计算器专业 计算机科学与技术学生姓名 汤浩军班级 B 计算机091学号 0910704117指导教师 王 志 宏完成日期2011年6月24日目录1设计目的 (1)2概要设计 (2)2.1 系统总体分析 (2)2.2 主模块框图及说明 (2)3 详细设计 (4)3.1 主模块及子模块说明 (4)3.2 各模块详细设计 (4)4.程序调试 (6)4.1 运行界面分析 (6)4.2 算法的分析 (6)4.3 调试过程及分析 (6)5小结 (7)5.1 设计总结 (7)参考文献 (8)源程序清单 (9)1设计目的通过本次的课程设计,加深对汇编语言的了解,应用《汇编语言程序设计教程》等所学相关知识及查阅资料,完成加减乘除计算器的设计,以达到理论与实践更好的结合,进一步提高自身的水平和对汇编语言的认识。
2概要设计2.1 系统总体分析本次设计的加减乘除四则运算的计算器,主要是为了解决数学中的加、减、乘、除四则运算的问题。
由于在设计过程中考虑到了可能会多次计算数据,为此本次课程设计的这个计算器可以一次运行,多次使用。
2.2 主模块框图及说明本程序的功能结构图如图2-1:图 2-1功能结构图程序流程图如图2-2:图2-2流程图3 详细设计3.1 主模块及子模块说明主模块:主要完成程序的主体框架结构,提供人-程序的交互。
子模块:主要完成对数据的加工,处理。
3.2 各模块详细设计主模块:首先提供一个主界面,提示用户按要求输入具体的数据和所要进行的操作,输入完毕后给出结果。
如果输入过程中发现非法输入,则立即给与提示,程序自动刷新界面,提示继续输入。
整个过程按“ESC”结束。
流程图如下图3-1:图3-1 主模块流程图子模块:完成对数据的进一步加工处理,转换格式并得出结果。
首先根据输入调用对应的“+”、“-”、“*”、“/”四大函数模块,这是本程序的核心模块,其他部分的一些小模块都是为这几大模块服务的,大致的流程图如下图3-2:Y图3-2 子模块流程图4.程序调试4.1 运行界面分析运行界面如图4-1图4-1 运行界面在NUM1这一行会提示输入第一个数据,NUM2这一行提示输入第二个数据,输入完成两个数据后程序会提示允许输入运算符,输入无误后在RESULT行显示结果。
四则运算计算器

前言本次课程设计的题目是用汇编语言实现一个简单的计算器,要求:编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。
计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。
通过使用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用。
本次课程设计以实现一个基本功能完善,界面友好,操作简便易行的计算器为最终目的。
通过对具有加减乘除基本功能的计算器的设计实现,学会使用汇编语言实现输入输出模块的设计,模块合理调用的设计,加减乘除运算的判断以及退出程序的判断的设计。
通过对各种指令的合理使用,熟悉并加深对各种指令的用法。
学会使用汇编语言设计各个功能模块。
当实现各个程序模块后,学会通过程序的调用最终实现一个具有基本计算功能的简单计算器。
1中文摘要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。
运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。
设计当用户根据提示信息输入一个算式后,按下enter键或是‘=’符号键时,程序依据输入的算式进行计算,并将结果显示在屏幕上。
如果用户输入错误,则返回,提示信息让用户重新输入算式,当用户按下Q或q键时退出程序。
在各个子功能模块设计好的情况下,通过主题模块的合理调用,最终实现一个具有简单运算功能的计算关键字:计算器、四则运算、进位、错位、清屏目录1系统分析 -------------------------------------------------2系统总体设计----------------------------------------------3详细设计-------------------------------------------------- 4统测试 ---------------------------------------------------5软件使用说明书 ------------------------------------------- 设计总结----------------------------------------------------参考文献----------------------------------------------------致谢———————————————————————————————————31.系统分析本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。
总汇编语言程序设计————计算器

课程设计说明书题目: 表达式计算器学号:41212241班级: 计算机创新实验班姓名:廖福轩目录一.设计内容 (2)二.设计方案 (3)1.主程序模块. (3)2.赋权值模块. (3)3.加减乘除运算子程序模块. (3)4.调用赋权宏子程序模块. (3)5.回车换行宏模块. (3)6.9号功能显示字符串宏模块. (2)三.设计框图 (3)四.程序代码 (4)五.运行结果 (11)六.设计总结 (11)计算器汇编语言程序设计一.设计内容从键盘输入一个十进制两位数的四则运算表达式,如23*56-(8*19)/6+67-8=,编程计算表达式的值,输出十进制结果(有可能是三位或四位十进制),+-*/位置任意。
并要求程序能反复执行直道对“还要继续吗?(y/n)”之类的提示回答“n”或“N”为止。
四则运算主要包括以下几个模块:(1)主程序模块.(2)赋权宏模块.(3)加减乘除运算子程序模块.(4)调用赋权宏子程序模块.(5)回车换行宏模块.(6)9号功能显示字符串宏模块.二.设计方案1.主程序模块.主程序初始化数据段,调用显示宏show显示界面,输入字符或数字并判断,调用子程序dyfq调用赋权宏fq为符号赋权,从而判断优先级,调用加减乘除运算子程序ys对判断出的相应运算符进行运算,输出运算结果,判断是否继续,继续则返回输入,不继续则退出程序.2.赋权宏模块.通过定义宏fq,定义了变元a,b进行参数传递,并使用替换运算符&使变元a与标号s对应.接着给对应的符号赋予权值,将其权值存入ch中.3.加减乘除运算子程序模块.运算模块实现了将ax入栈保存,然后将ax,bx赋值为0,判断cl中的符号是否为乘号*,若为乘号*则将number中的数字与其下一位的数字相乘,并把结果存入该位置,类似的若不为乘号*则接着判断是否为除号/,若为除号/则进行除法运算,然后判断是否为加法,为加法则进行加法运算,接着判断是否为减法,为减法则进行减法运算并将结果存入当前的计算的第二个数的位置.4.调用赋权宏子程序模块.该模块实现了调用赋权宏fq为(,),*,/,+,-,=等符号分别赋权值为5,1,4,4,3,3,0.从而可以通过设定的权值来判断优先级.5.回车换行宏模块.通过2号功能的输出功能,将0dh赋予dl输出,再调用2号功能,将0ah赋予dl输出,从而实现回车换行功能.6.9号功能显示字符串宏模块.通过定义宏show,用9号显示功能,通过变元str将字符串显示出来。
计算机汇编语言实验报告

计算机汇编语言实验报告一、实验目的本实验旨在通过编写计算机汇编语言程序,加强对计算机组成原理和汇编语言的理解,同时熟悉实际编写和调试过程。
二、实验内容1.用汇编语言编写一个简单的计算器程序,实现加法和减法操作。
2.编译并运行程序,测试其功能的正确性。
3.运用调试工具进行程序的调试,检查代码的运行流程。
三、实验步骤1.确定程序功能和设计思路:本次实验的目标是编写一个计算器程序,能够对两个数进行加法和减法操作。
我们可以通过定义一些操作码来表示不同的操作,再通过输入不同的操作码来执行相应的操作。
2.编写汇编语言程序:首先,需要定义一些变量和常量来存储输入的数和操作码。
然后,使用汇编语言的运算指令和控制指令来实现加法和减法操作,并将结果存储到指定的变量中。
最后,使用输出指令来显示结果。
3.编译并运行程序:将汇编语言程序编译为机器码,并通过计算机的指令集执行程序。
4.调试程序:利用调试工具,逐步执行程序,检查代码的运行流程和结果的正确性。
如有错误,进行适当的修改和调试。
5.测试功能和性能:使用不同的数和操作码进行测试,验证程序的功能和正确性。
四、实验结果经过编写、编译和调试,我们成功实现了一个简单的计算器程序。
程序能够根据输入的操作码,对两个数进行加法和减法操作,并将结果显示出来。
经过多次测试,程序的功能、正确性和性能都符合预期要求。
五、实验感想通过本次实验,我们对计算机组成原理和汇编语言有了更深入的理解。
在编写程序的过程中,我们发现汇编语言相比高级语言更加底层,需要考虑更多的细节和机器指令的使用。
同时,我们也意识到了调试的重要性,调试工具能够帮助我们分析和修正代码的错误,提高程序的质量。
六、实验总结通过本次实验,我们对计算机汇编语言的应用有了更深入的了解。
我们掌握了汇编语言程序的基本结构和语法规则,学会了使用汇编语言指令进行计算和控制。
同时,我们也提升了调试和测试的能力,加深了对计算机组成原理和汇编语言的理解。
汇编计算器程序实验报告

《汇编语言程序设计》综合程序设计实验报告题目:计算器一、项目简介在我们生活中无时不刻不用到计算,虽说计算并不是很麻烦,但有的时候复杂的运算仍需要花费我们大量的时间去解决。
所以要有这样一个程序解决这个问题。
基于这个目的,而且在这个学期中,我们又接触到了汇编语言,运用汇编语言编写了计算器,来解决这个实际并且经常遇到的问题。
改程序主要针对加减乘除运算,可以进行相对复杂的问题,包含括号的相关运算。
该问题主要注意四则运算的优先级问题:惩处运算比加减运算优先级高,统计运算按从左到右的顺序计算,含有括号是应该先计算括号里面的内容。
二、小组成员具体分工徐其仲:调试汇编语言环境,设计汇编程序功能李秦:实现程序功能,撰写实验报告三、需求分析与设计问题:利用汇编语言编写计算器内容:从键盘输入一个四则运算表达式,按=号输出计算结果,并当结束时询问:是否继续?如果按q或Q,则退出,按其余任意键则继续。
计算器主要包括以下几个模块:(1)主程序模块主程序模块首先实现调用子程序clear清屏,初始化数据段,调用显示宏show显示界面,将寄存器ax,bx,cx,dx初始化赋初值为0,调用回车换行宏,输入字符或数字并判断调用子程序dyfq调用赋权宏fq为符号赋权,从而判断优先级,调用加减乘除子程序match对判断出的相应运算符进行运算,输出运算结果,判断是否继续,继续则返回输入,不则退出程序。
(2)赋权宏模块通过定义宏fq,定义了变元a,b进行参数传递,并使用替换运算符&使变元a与标号s对应,接着给对应的符号赋予权值,将其权值存入ch中。
(3)加减乘除运算子程序模块运算模块实现了将ax入栈保存,然后将ax,bx赋值为0,判断cl中的符号是否为乘号,若为乘号,则将number中的数字与其下一位的数字相乘,并把结果存入该位置。
类似的若不为乘号则接着判断。
(4)调用赋权宏子程序模块该模块实现了赋权宏fq为(,),*,、,+,-,=等符号分别赋权值为5,1,4,4,3,3,0.从而可以通过设定的权值来判断优先级(5)清屏子程序模块本模块先将即将用到的ax,bx,cx,dx寄存器入栈保存,通过ah=06h屏幕上卷功能,用bh=07h将屏幕设置为黑底白字,给dh,dl赋值将其清屏位置设定在30行80列范围,从而实现了清屏功能,然后再讲ax,bx,cx,dx寄存器出栈(6)回车换行宏模块通过2号功能的输出功能,将0dh赋予dl输出,再调用2号功能,将0ah 赋予dl输出,从而实现回车换行功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言课程设计报告( 2011 -- 2012 年度第 2 学期)实现加减乘除四则运算的计算器专业 计算机科学与技术 学生姓名班级学号指导教师完成日期目录目录错误!未定义书签。
1 概述错误!未定义书签。
设计目的错误!未定义书签。
设计内容错误!未定义书签。
2 系统需求分析错误!未定义书签。
系统目标错误!未定义书签。
主体功能错误!未定义书签。
开发环境错误!未定义书签。
3 系统概要设计错误!未定义书签。
系统的功能模块划分错误!未定义书签。
系统流程图错误!未定义书签。
4系统详细设计错误!未定义书签。
5 测试错误!未定义书签。
测试方案错误!未定义书签。
测试结果错误!未定义书签。
6 小结错误!未定义书签。
参考文献错误!未定义书签。
附录错误!未定义书签。
附录源程序清单错误!未定义书签。
实现加减乘除四则运算的计算器1 概述设计目的本课程设计是在学完教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。
设计内容能实现加、减、乘、除的计算;该程序接受的是16进制数;执行时,需要在文件名后直接跟上计算表达式,如在命令提示符下执行结果如下:c:\tasm>js 3+252 系统需求分析系统目标本次汇编语言课程设计的最终目的是要实现一个简单加减乘除四则运算的计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。
比如,十进制数的加减乘除四则运算。
我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。
此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。
主体功能系统分析主要包括设计的功能分析和系统的流程,功能分析放在首位,每一个软件都要能满足一定的功能才有使用价值。
根据功能需求来创建应用程序。
本设计的功能如下:1、输入2个数,先判断是加减运算还是乘除运算,再进行计算2、判断符号是否为运算符3、回车为换行符4、用十进制或十六进制输出运算结果开发环境集成环境3 系统概要设计系统的功能模块划分本题目实现的模块图如图3-1所示图3-1 概要模块界面设置主要实现确定界面样式的功能,以菜单形式显示。
选择算法设置用于选择加、减、乘、除法来进行运算。
十进制转换设置应用十进制的转换算法来处理加、减、乘、除法四则运算。
系统流程图图四则运算计算器执行过程流程图4系统详细设计界面设置通过定义数据段,利用09H显示出功能列表。
通过定义数据段,以字符串的形式输入每个提示信息,利用09H键盘输入并回显命令显示每一个功能提示,是计算器的功能列表有序清晰的显示在屏幕上。
选择算法设置首先选择要进行的四则运算,若选择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,将其依次显示即为商。
十进制转换设置要完成十进制转换成十六,一般采用除十六取余法来完成,其大致过程如下:将待转换的数除以16得到第一个商和余数,此第一个余数就是所求的十六进制数的各位,再用第一个商除以16,得到第二个商和余数,此第二个余数就是所求十六进制数的十位,重复这一过程直至商为0,此时的余数就是所求十六进制数的最高位。
在内存中分配一缓冲区,用来存放以上分离出来的使十进制数的每一位,然后再逐个转换成ASCII码,转换成ASCII码的过程很简单,就是给每个十六进制位加上30H即可,最后送显示器输出。
5 测试测试方案对程序源代码进行功能调试和功能验证。
程序代码运行成功后,分别检验测试其加、减、乘、除功能,并对结果进行分析。
当用户选择0时,输入Y或N决定是否退出程序。
测试结果输入数字进行加减乘除运算,计算结果如下图所示:图计算结果测试结束后,退出程序,如下图所示:图退出程序6 小结程序的主要功能是实现四则运算,整个程序中主要分为,输入算式,加法,减法,乘法,除法和以十进制显示结果这几个部分。
本程序基本实现了四则运算的功能,但还没能实现带有括号的四则运算,还有在除法运算中不能运算较大的数,会产生溢出现象。
一开始的时候自己编出来的程序有很多问题,尤其是在循环程序上,因此查阅了不少资料,也请教了好几个同学帮着修改,调试了好久才能正常运行。
由于能力有限,程序还是有不完美的地方。
这次的综合实验让我对汇编有了更深刻的认识,对各种指令有了进一步的理解。
[1]刘其明.汇编语言程序设计教程. 徐州:中国矿业大学出版社,附录源程序清单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*2---*',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。