汇编语言课程设计四则运算计算器..
- 格式:doc
- 大小:90.00 KB
- 文档页数:17
课程设计说明书题目: 表达式计算器学号:班级: 计算机创新实验班姓名:廖福轩目录一.设计内容 (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将字符串显示出来。
四则运算计算器设计说明书一、设计目标本次计算器的程序设计,通过使用JAVA中的AWT包和Swing包的类库设计图形界面的计算器。
此计算器能够完成加减乘除的四则混合运算。
利用面向对象程序设计的思想,将各个组件的事件响应分别用不同的方式表达出来,并且使用了图形界面中的事件委托机制来处理事件响应。
二、设计流程1.分析该计算器需要完成的功能。
用户能够完成添加负号的四则混合运算,开方,取倒数,并且计算器能够自动识别运算符的优先级,根据用户输入的运算表达式,自动计算出相应的结果。
同时还完成了计算器中C按钮清屏功能和Backspace退格键。
2. 考虑异常处理。
(1)当输入的表达式中出现除零的操作,显示框将显示“Infinity(无穷大)”。
(2)当输入的表达式错误时,将弹出提示框显示“表达式错误请重新输入”(3)当计算器的显示文本框里为没有输入内容时直接点击等号按钮3. 编码实现计算器的功能。
(1)新建相关的文件。
(2)引入JAVA中相关的包。
(3)定义相关的变量,创建相关组件,并对组件的属性进行设置。
(4)对所创建的组件进行布局,完成界面的实现。
(5)为各个组件添加事件监听器。
(6)重写事件接口ActionListener的方法public voidactionPerformed(ActionEvent e)。
(7)为各个组件编写事件代码,完成每个按钮的不同功能。
三、程序截图四、程序代码import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.GridLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JTextField;public class Calc extends JFrame implements ActionListener { JPanel topPanel = null;JPanel midPanel = null;JPanel bottomPanel = null;JTextField tResult = null;JButton backspaceButton = null;JButton ceButton = null;JButton cButton = null;JButton button1 = null;JButton button2 = null;JButton button3 = null;JButton button4 = null;JButton button5 = null;JButton button6 = null;JButton button7 = null;JButton button8 = null;JButton button9 = null;JButton button0 = null;JButton buttonDiv = null;JButton buttonPlus = null;JButton buttonMinus = null;JButton buttonMul = null;JButton buttonSqrt = null;JButton buttonMod = null;JButton buttonPM = null;JButton buttonX = null;JButton buttonPoint = null;JButton buttonEquals = null;StringBuffer str = new StringBuffer();boolean isDouble = false;// 是否为实数int opFlag = -1;static double t1 = 0, t2 = 0, t3 = 0, result = 0;static int opflag1 = -1, opflag2 = -1, flag = 0, resflag = 1;int preOp, currentOp = 0;// 标准位double op1 = 0, op2 = 0;// 操作数double n3;// 取得屏幕对象Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); // 取得屏幕的宽度int width = screenSize.width;// 取得屏幕的高度int heigth = screenSize.height;public Calc() {tResult = new JTextField("0.");tResult.setColumns(26);tResult.setHorizontalAlignment(JTextField.RIGHT);topPanel = new JPanel();topPanel.add(tResult);backspaceButton = new JButton("Backspace");backspaceButton.addActionListener(this);ceButton = new JButton("CE");ceButton.addActionListener(this);cButton = new JButton("C");cButton.addActionListener(this);midPanel = new JPanel();midPanel.add(backspaceButton);midPanel.add(ceButton);midPanel.add(cButton);bottomPanel = new JPanel(new GridLayout(4, 5, 3, 3));button7 = new JButton("7");button7.addActionListener(this);bottomPanel.add(button7);button8 = new JButton("8");button8.addActionListener(this);bottomPanel.add(button8);button9 = new JButton("9"); button9.addActionListener(this); bottomPanel.add(button9);buttonDiv = new JButton("/"); buttonDiv.addActionListener(this); bottomPanel.add(buttonDiv);buttonSqrt = new JButton("sqrt"); buttonSqrt.addActionListener(this); bottomPanel.add(buttonSqrt);button4 = new JButton("4"); button4.addActionListener(this); bottomPanel.add(button4);button5 = new JButton("5"); button5.addActionListener(this); bottomPanel.add(button5);button6 = new JButton("6"); button6.addActionListener(this); bottomPanel.add(button6);buttonMul = new JButton("*"); buttonMul.addActionListener(this); bottomPanel.add(buttonMul);buttonMod = new JButton("%"); buttonMod.addActionListener(this); bottomPanel.add(buttonMod);button1 = new JButton("1"); button1.addActionListener(this); bottomPanel.add(button1);button2 = new JButton("2"); button2.addActionListener(this); bottomPanel.add(button2);button3 = new JButton("3"); button3.addActionListener(this); bottomPanel.add(button3);buttonMinus = new JButton("-");buttonMinus.addActionListener(this);bottomPanel.add(buttonMinus);buttonX = new JButton("1/x");buttonX.addActionListener(this);bottomPanel.add(buttonX);button0 = new JButton("0");button0.addActionListener(this);bottomPanel.add(button0);buttonPM = new JButton("+/-");buttonPM.addActionListener(this);bottomPanel.add(buttonPM);buttonPoint = new JButton(".");buttonPoint.addActionListener(this);bottomPanel.add(buttonPoint);buttonPlus = new JButton("+");buttonPlus.addActionListener(this);bottomPanel.add(buttonPlus);buttonEquals = new JButton("=");buttonEquals.addActionListener(this);bottomPanel.add(buttonEquals);this.setLayout(new BorderLayout());this.add(topPanel, "North");this.add(midPanel, "Center");this.add(bottomPanel, "South");this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(310, 225);this.setResizable(false);// 设置窗体出现在屏幕的中央this.setLocation((width - this.getWidth()) / 2,(heigth - this.getHeight()) / 2);this.setVisible(true);}/*** @param args*/public static void main(String[] args) {new Calc();}@Overridepublic void actionPerformed(ActionEvent e) {String s = e.getActionCommand().trim();if (s.equals("CE")) {// 如果是CE则清除文本框tResult.setText("0.");} else if (s.equals("Backspace")) {if (!tResult.getText().trim().equals("0.")) {// 如果文本框中有内容if (str.length() != 1 && str.length() != 0) {tResult.setText(str.delete(str.length() - 1, str.length()).toString());} else {tResult.setText("0.");str.setLength(0);}}op2 = Double.parseDouble(tResult.getText().trim());} else if (s.equals("C")) {// 如果是C删除当前计算tResult.setText("0.");op1 = op2 = 0;str.replace(0, str.length(), " ");preOp = currentOp = 0;} else if (s.equals("1/x")) {// 如果按键为1/x则将文本框中的数据为它的倒数String temp = tResult.getText().trim();double dtemp = Double.parseDouble(temp);tResult.setText("" + 1 / dtemp);} else if (s.equals("sqrt")) {// 如果按键为sqrt则将文本框中的内容求平方根String temp = tResult.getText().trim();double dtemp = Double.parseDouble(temp);tResult.setText("" + Math.sqrt(dtemp));} else if (s.equals("+")) {str.setLength(0);if (currentOp == 0) {preOp = currentOp = 1;op2 = 0;tResult.setText("" + op1);} else {currentOp = preOp;preOp = 1;switch (currentOp) {case 1:op1 += op2;tResult.setText("" + op1);break;case 2:op1 -= op2;tResult.setText("" + op1);break;case 3:op1 *= op2;tResult.setText("" + op1);break;case 4:op1 /= op2;tResult.setText("" + op1);break;}}} else if (s.equals("-")) {str.setLength(0);if (currentOp == 0) {preOp = currentOp = 2;// op1=op2;op2=0;tResult.setText("" + op1);} else {currentOp = preOp;preOp = 2;switch (currentOp) {case 1:op1 = op1 + op2;tResult.setText("" + op1);break;case 2:op1 = op1 - op2;tResult.setText("" + op1);break;case 3:op1 = op1 * op2;tResult.setText("" + op1);break;case 4:op1 = op1 / op2;tResult.setText("" + op1);break;}}} else if (s.equals("*"))// *{str.setLength(0);if (currentOp == 0) {preOp = currentOp = 3;// op1=op2;op2=1;tResult.setText("" + op1);// op1=op2;} else {currentOp = preOp;preOp = 3;switch (currentOp) {case 1:op1 = op1 + op2;tResult.setText("" + op1);break;case 2:op1 = op1 - op2;tResult.setText("" + op1);break;case 3:op1 = op1 * op2;tResult.setText("" + op1);break;case 4:op1 = op1 / op2;tResult.setText("" + op1);break;}}} else if (s.equals("/"))// /{str.setLength(0);if (currentOp == 0) {preOp = currentOp = 4;// op2=1;tResult.setText("" + op1);// op1=op2;} else {currentOp = preOp;preOp = 4;switch (currentOp) {case 1:op1 = op1 + op2;tResult.setText("" + op1);break;case 2:op1 = op1 - op2;tResult.setText("" + op1);break;case 3:op1 = op1 * op2;tResult.setText("" + op1);break;case 4:op1 = op1 / op2;tResult.setText("" + op1);break;}}} else if (s.equals("="))// ={if (currentOp == 0) {str.setLength(0);tResult.setText("" + op2);} else {str.setLength(0);currentOp = preOp;switch (currentOp) {case 1:op1 = op1 + op2;tResult.setText("" + op1);break;case 2:op1 = op1 - op2;tResult.setText("" + op1);break;case 3:op1 = op1 * op2;tResult.setText("" + op1);break;case 4:op1 = op1 / op2;tResult.setText("" + op1);break;}currentOp = 0;op2 = 0;}} else if (s.equals(".")) {isDouble = true;if (tResult.getText().trim().indexOf('.') != -1);else {if (tResult.getText().trim().equals("0")) {str.setLength(0);tResult.setText((str.append("0" + s)).toString());}// else// if(tResult.getText().trim().equals("")){}//如果初时显示为空则不做任何操作else {tResult.setText((str.append(s)).toString());}}} else if (s.equals("0"))// 如果选择的是"0"这个数字键{if (tResult.getText().trim().equals("0.")) {} else {tResult.setText(str.append(s).toString());op2 = Double.parseDouble(tResult.getText().trim());}} else if (s.equals("%"))// 如果选择的是"0"这个数字键{} else {tResult.setText(str.append(s).toString());op2 = Double.parseDouble(tResult.getText().trim());if (currentOp == 0)op1 = op2;}}}。
目录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行显示结果。
汇编语言课程设计实验报告一、课程设计目的《汇编语言程序设计》是计算机专业一门重要的核心课程,也是一门实践性很强的课程,而课程设计则是其中一个重要的应用实践环节。
本次课程设计的目的是提高分析问题、解决问题的能力以及实际动手能力,进一步加深对汇编语言程序设计基本理论的理解,熟练掌握汇编语言程序上机调试的方法技巧、结构化程序设计技术及高级汇编语言技术,能编写较复杂的应用程序,为学习后继课程打下扎实的基础二、实验环境编译机器:IBM兼容PC操作系统:Windows XP -SP2 中文版编译工具:MASM 5.0三、课程设计内容1、编写一个有符号多位十进制数的四则运算计算器程序,所输入的算式如下例所示:-278+32=-132――12=11*-32=-1234/-18=要求程序能接收键入的算式,在接收到‘=’号时,计算并以有符号十进制数的形式显示结果,然后允许用户继续键入算式。
如果键入算式后再键入‘.’,则显示结果并结束整个程序。
(‘/’为整除)程序设计框图:程序源代码:2、已知一个由英语单词组成的字符串已按字典序排好,每个单词以空格符为结束,该串的首二字节为16位无符号二进制数,用以说明串的长度。
试编程能从键盘上输入单词(以空格字符为结束),若字符串中没有该单词,则将该单词插入该串适当的位置,使其仍保持字典序,并修改串长度,显示单词在串中位置及串长度;若字符串中有该单词,则显示字符串中所有包含该单词的单词,及其在字符串中的位置。
程序设计框图:程序代码:DATA SEGMENT; DICTIONARY 字典字符串,首两个字节为 16 位无符号二进制数,说明字符串长度。
DICTIONARY DB 00,16H,"add an book dad egg "DB 100H DUP(20H) ; 空的缓冲区。
MSG_INTRO DB "Input the Word to Search : ","$"MSG_NOTFOUND DB "Not Found, Now Insert it . ",0AH,0DH,"$"MSG_NEWDICT DB 0AH,0DH,"New Dictionary : ","$"MSG_FOUND DB 0AH,0DH,"Found Word in Dictionary : ","$"MSG_POSITION DB 0AH,0DH,"Position : ","$"MSG_DICTLENGTH D B 0AH,0DH,"New Dictionary Length : ","$"MSG_NEWLINE DB 0AH,0DH,"$"BUFFER DB 10H DUP(20H) ; BUFFER 用于保存需要查询的单词。
汇编程序大作业云南大学软件学院实验报告指导教师 (签名):实验内容:1.设计一个功能完善的四则运算器:①程序有友好的运行界面;②可以方便的输入输出2,10,16进制数据(要求可以处理4位的数据);③可以方便的对数据进行四则运算;④要求程序能够处理基本的错误信息;⑤程序要求菜单控制;⑥其他程序简介:该程序采用了主程序、子程序、宏相结合的编写方式,通过主程序调用了加、减、乘、除的子程序,在这四个子程序中有分别调用了二、十、十六进制输入输出、进制间转化的子程序。
在数值转化为ASCII码的部分,定义了宏进行调整输出。
程序实现了16位的二进制、4位的十进制、4位的十六进制的加、减、乘、除运算,并可以通过用户的选择将其转化为其他相应的进制。
其中乘法运算的进制转化功能尚不完善,当运算结果超过4位时不能正确的将结果进行输出并进行进制转化。
子过程:addition:加法部分subtraction:减法部分multiplication:乘法部分division:除法部分b_in:二进制输入hd_in:十六进制、十进制输入b_out:二进制输出btod:二进制转化十进制并输出both:二进制转化十六进制并输出宏:btth:将数值转化为ASCII码保存算法说明:二进制计算时,要求输入0和1,从高到低为输入,将先输进的数*2+后输入的数,保存到寄存器中,如 1011则按((1*2+0)*2+1)*2+1十进制计算时,要求输入0-9的整数,从高到低输入,将先输进的数*10+后输进的数,保存到寄存器中,如9817 则按((9*10+8)*10+1)*10+7十进制计算时,要求输入0-F的整数,从高到低输入,将先输进的数*10H+后输进的数,保存到寄存器中,如AD17 则按((A*10H+D)*10H+1)*10H+7通过add、sub、mul、div等汇编指令进行计算。
二进制输出,从高位到低位按位依次保存到dl中,加30h后输出十进制输出,将结果分别除以10000、(上一步余数除)1000、(上一步余数除)100、(上一步余数除)10将商分别加30h后输出,将最后的余数加上30h后输出十六进制输出,从高到低每四位依次输出与9比较,大于9加37h调整,小于9加30h 调整程序流程及实验结果:主程序部分:提示用户进行运算符号的选择,并进行子程序部分的调用四则运算部分流程:四则运算的加、减、乘、除四部分子程序的流程大致相同,此处采用同一个流程图表示,该部分提示用户进行进制选择,跳转的相应位置并进行相应的运算,调用输入输出子程序,对结果进行进制转化二进制输入流程:该部分进行二进制数的输入,通过移位将先输入的数保存到高位,后输入的数保存到低位,将最终结果保存到bx中二进制输出:该部分将运算结果以2进制的形式输出,通过加30h将数值转化为ASCII码输出十、十六进制数的输入该部分实现十及十六进制数的输入,将最终结果保存到bx中;二进制转十进制并输出该部分通过将得到的二进制数求商取余的方式将最高位的取到商中并输出;二进制转十六进制:该部分通过移位的方式将二进制数转化为16进制输出,其中判断了所输出值与9的大小关系,大于9则加37h调整,小于9则加30h调整加法部分:二进制加法,并将结果转化为10进制二进制加法,并将结果转化为16进制:十进制加法,并将结果转化为二进制:十进制加法,并将结果转化为16进制:十六进制加法,并将结果转化为二进制:十六进制加法,并将结果转化为十进制减法部分:二进制减法,并将结果转化为十进制输出:二进制减法并将结果转化为十六进制输出:十进制减法,并将结果转化为二进制输出:十进制减法,并将结果转化为十六进制输出:十六进制减法,并将结果转化为二进制输出:十六进制减法,并将结果转化为10进制输出:乘法部分:二进制乘法,并结果转化为10进制输出:二进制乘法并将结果转化为16进制输出:十进制乘法并将结果转化为二进制输出十进制乘法,并将结果转化为16进制输出:十六进制乘法,并将结果转化为二进制输出:十六进制乘法,并将结果转化为十进制输出:除法部分:二进制除法,并将结果转化为十进制输出:二进制除法,并将结果转化为16进制输出:十进制除法,并将结果转化为二进制输出:十进制除法,并将结果转化为16进制输出:十六进制除法,并将结果转化为二进制输出:十六进制除法,并将结果转化为10进制输出:代码:data segmentnote1 db 'Input a-->add,b-->sub,c-->mul,d--div',0ah,0dh,'$'note2 db 0ah,0dh,'Input a-->binary,b-->decimal,c--hexadecimal',0ah,0dh,'$' note3 db 0ah,0dh,'Input addend' ,0ah,0dh,'$'note4 db 0ah,0dh,'Input another addend', 0ah,0dh,'$'note5 db 0ah,0dh,'The answer is',0ah,0dh,'$'note6 db 0ah,0dh,'Change the answer to a-->decimal,b-->hexadecimal,any other key-->exit',0ah,0dh,'$'note7 db 0ah,0dh,'Change the answer to a-->binary,b-->hexadecimal,any other key-->exit',0ah,0dh,'$'note8 db 0ah,0dh,'Change the answer to a-->binary,b-->decimal,any other key-->exit',0ah,0dh,'$'note9 db 0ah,0dh,'Input minuend', 0ah,0dh,'$'note10 db 0ah,0dh,'Input subtrahend', 0ah,0dh,'$'note11 db 0ah,0dh,'Input multiplicand' ,0ah,0dh,'$'note12 db 0ah,0dh,'Input another multiplicand' ,0ah,0dh,'$'note13 db 0ah,0dh,'Input dividend', 0ah,0dh,'$'note14 db 0ah,0dh,'Input divisor', 0ah,0dh,'$'num dw 0num1 dw 0num2 dw 0sig db ?data endscode segmentassume ds:data,cs:codestart:mov ax,datamov ds,axlea dx,note1mov ah,09hint 21hm1:mov ah,01hint 21hcmp al,'a'je adcmp al,'b'je subtcmp al,'c'je multcmp al,'d'je divijmp m1ad:call additionjmp over计算机组成原理与汇编语言程序设计(2013)subt:call subtractionjmp overmult:call multiplicationjmp overdivi:call divisionover:mov ah,01hint 21hmov ah,4chint 21haddition proclea dx,note2mov ah,09hint 21hmov ah,01hint 21hmov sig,alcmp al,'a'je b_addcmp al,'b'je d_addcmp al,'c'je h_addjmp a_endb_add:lea dx,note3mov ah,09hint 21hcall b_inmov num,bxlea dx,note4mov ah,09hint 21hcall b_inlea dx,note5mov ah,09hint 21hmov ax,numadd bx,axcall b_out;此处存在bug,若产生进位不能进行输出,需提示用户只进行15位的运算lea dx,note6mov ah,09hint 21hmov ah,01h计算机组成原理与汇编语言程序设计(2013)int 21hcmp al,'a'je btdcmp al,'b'je bthjmp a_endbtd:lea dx,note5mov ah,09hint 21hcall btodjmp a_endbth:lea dx,note5mov ah,09hint 21hcall btohjmp a_endd_add:lea dx,note3mov ah,09hint 21hcall hd_inmov num,bxlea dx,note4mov ah,09hint 21hcall hd_inmov ax,numadd bx,axpush bxlea dx,note5mov ah,09hint 21hcall btodlea dx,note7mov ah,09hint 21hmov ah,01int 21hcmp al,'a'je dtbcmp al,'b'je dthjmp a_enddtb:lea dx,note5mov ah,09h计算机组成原理与汇编语言程序设计(2013)int 21hpop bxcall b_outjmp a_enddth:lea dx,note5mov ah,09hint 21hpop bxcall btohjmp a_endh_add:lea dx,note3mov ah,09hint 21hcall hd_inmov num,bxlea dx,note4mov ah,09hint 21hcall hd_inmov ax,numadd bx,axlea dx,note5mov ah,09hint 21hcall btoh;此处存在bug,当产生进位是,不能对进位进行输出lea dx,note8mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je htbcmp al,'b'je htdjmp a_endhtb:lea dx,note5mov ah,09hint 21hcall b_outjmp a_endhtd:lea dx,note5mov ah,09hint 21hcall btod计算机组成原理与汇编语言程序设计(2013)jmp a_enda_end:retaddition endpsubtraction proclea dx,note2mov ah,09hint 21hmov ah,01hint 21hmov sig,alcmp al,'a'je b_subcmp al,'b'je d_subcmp al,'c'je h_subjmp s_endb_sub:lea dx,note9mov ah,09hint 21hcall b_inmov num,bxlea dx,note10mov ah,09hint 21hcall b_inmov ax,numxchg ax,bxsub bx,axlea dx,note5mov ah,09hint 21hcall b_outlea dx,note6mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je btdcmp al,'b'je bthjmp s_end计算机组成原理与汇编语言程序设计(2013)d_sub:lea dx,note9mov ah,09hint 21hcall hd_inmov num,bxlea dx,note10mov ah,09hint 21hcall hd_inmov ax,numxchg ax,bxsub bx,axpush bxlea dx,note5mov ah,09hint 21hcall btodlea dx,note7mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je dtbcmp al,'b'je dthjmp s_endh_sub:lea dx,note9mov ah,09hint 21hcall hd_inmov num,bxlea dx,note10mov ah,09hint 21hcall hd_inmov ax,numxchg ax,bxsub bx,axlea dx,note5mov ah,09hint 21hcall btohlea dx,note8计算机组成原理与汇编语言程序设计(2013)mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je htbcmp al,'b'je htdjmp s_ends_end:retsubtraction endpmultiplication proclea dx,note2mov ah,09hint 21hmov ah,01hint 21hmov sig,alcmp al,'a'je b_mulcmp al,'b'je d_mulcmp al,'c'je h_mulb_mul:lea dx,note11mov ah,09hint 21hcall b_inmov num,bxlea dx,note12mov ah,09hint 21hcall b_inmov ax,nummul bxmov num1,dxmov num2,axlea dx,note5mov ah,09hint 21hmov num1,dxmov bx,dxcall b_out计算机组成原理与汇编语言程序设计(2013)mov ax,num2mov bx,axcall b_outlea dx,note6mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je m_btdcmp al,'b'je m_bthjmp m_endm_btd:lea dx,note5;此处错误,尚需修改mov ah,09hint 21hmov dx,num1mov bx,dxcall btodmov ax,num2mov bx,axcall btodjmp m_endm_bth:lea dx,note5mov ah,09hint 21hmov dx,num1mov bx,dxcall btohmov ax,num2mov bx,axcall btohd_mul:lea dx,note11mov ah,09hint 21hcall hd_inmov num,bxlea dx,note12mov ah,09hint 21hcall hd_inmov ax,nummul bxpush ax计算机组成原理与汇编语言程序设计(2013)lea dx,note5mov ah,09hint 21hpop axpush axmov bx,axcall btodlea dx,note7mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je m_dtbcmp al,'b'je m_dthm_dtb:lea dx,note5mov ah,09hint 21hpop axmov bx,axcall b_outjmp m_endm_dth:lea dx,note5mov ah,09hint 21hpop axmov bx,axcall btohh_mul:lea dx,note11mov ah,09hint 21hcall hd_inmov num,bxlea dx,note12mov ah,09hint 21hcall hd_inmov ax,nummul bxpush axlea dx,note5mov ah,09hint 21h计算机组成原理与汇编语言程序设计(2013)pop axpush axmov bx,axcall btohlea dx,note8mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je m_htbcmp al,'b'je m_htdm_htb:lea dx,note5mov ah,09hint 21hpop axmov bx,axcall b_outjmp m_endm_htd:lea dx,note5mov ah,09hint 21hpop axmov bx,axcall btodm_end:retmultiplication endpdivision proclea dx,note2mov ah,09hint 21hmov ah,01hint 21hmov sig,alcmp al,'a'je b_divcmp al,'b'je d_divcmp al,'c'je h_divjmp d_endb_div:lea dx,note13计算机组成原理与汇编语言程序设计(2013)mov ah,09hint 21hcall b_inmov num,bxlea dx,note14mov ah,09hint 21hcall b_inmov ax,numcwdxor dx,dxdiv bxmov num1,axmov num2,dxlea dx,note5mov ah,09hint 21hmov bx,num1call b_outmov cx,6l:mov dl,'.'mov ah,02hint 21hloop lmov bx,num2call b_outlea dx,note6mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je d_btdcmp al,'b'je d_bthjmp d_endd_btd:lea dx,note5mov ah,09hint 21hmov bx,num1call btodmov cx,6l4:mov dl,'.'mov ah,02hloop l4mov bx,num2 call btodjmp d_endd_bth:lea dx,note5 mov ah,09hint 21hmov bx,num1 call btohmov cx,6l5:mov dl,'.'mov ah,02hint 21hloop l5mov bx,num2 call btohjmp d_endd_div:lea dx,note13 mov ah,09hint 21hcall hd_inmov num,bxlea dx,note14 mov ah,09hint 21hcall hd_inmov ax,numcwdxor dx,dxdiv bxmov num1,ax mov num2,dx lea dx,note5 mov ah,09hint 21hmov bx,num1 call btodmov cx,6l2:mov dl,'.'mov ah,02hint 21hloop l2mov bx,num2lea dx,note7 mov ah,09hint 21hmov ah,01hint 21hcmp al,'a'je d_dtbcmp al,'b'je d_dthjmp d_endd_dtb:lea dx,note5 mov ah,09hint 21hmov bx,num1 call b_outmov cx,6l6:mov dl,'.'mov ah,02hint 21hloop l6mov bx,num2 call b_outjmp d_endd_dth:lea dx,note5 mov ah,09hint 21hmov bx,num1 call btohmov cx,6l7:mov dl,'.'mov ah,02hint 21hloop l7mov bx,num2 call btohjmp d_endh_div:lea dx,note13 mov ah,09hint 21hcall hd_inmov num,bxlea dx,note14 mov ah,09hcall hd_in mov ax,num cwdxor dx,dxdiv bxmov num1,ax mov num2,dx lea dx,note5 mov ah,09h int 21hmov bx,num1 call btohmov cx,6l3:mov dl,'.' mov ah,02h int 21hloop l3mov bx,num2 call btohlea dx,note8 mov ah,09h int 21hmov ah,01h int 21hcmp al,'a' je d_htbcmp al,'b' je d_htdjmp d_endd_htb:lea dx,note5 mov ah,09h int 21hmov bx,num1 call b_out mov cx,6l8:mov dl,'.' mov ah,02h int 21hloop l8mov bx,num2 call b_out jmp d_endd_htd:lea dx,note5计算机组成原理与汇编语言程序设计(2013)mov ah,09hint 21hmov bx,num1call btodmov cx,6l9:mov dl,'.'mov ah,02hint 21hloop l9mov bx,num2call btodjmp d_endd_end:retdivision endpb_in procxor dx,dxmov bx,2mov cx,16bin2:mov ah,1int 21hxor ah,ahsub al,30hadd dx,axmov ax,dxcmp cx,1je bin1mul bxbin1:mov dx,axloop bin2mov bx,dxretb_in endpb_out procmov ch,8mov cl,1mov dh,bhbot1:rol dx,cland dl,01hadd dl,30hmov ah,02hint 21hdec chja bot1mov ch,8mov dh,bl bot2:rol dx,cland dl,01h add dl,30h mov ah,02h int 21hdec chcmp ch,0ja bot2retb_out endpbtth macroand dx,0div bxmov cx,dxadd al,30h mov dl,almov ah,02h int 21hmov ax,cx endmbtod procmov ax,bxmov bx,10000 btthmov bx,1000 btthmov bx,100 btthmov bx,10btthadd al,30h mov dl,almov ah,02h int 21hretbtod endpbtoh procxor dx,dxmov cl,4mov dh,bh bth1:rol dx,cl cmp dl,9ja bth3add dl,30h jmp bth4 bth3:add dl,37h bth4:mov ah,2int 21hxor dl,dl dec chcmp ch,0ja bth1mov dh,bl mov ch,2mov cl,4 bth2:rol dx,cl cmp dl,9ja bth5add dl,30h jmp bth6 bth5:add dl,37h bth6:mov ah,2int 21hxor dl,dl dec chcmp ch,0ja bth2retbtoh endphd_in procxor dx,dx cmp sig,'c' jne din3mov bx,16 jmp din4 din3:mov bx,10 din4:mov cx,4 din1:mov ah,01h int 21hxor ah,ahja hin1 sub al,30h jmp hin2 hin1:sub al,37h hin2:add dx,ax mov ax,dx cmp cx,1 je din2mul bxdin2:mov dx,ax loop din1 mov bx,dx rethd_in endpcode ends end start。
四则运算计算器一、程序功能简介可以计算整数四则运算,例如:7+5*(3+4)二、课程设计要求(1)按要求在提供的框架程序源程序的基础上对程序进行修改、补充,并调试通过。
(2)修改主程序结构,使程序可以反复运算,直到选择退出为止。
(3)增加文件的输入输出功能,是计算过的式子和结果可以根据需要设置命令存储到文件中,同时也可以直接从文件中输入四则运算的式子,运算后,结果输出到原文件中。
(4)扩充程序功能,使程序适合实型数运算。
(5)增加程序的判断功能,当有非法的输入时(如字母等),给出提示信息并退出运算。
(6)扩充程序功能,使程序可以进行关系表达式(>=,>,<=,<,==等)的运算,运算结果为TRUE 或FALSE 。
在VC++6 环境下编译已经完美实现上述功能注:包含Debug 的语句如:if (Debug) printf(""); 都可以忽略,这些显示是编写工程中需要观察的信息,如果要打开,请在主菜单下输入大写的'D'。
Log:20060703 开始分析框架程序,并规划程序结构20060704 计算的核心部分基本完成,并封装成Operation()20060705 编写Menu_Sel() Do_Press() strChk() Do_File() FileCHK() Nexus() 整体功能和界面基本完成20060706 强化strChk(),增加Debug 模式,修正符号优先级问题。
20060707 郁闷,在英化程序-_-/// ...在Do_File() 增加输出文件另存功能...20060708 ....20060709 ....20060710 强化strChk(),增加结果整形识别,增加'!=' 处理,文件名非法字符校验。
最后更新20060710*//* =============================================== *//* 头文件声明*/#include <stdio.h> /* In Out printf().. */#include <math.h> /* pow(M,n) 开M^n */#include <string.h> /* strcpy... */#include <stdlib.h> /* atof... */#include <conio.h> /* getch()... */#define Max 256 /* 表达式长度定义,可以在这里调节*//* =============================================== *//* 函数声明*//* 计算字符串(不带括号的),计算的核心部分*/char*Calculate_f(char*chpString);/* 主操作过程,输入式子串,返回double 型结果*/double Operation(char*chpString);/* Source1、Source2 加起来到Destination 中*/char*AddStrings_f(char*chpDestination,char*chpSource1,char*chpSource2);/* 寻找char_to_find 在Source 中的位置,后移一位*/int FindChar(char*chpSource,char chCharToFind);/* 获取字符串的长度*/int Len_f(char*chpSource);/* 将Source 左边Length 个字符放在Destination 中*/char*Left_f(char*chpSource,char*chpDestination,int nLength);/* 将Source 右边Length 个字符放在Destination 中*/char*Right_f(char*chpSource,char*chpDestination,int nLength);/* 将Source 中从Start 开始Length 长度的字符串截下来放在Destination 中*/ char*Midstr_f(char*chpSource,char*chpDestination,int nStart,int nLength);/* 在字符串中删除一个字符del '+' */void DelChar(char*chpString,int sPos);/* 在字符串中插入一个字符*/int InsChar(char*chpString,int sPos,char sChar);/* 替换字符串中的某个字符*/void StrReplace(char*chpString,char strOld ,char strNew);/* 将实数值变为字符串*/char*Str_f(double nValue,char*chpDestination);/* 计算字符串的值,返回实数值*/double Val_f(char*chpSource);/* =============================================== *//* 主菜单... */int Menu_Sel();/* 手工输入表达式求值*/int Do_Press();/* 文件导入表达式求值*/int Do_File();/* 文件检查0 重新输入,1 继续*/int FileChk(char*FN);/* 式子的合法性检查0 含有非法字符,1 正常2 关系运算*/int StrChk(char*chpSource);/* 关系运算*/int Nexus(char strIn[]);/* 显示关于*/void Show_About();/* =============================================== *//* 全局变量声明*/int Debug=0;/* 调试信息显示开关0 不显示,1 显示*/char*TF_Info[3]={"FALSE","TURE","Error"};/* 关系运算信息*//* 将Source 左边Length 个字符放在Destination 中*/char*Left_f(char*chpSource,char*chpDestination,int nLength){*(chpDestination+--nLength+1)=0;/* 设置目标字符串最后一个为NULL*/while(nLength>=0)/* 直到目标字符串的最后一个*/{*(chpDestination+nLength)=*(chpSource+nLength--);}return chpDestination;}/* 将Source 中从Start 开始Length 长度的字符串截下来放在Destination 中*/char*Midstr_f(char*chpSource,char*chpDestination,int nStart,int nLength){chpSource+=nStart-1;/* 设置源起点*/*(chpDestination+--nLength+1)=0;/* 设置目标字符串最后一个为NULL */while(nLength>=0)/* 直到目标字符串的最后一个*/{*(chpDestination+nLength)=*(chpSource+nLength--);}return chpDestination;}/* 将Source 右边Length 个字符放在Destination 中*/char*Right_f(char*chpSource,char*chpDestination,int nLength){while(*chpSource !=0){chpSource++;}/* 将源指针移到最后*/chpSource-=nLength;/* 将源指针跳到开始复制点*/ *(chpDestination+--nLength+1)=0;/* 设置目标字符串最后一个为NULL */while(nLength>=0)/* 直到目标字符串的最后一个*/{*(chpDestination+nLength)=*(chpSource+nLength--);}return chpDestination;}/* 在字符串中删除一个字符del '+' */void DelChar(char*chpString,int sPos){char sBuf[Max];int nCount;strcpy(sBuf,chpString);for(nCount=sPos;sBuf[nCount];nCount++){sBuf[nCount]=sBuf[nCount+1];}strcpy(chpString,sBuf);}/* 在字符串中插入一个字符*/int InsChar(char*chpString,int sPos,char sChar){char sBuf[Max];int iLen;int nCount;strcpy(sBuf,chpString);iLen=strlen(sBuf);if(iLen<Max){sBuf[iLen+1]='\0';for(nCount=iLen;nCount>=sPos;nCount--){sBuf[nCount+1]=sBuf[nCount];}sBuf[sPos]=sChar;strcpy(chpString,sBuf);}elsereturn0;return1;}/* 替换字符串中的某个字符'#' to '-' */void StrReplace(char*chpString,char strOld ,char strNew){char sBuf[Max];int nCount=0;strcpy(sBuf,chpString);while(sBuf[nCount]){if(sBuf[nCount]==strOld) sBuf[nCount]=strNew;nCount++;}strcpy(chpString,sBuf);}/* 寻找char_to_find 在Source 中的位置,后移一位*/int FindChar(char*chpSource,char chCharToFind){int nPos=0;while(*(chpSource+nPos)!=0)/* 直到目标字符串的最后一个*/ {if(chCharToFind ==*(chpSource+nPos++))/* 比较.. */{return nPos;/* 返回第一个出现点,加一*/ }}return0;}/* 获取字符串的长度*/int Len_f(char*chpSource){int nRetval=0;/* 初始化长度*/while(*(chpSource+nRetval++)!=0){}/* 移动指针到Null */return--nRetval;}/* 将实数值变为字符串*/char*Str_f(double nValue,char*chpDestination){char strTmp[Max];gcvt(nValue,sizeof(double)+1,strTmp);/* 实数值转字符串*/if(strTmp[0]=='-')/* 将'-' 负号转译为'#' */{strTmp[0]='#';}strcpy(chpDestination,strTmp);if(Debug) printf("...Conversion Double to String:%f - >%s\n",nValue,chpDestination);return chpDestination;}/* Source1、Source2 加起来到Destination 中*/char*AddStrings_f(char*chpDestination,char*chpSource1,char*chpSource2){char*chpTempdest=chpDestination;while(*chpSource1!=0)/* 先把chpSource1 放入chpDestination */{*(chpTempdest++)=*(chpSource1++);}while(*chpSource2!=0)/* 在chpDestination 后继续写入chpSource2 */{*(chpTempdest++)=*(chpSource2++);}*chpTempdest=0;/* 指针位置归零*/return chpDestination;}/* 计算字符串的值,返回实数值*/double Val_f(char*chpSource){double nResult=0.;char strTmp[Max];strcpy(strTmp,chpSource);if(strTmp[0]=='#')/* 将'#' 转译为'-' 负号*/{strTmp[0]='-';}nResult=atof(strTmp);/* 字符串转为实数*/if(Debug)printf("...Conversion String to Double:%s -> %s -> %f\n",chpSource,strTmp,nResult);return nResult;}。
《汇编语言》课程设计说明书设计题目四则运算计算器的设计专业班级学号姓名指导教师起止日期成绩课程设计任务书一、设计题目:四则运算计算器的设计二、设计的主要内容:设计一个能实现加减乘除取余计算的程序。
将键盘输入的表达式预放入一缓冲区中,然后从该缓冲区的第一个字符开始读取判断,当读到一个有效的表达式时对表达式进行相应的运算后,输出用十六进制数表示的运算结果。
目标:要求该程序接受从键盘输入的十六进制数,执行相应的计算后,计算结果以十六进制数输出。
指导教师:教研室主任:1选题背景及意义运用汇编语言,实现简单计算器的一般功能.通过该程序设计,让我们熟悉并掌握DOS系统功能调方法用及BIOS系统功能调用方法,同时在程序设计过程中熟悉并掌握各种指令的应用,知道编程的具体流程,以及掌握DEBUG的一系列的功能执行命令,及用它进行调试,运行功能。
2主要设计内容及预期目标设计一个能实现加减乘除取余计算的程序。
将键盘输入的表达式预放入一缓冲区中,然后从该缓冲区的第一个字符开始读取判断,当读到一个有效的表达式时对表达式进行相应的运算后,输出用十六进制数表示的运算结果。
目标:要求该程序接受从键盘输入的十六进制数,执行相应的计算后,计算结果以十六进制数输出。
3 概要设计本题目实现的模块图如图3-1所示图3-1 概要模块(1)界面设置主要实现确定界面样式的功能,以菜单形式显示。
(2)选择算法设置用于选择加、减、乘、除法来进行运算。
(3)十进制转换设置应用十进制的转换算法来处理加、减、乘、除法四则运算。
4 详细设计4.1 界面设置通过定义数据段,利用09H显示出功能列表。
通过定义数据段,以字符串的形式输入每个提示信息,利用09H键盘输入并回显命令显示每一个功能提示,是计算器的功能列表有序清晰的显示在屏幕上。
4.2 选择算法设置首先选择要进行的四则运算,若选择1,则进行加法;若选择2,则进行减法;若选择3,则进行乘法;若选择4,则进行除法。
微机原理实验报告汇编语言课程设计报告( 2012 -- 2013 年度第1 学期)实验名称:实现加减乘除四则运算的计算器专业生物医学工程学生姓名周炳威班级B100904学号B10090406指导教师乐洋实现加减乘除四则运算的计算器1 实验目的深化学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。
通过使用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用2 实验内容课题名称:实现加减乘除四则运算的计算器主要功能:实现一个简单的计算器,要求:编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。
计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。
3 实现方法本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。
由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。
此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。
第一步,用INT 21H的1号功能调用来进行输入。
利用1号功能调用来输入,即把单个字符一个个的输入并存储到一个数据区里。
我们要做的是两个数的运算,先认定输入的格式为1234+5678=或者1111*2222=,当然如果输入不是这样的格式计算出来的结果就不一定是我们想要的结果了。
在存储的时候也是有选择的存储,当输入的并非格式里所要求的字符时则报错。
第二步,设计程序进行判断所输入的算式是做加法运算、减法运算、乘法运算还是除法运算,即判断输入的运算符是‘+’号、‘-’号、‘*’号、‘/’号中的哪一个,因为输入的格式固定了,所以只需要把存进数据区的第三个字符拿来与加减乘除四个运算符号进行比较,和哪一个运算符号一样就调用相对应的运算模块进行计算。
学院:班级:姓名:学号:课程设计题目:四则运算计算器课程名称:汇编语言与微机原理评阅成绩:评阅意见:成绩评定教师签名:日期:年月目录概述 (1)一、设计要求 (1)二、设计思想 (1)三、程序工作原理 (2)四、程序流程图及说明 (3)五、程序源代码 (7)六、程序运行示例 (18)七、设计过程中遇到的问题及解决方法 (18)八、设计心得 (19)九、参考文献 (19)四则运算计算器概述此计算器,可以实现从键盘输入一个十进制的四则运算表达式,如:-3+4*(5-6)-8/2,编程计算表达式的值,输出十进制结果。
表达式和结果可以是三位或四位十进制,也可以是带负数的十进制数,并且+-*/()位置任意摆放(只要符合数学上的运算逻辑)。
一、设计要求用汇编语言设计一个程序,用来实现计算器的四则运算功能。
需要实现在屏幕要显示输入的表达式,以及运算结果。
例如:-3+4*(5-6)-8/2计算表达式的结果,并将该表达式及结果显示出来;设计要求如下:(1)由键盘作为输入部分。
(2)能进行四则混合运算,并且能计算带括号和负数的数学表达式。
(3)按ESC 键则退出计算器菜单界面并返回dos 系统,否则继续输入表达式,求得对应的结果。
二、设计思想根据题目的要求,可以把整个源程序大致划分六大步骤。
(1)首先键盘输入合法中缀算术表达式,并将其存储到S1中。
(2)然后调用子程序CHANGE将中缀式转化为后缀式。
(3)调用子程序CALCULATE对后缀表达式进行有符号数的运算,并将最终结果存放在栈中。
(4)POP AX,AX->STORAGE,即用STORAGE 存放最终运算结果。
(5)调用子程序OUTPUT将运算结果输出。
(6)通过用键盘输入ESC退出DOS程序。
三、程序工作原理步骤一的原理:此处用系统功能1号调用,每次从键盘输入一个字符,就将其存入到数组S1中,然后在判断此字符是否为回车,如果不是,则循环,继续输入字符,否则,程序往下执行。
目录一.设计内容 (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. 学生能理解汇编语言的基本概念,掌握计算器程序的基本结构。
2. 学生能运用汇编语言实现加、减、乘、除等基本运算。
3. 学生了解计算机内部运算的原理,理解寄存器、内存等硬件资源在程序执行过程中的作用。
技能目标:1. 学生能运用汇编语言编写简单的计算器程序,具备基本的编程能力。
2. 学生能通过调试和优化程序,提高计算器程序的执行效率。
3. 学生能运用所学知识解决实际计算问题,具备一定的实际问题分析解决能力。
情感态度价值观目标:1. 学生培养对计算机编程的兴趣和热情,增强学习动力。
2. 学生养成严谨、细致的学习态度,提高团队协作能力。
3. 学生认识到编程在日常生活和未来发展中的重要性,培养创新精神和实践能力。
分析课程性质、学生特点和教学要求,本课程将目标分解为以下具体学习成果:1. 学生能自主阅读汇编语言教材,理解计算器程序的基本结构。
2. 学生能独立编写简单的计算器程序,并通过调试和优化提高程序性能。
3. 学生能以小组形式合作完成复杂计算器程序的设计与实现,提高团队协作能力。
4. 学生在课程学习过程中,主动探索新知识,培养解决问题的能力和创新思维。
二、教学内容本课程教学内容主要包括以下几部分:1. 汇编语言基础知识:- 认识汇编语言,了解其发展历程和特点。
- 学习汇编语言的语法和基本指令。
- 了解计算机内部结构,理解寄存器、内存等硬件资源的作用。
2. 计算器程序设计:- 分析计算器程序的需求,明确功能模块。
- 学习汇编语言编写程序的基本方法,设计计算器程序框架。
- 掌握加、减、乘、除等基本运算的汇编实现。
3. 调试与优化:- 学习使用汇编语言调试工具,掌握调试技巧。
- 分析程序性能,提出优化方案。
- 实践优化过程,提高计算器程序执行效率。
4. 教学案例与实战:- 选取典型计算器案例,进行讲解和分析。
- 学生分组合作,完成复杂计算器程序的设计与实现。
- 组织课堂讨论,分享编程心得和经验。
安徽工程大学《汇编语言程序设计》大作业报告班级: XXXXX 学号: XXXXXXXX 完成人: XXXXXXX任课老师: XXXXXXX 时间: XXXXXXXXXX《汇编语言程序设计》大作业任务书大作业题目:四则运算程序程序功能要求:编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。
计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。
1.设计目标运用汇编语言,制作一个计算的程序,实现简单计算器的一般功能,能够在DOS界面下进行简单的加、减、乘、除的简单计算。
程序应有操作提示、输入和输出。
自动闪烁光标,并提示输入信息。
输入正确的数值等符号后可以进行正确的运算,程序计算其结果值并输出。
程序无需查错功能,所输入的都是正确的四则运算表达式,并且表达式中运算分量均为无正负号整数,运算符为+、-、*、/,最后结果以十进制数表示。
且程序主界面需为一个由‘*’组成边框的矩形窗口。
2.软件设计2.1程序设计的基本思想主模块:首先提供一个主界面,提示用户按要求输入具体的数据和所要进行的操作,输入完毕后给出结果。
如果输入过程中发现非法输入,则立即给与提示,程序自动刷新界面,提示继续输入。
计算显示完毕后,按提示选择是否要继续计算,不选择继续则结束。
对屏幕上输入字符串的接受,为INPUT语句段,见源代码,主要是将数字和运算符分开存放。
MATCH子程序,子程序内有三次跳转,将运算符选择正确的语句进行计算。
由于操作符只有+、-、*、/,没有涉及到括号,不用考虑括号的匹配问题。
流程图如下:图1 主模块流程图子模块:完成对数据的进一步加工处理,转换格式并得出结果。
首先根据输入调用对应的“+”、“-”、“*”、“/”四个函数模块,这是本程序的核心模块,其他部分的一些小模块都是为这几个模块服务的,大致的流程图如下图2:图2 子模块流程图3.系统调试3.1测试目标(1)在屏幕上显示一个由‘*’组成边框的矩形窗口;(2)自动闪烁光标,并提示输入信息;(3)能够完成单项表达式的输入、显示和运算;(4)编制并调试出程序。
四则运算计算器一、程序功能简介可以计算整数四则运算,例如:7+5*(3+4)二、课程设计要求(1)按要求在提供的框架程序源程序的基础上对程序进行修改、补充,并调试通过。
(2)修改主程序结构,使程序可以反复运算,直到选择退出为止。
(3)增加文件的输入输出功能,是计算过的式子和结果可以根据需要设置命令存储到文件中,同时也可以直接从文件中输入四则运算的式子,运算后,结果输出到原文件中。
(4)扩充程序功能,使程序适合实型数运算。
(5)增加程序的判断功能,当有非法的输入时(如字母等),给出提示信息并退出运算。
(6)扩充程序功能,使程序可以进行关系表达式(>=,>,<=,<,==等)的运算,运算结果为TRUE 或FALSE 。
在VC++6 环境下编译已经完美实现上述功能注:包含Debug 的语句如:if (Debug) printf(""); 都可以忽略,这些显示是编写工程中需要观察的信息,如果要打开,请在主菜单下输入大写的'D'。
Log:20060703 开始分析框架程序,并规划程序结构20060704 计算的核心部分基本完成,并封装成Operation()20060705 编写Menu_Sel() Do_Press() strChk() Do_File() FileCHK() Nexus() 整体功能和界面基本完成20060706 强化strChk(),增加Debug 模式,修正符号优先级问题。
20060707 郁闷,在英化程序-_-/// ...在Do_File() 增加输出文件另存功能...20060708 ....20060709 ....20060710 强化strChk(),增加结果整形识别,增加'!=' 处理,文件名非法字符校验。
最后更新20060710*//* =============================================== *//* 头文件声明*/#include <stdio.h> /* In Out printf().. */#include <math.h> /* pow(M,n) 开M^n */#include <string.h> /* strcpy... */#include <stdlib.h> /* atof... */#include <conio.h> /* getch()... */#define Max 256 /* 表达式长度定义,可以在这里调节*//* =============================================== *//* 函数声明*//* 计算字符串(不带括号的),计算的核心部分*/char*Calculate_f(char*chpString);/* 主操作过程,输入式子串,返回double 型结果*/double Operation(char*chpString);/* Source1、Source2 加起来到Destination 中*/char*AddStrings_f(char*chpDestination,char*chpSource1,char*chpSource2);/* 寻找char_to_find 在Source 中的位置,后移一位*/int FindChar(char*chpSource,char chCharToFind);/* 获取字符串的长度*/int Len_f(char*chpSource);/* 将Source 左边Length 个字符放在Destination 中*/char*Left_f(char*chpSource,char*chpDestination,int nLength);/* 将Source 右边Length 个字符放在Destination 中*/char*Right_f(char*chpSource,char*chpDestination,int nLength);/* 将Source 中从Start 开始Length 长度的字符串截下来放在Destination 中*/ char*Midstr_f(char*chpSource,char*chpDestination,int nStart,int nLength);/* 在字符串中删除一个字符del '+' */void DelChar(char*chpString,int sPos);/* 在字符串中插入一个字符*/int InsChar(char*chpString,int sPos,char sChar);/* 替换字符串中的某个字符*/void StrReplace(char*chpString,char strOld ,char strNew);/* 将实数值变为字符串*/char*Str_f(double nV alue,char*chpDestination);/* 计算字符串的值,返回实数值*/double V al_f(char*chpSource);/* =============================================== *//* 主菜单... */int Menu_Sel();/* 手工输入表达式求值*/int Do_Press();/* 文件导入表达式求值*/int Do_File();/* 文件检查0 重新输入,1 继续*/int FileChk(char*FN);/* 式子的合法性检查0 含有非法字符,1 正常2 关系运算*/int StrChk(char*chpSource);/* 关系运算*/int Nexus(char strIn[]);/* 显示关于*/void Show_About();/* =============================================== *//* 全局变量声明*/int Debug=0;/* 调试信息显示开关0 不显示,1 显示*/char*TF_Info[3]={"FALSE","TURE","Error"};/* 关系运算信息*//* 将Source 左边Length 个字符放在Destination 中*/char*Left_f(char*chpSource,char*chpDestination,int nLength){*(chpDestination+--nLength+1)=0;/* 设置目标字符串最后一个为NULL*/while(nLength>=0)/* 直到目标字符串的最后一个*/{*(chpDestination+nLength)=*(chpSource+nLength--);}return chpDestination;}/* 将Source 中从Start 开始Length 长度的字符串截下来放在Destination 中*/char*Midstr_f(char*chpSource,char*chpDestination,int nStart,int nLength){chpSource+=nStart-1;/* 设置源起点*/*(chpDestination+--nLength+1)=0;/* 设置目标字符串最后一个为NULL */while(nLength>=0)/* 直到目标字符串的最后一个*/{*(chpDestination+nLength)=*(chpSource+nLength--);}return chpDestination;}/* 将Source 右边Length 个字符放在Destination 中*/char*Right_f(char*chpSource,char*chpDestination,int nLength){while(*chpSource !=0){chpSource++;}/* 将源指针移到最后*/chpSource-=nLength;/* 将源指针跳到开始复制点*/ *(chpDestination+--nLength+1)=0;/* 设置目标字符串最后一个为NULL */while(nLength>=0)/* 直到目标字符串的最后一个*/{*(chpDestination+nLength)=*(chpSource+nLength--);}return chpDestination;}/* 在字符串中删除一个字符del '+' */void DelChar(char*chpString,int sPos){char sBuf[Max];int nCount;strcpy(sBuf,chpString);for(nCount=sPos;sBuf[nCount];nCount++){sBuf[nCount]=sBuf[nCount+1];}strcpy(chpString,sBuf);}/* 在字符串中插入一个字符*/int InsChar(char*chpString,int sPos,char sChar){char sBuf[Max];int iLen;int nCount;strcpy(sBuf,chpString);iLen=strlen(sBuf);if(iLen<Max){sBuf[iLen+1]='\0';for(nCount=iLen;nCount>=sPos;nCount--){sBuf[nCount+1]=sBuf[nCount];}sBuf[sPos]=sChar;strcpy(chpString,sBuf);}elsereturn0;return1;}/* 替换字符串中的某个字符'#' to '-' */void StrReplace(char*chpString,char strOld ,char strNew){char sBuf[Max];int nCount=0;strcpy(sBuf,chpString);while(sBuf[nCount]){if(sBuf[nCount]==strOld) sBuf[nCount]=strNew;nCount++;}strcpy(chpString,sBuf);}/* 寻找char_to_find 在Source 中的位置,后移一位*/int FindChar(char*chpSource,char chCharToFind){int nPos=0;while(*(chpSource+nPos)!=0)/* 直到目标字符串的最后一个*/ {if(chCharToFind ==*(chpSource+nPos++))/* 比较.. */{return nPos;/* 返回第一个出现点,加一*/ }}return0;}/* 获取字符串的长度*/int Len_f(char*chpSource){int nRetval=0;/* 初始化长度*/while(*(chpSource+nRetval++)!=0){}/* 移动指针到Null */return--nRetval;}/* 将实数值变为字符串*/char*Str_f(double nV alue,char*chpDestination){char strTmp[Max];gcvt(nV alue,sizeof(double)+1,strTmp);/* 实数值转字符串*/if(strTmp[0]=='-')/* 将'-' 负号转译为'#' */{strTmp[0]='#';}strcpy(chpDestination,strTmp);if(Debug) printf("...Conversion Double to String:%f - >%s\n",nV alue,chpDestination);return chpDestination;}/* Source1、Source2 加起来到Destination 中*/char*AddStrings_f(char*chpDestination,char*chpSource1,char*chpSource2){char*chpTempdest=chpDestination;while(*chpSource1!=0)/* 先把chpSource1 放入chpDestination */{*(chpTempdest++)=*(chpSource1++);}while(*chpSource2!=0)/* 在chpDestination 后继续写入chpSource2 */{*(chpTempdest++)=*(chpSource2++);}*chpTempdest=0;/* 指针位置归零*/return chpDestination;}/* 计算字符串的值,返回实数值*/double V al_f(char*chpSource){double nResult=0.;char strTmp[Max];strcpy(strTmp,chpSource);if(strTmp[0]=='#')/* 将'#' 转译为'-' 负号*/{strTmp[0]='-';}nResult=atof(strTmp);/* 字符串转为实数*/if(Debug)printf("...Conversion String to Double:%s -> %s -> %f\n",chpSource,strTmp,nResult);return nResult;}。
汇编语言实训任务书题目:计算器学生姓名学号:杜政毅,惠攀龙12730108,郭益婷13730104班级:13软件工程1班题目类型:软件工程(R)指导教师:刘树群一、设计目的用汇编语言编程设计一个简单的计算器,实现四则运算数的交互式输入,并显示运算结果。
通过设计,掌握键盘和鼠标控制、显示输出和基本算术运算指令的应用,进一步提高综合运用知识的能力。
二、设计内容(包括原始数据、技术参数、条件、设计要求等):使用按键式操作,对任意给定的正确四则运算序列,能按照意图分部计算出其计算的有效结果数值并输出。
三、设计要求题目的选择是根据汇编语言的特点主要针对系统内部的一些中断调用、系统功能调用、系统数据处理、文件数据处理、以及相关的API而设计的,是对所学课程知识较为系统的应用。
由于汇编语言编程相对其他语言编程比较复杂,因此,在设计上应把重点放在程序的功能实现上,不要太在意程序的结构和显示界面的设计。
不要局限于题目所规定的要求,可以灵活裁减,设计出功能更完善程序。
另外,也可以自己设计题目,同时,提出详细的功能描述,经指导老师审查同意后也可作为课程设计的题目。
四、提交的成果1. 设计说明书一份,内容包括:包含任务书一份1) 中文摘要100字,关键词3-5个。
2) 实训题目、内容、要求。
3)总体设计(包含几大功能模块)。
4)详细设计(各功能模块的具体实现算法——流程图)5)数据结构设计描述,各模块(函数)的功能介绍,参数说明等。
6)调试分析(包含各模块的测试用例,及测试结果。
)7)总结(实训完成了哪些功能,还有哪些地方需要改进,及通过实训有何收获,调试程序的体会等)8) 参考文献、致谢等。
五、主要参考资料[1]李敬兆等编.《汇编语言程序设计》.合肥:中国科学技术大学出版社,2008.9?[2]李敬兆等编.《汇编语言程序设计实验教程及习题解答》.合肥:中国科学技术大学出版社,2008.9?[3]王爽等编.《汇编语言》.北京:清华大学出版社,2003.5?[4]曹加恒等编.《新一代汇编语言课程设计》.北京:高等教育出版社,2003.6?[5]杨路明等编.《汇编语言程序设计》.长沙:中南大学出版社,2005.8[6]詹仕华等编.《汇编语言程序设计》.北京:中国电力出版社,2008.2[7]詹仕华等编.《汇编语言程序设计习题解答及课程设计、设计辅导》.北京:中国电力出版社,2008.2[8]宋彩莉等编.《汇编语言程序设计学习指导》.西安:西安交通大学出版社,2008.2?六、各阶段时间安排(共1周)摘要本次课程设计的题目是用汇编语言实现一个简单的计算器,要求:编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。
目录一、计算器的具体功能.......................................... 错误!未定义书签。
二、软件设计流程极其描述.................................. 错误!未定义书签。
三、源程序代码 (12)四、课程设计体会 (23)五、参考文献 (23)附录 (23)一、计算器的具体功能1、输入一个正数后按回车可以直接输出该正数;2、输入一个负数后按回车可以直接输出该负数;3、可以进行有符号数的加运算;4、可以进行有符号数的减运算;5、可以进行有符号数的加、减运算;6、可以进行有符号数的乘运算;7、可以进行有符号数的除运算;8、可以进行有符号数的乘、除运算;9、可以进行有符号数的加、减、乘、除四则运算;10、支持使用括号改变运算顺序;11、输入一个数值不是很大的合法的算术表达式并按回车,可以得到正确的结果。
二、软件设计流程极其描述《一》、软件设计简要流程下页所示:以上为主流程图以上为中缀表达式转化为后缀表达式的流程图。
其每次向S2中输入一个字符,DI就会加1。
当压入‘(’后,再压入0作为运算符优先级的判断;当压入‘+’或‘-’后,再压入01作为运算符优先级的判断;当压入‘*’或‘/’后,再压入02作为运算符优先级的判断。
以上为计算后缀表达式数值的流程图以上为输出运算结果程序的流程图《二》、简要流程中五大步骤的具体描述1、步骤(一):从键盘输入合法中缀算术表达式,并将其存储到S1中此处用系统功能1号调用,每次从键盘输入一个字符,就将其存入到数组S1中,然后在判断此字符是否为回车,如果不是,则循环,继续输入字符,否则,程序往下执行。
2、步骤(二):调用子程序CHANGE将中缀式转化为后缀式此处最核心的就是中缀表达式转化为后缀表达式的算法。
具体思路为:用一个栈来存储与运算符号.先将字符’@’压入栈中,并假设其优先级为0.然后遍历S1中的字符,遇到数字直接存入S2中并且输完数字后向S2中输入一空格以备计算结果时用。
编写一个有符号多位十进制数的四则运算计算器程序,所输入的算式如下例所示:-278+32=-132――12=11*-32=-1234/-18=要求程序能接收键入的算式,在接收到‘=’号时,计算并以有符号十进制数的形式显示结果,然后允许用户继续键入算式。
如果键入算式后再键入‘.’,则显示结果并结束整个程序。
(‘/’为整除)data segmentinputstring db 0dh,0ah,'Please input the equaltion(s):$'errorstring db 0dh,0ah,'The inputstring is wrong!$'endstring db 0dh,0ah,'The Pragramm has ended.$'bufferstring db 80 dup(?) ;保存输入的字符串number1 dw 0 ;保存第一个操作数number2 dw 0 ;保存第二个操作数number1sign db '+' ;第一个数的符号此初始化是为了判断此数字没有符号number2sign db '+' ;第二个数的符号computesign db '#' ;运算符号total dw 0 ;记录字符总个数test1 dw 1 ;判断有符号的数据的符号位之后第一个数据是否为运算符yanzheng db 0dh,0ah,'Please enter string again$' ;此字符串仅仅是用来验证输出结果做调试用可以删除test2 dw 0 ;此数据是判断第一个字符是否有符号data endscode segmentmain proc farassume cs:code,ds:databegin:push dsxor ax,axpush axmov ax,datamov ds,axstart1:mov number1sign,'+'mov number2sign,'+'mov computesign,'#' ;对所有的数据进行初始化必须的mov ax,0mov bx,0mov di,0mov si,0mov cx,0mov dx,0mov test1,1mov test2,0mov total,0mov number1,0mov number2,0mov dx,offset inputstring ;显示输入提示信息mov ah,09h ;输出提示信息int 21hnewchar:mov ah,01h ;输入字符int 21hcmp al,'.' ;程序完全结束情况*******注意'='以及'.'并没有存入字符数组之中*******jz show1cmp al,'=' ;允许用户继续输入等式jz show2sub al,30hjl inputcmp al,9djg inputmov bufferstring[si],alinc siinc total ;存储字符的总个数jmp newcharinput:add al,30hmov bufferstring[si],alinc siinc totaljmp newcharshow1:mov cx,total ;判断用户是否只输入一个'.'字符如果是则直接退出cmp cx,0jz xianshicall checkxianshi:mov dx,offset endstring ;显示输入错误mov ah,09hint 21hjmp exitshow2:call check ;以'='结束的字符串处理jmp start1exit:mov ah,4ch ;退出返回DOS系统int 21hmain endpcheck proc near ;第一个数的识别过程mov si,0newchar1:mov al,bufferstring[si] ;这里只取第一个字符进行判断cmp al,'-' ;查看字符串的第一个字符是'+'或者'-'或者整数是整数的话直接进行操作jz ZFshucmp al,'+'jz ZFshucmp al,0djl error ;此处error是用来处理第一个不是此三种情况的错误现在暂时未添加cmp al,9djg errorjmp nonfuhao ;如果能执行到此则说明第一个数是无符号数已经将'+'赋值给第一个数的符号ZFshu:call check1 ;转入后续操作数运算符第二个操作数的识别操作jmp exit1nonfuhao:mov test2,1 ;用来提供下面判断的依据如果test2为1 则说明是无符号数不需要赋值符号位call check1jmp exit1error:mov dx,offset errorstring ;结束信息输出mov ah,09hint 21hexit1:retcheck endpcheck1 proc nearcmp test2,1jz count1mov number1sign,al ;记录第一个数据的符号inc sisub total,1 ;因为此处是从字符数组的第二个数据开始识别所以total-1jmp countcount1:sub total,1 ;此处也要记得总数-1mov si,0count: ;读取第一个操作数mov al,bufferstring[si]cmp al,'+'jz compute1 ;如果是这些运算符则开始识别第二个数据cmp al,'-'jz compute1cmp al,'*'jz compute1cmp al,'/'jz compute1cmp al,0djl error1cmp al,9djg error1cbw ;如果能够执行到此说明此字符一定为0-9的数字而不是运算符则进行转换xchg ax,bxmov cx,10dmul cxxchg ax,bxadd bx,axmov number1,bx ;保存数据于number1mov test1,0 ;如果已经输入数据了则将test1赋值1inc si ;记录指针cmp total,sijge countcompute1:cmp test1,1 ;如果之前已经取数据则test1的值已经被修改为0 jz error1 ;如果此处为1 则说明第一个操作数之后紧接着是另一个运算符则出错mov bx,0mov computesign,al ;记录为运算符号inc si ;记录第二个操作数的符号判断count2:mov al,bufferstring[si]cmp al,'+' ;此处既是第二个操作数的符号然后直接进行读数操作即可jz compute2cmp al,'-'jz compute2cmp al,0djl error1cmp al,9djg error1cbw ;如果能够执行到此说明此字符一定为0-9的数字则进行转换xchg ax,bx ;此表明第二个操作数也是没有符号的mov cx,10dmul cxxchg ax,bxadd bx,ax ;十进制数据最终存放在bx中mov number2,bx ;保存数据于number2inc si ;记录指针cmp total,sijge count2call computionjmp exit2compute2:mov number2sign,al ;保存第二个操作数的符号inc si ;第二个操作数符号的下一位count3:mov al,bufferstring[si]cmp al,0djl error1cmp al,9djg error1cbw ;如果能够执行到此说明此字符一定为0-9的数字则进行转换xchg ax,bxmov cx,10dmul cxxchg ax,bxadd bx,ax ;十进制数据最终存放在bx中mov number2,bx ;保存数据于number2inc si ;记录指针cmp total,si ;判断是否越界jge count3call compution ;第二个数据识别完毕则进行运算jmp exit2error1: ;错误处理***当输入表达式错误的时候这边能够识别***mov dx,offset errorstringmov ah,09hint 21hmov dx,offset yanzhengmov ah,09hint 21hexit2:retcheck1 endpcompution proc near ;上面过程已经将运算符和操作数的运算符取出下面进行相应的操作cmp computesign,'*'jz multiply1cmp computesign,'/'jz devide11cmp computesign,'+'jz plus1cmp computesign,'-'jz minus1jmp exit3multiply1:call multiplyjmp exit3devide11:call dividejmp exit3plus1:call plusjmp exit3minus1:call minusexit3:retcompution endpmultiply proc near ;两个数的乘法运算mov ax,number1mov cx,number2 ;先行计算两个数的乘积然后判断符号mul cxmov bx,axmov dl,number1signcmp dl,number2sign ;相同则输出'+'jz multmov dl,'-' ;不同则输出'-'mov ah,02hint 21hmult:call showretmultiply endpdivide proc near ;除法运算mov ax,number1mov cx,number2 ;做法与乘法相同div cxmov bx,axmov dl,number1signcmp dl,number2signjz dividmov dl,'-'mov ah,02hint 21hdivid:call showretdivide endpplus proc nearmov dl,number1sign ;判断符号是否相等cmp dl,number2signjz first3mov bx,number1 ;整体思想就是如果符号相同则进行相加然后先输出符号再输出结果cmp bx,number2 ;如果不相同则用较大数据减去小数据然后判断大数的符号进行输出jg first333mov bx,number2sub bx,number1cmp number2sign,'-'jz outputfuhaooutputzheng:mov dl,'+' ;输出'+'mov ah,02hint 21hcall showjmp exit4first333:sub bx,number2cmp number1sign,'+'jz outputzhengoutputfuhao:mov dl,'-'mov ah,02hint 21hcall showjmp exit4first3:mov bx,number1 ;两者符号相同一定为'+'操作add bx,number2cmp number1sign,'-'jz first33mov dl,'+'mov ah,02hint 21hcall showjmp exit4first33:mov dl,'-'mov ah,02hint 21hcall showexit4:retplus endpminus proc nearmov dl,number1sign ;如果符号相同则用较大数减去小数判断大数的符号然后输出符号cmp dl,number2sign ;如果符号不同则相加然后输出number1signjz first4mov bx,number1add bx,number2cmp number1sign,'-'jz first444first56:mov dl,'+'mov ah,02hint 21hfirst44:call showjmp exit5first444:mov dl,'-'mov ah,02hint 21hjmp first44first4:mov bx,number1cmp bx,number2jge first5mov bx,number2sub bx,number1cmp number1sign,'+'jz first444jmp first56first5:sub bx,number2mov dl,number1signmov ah,02hint 21hcall showexit5:retminus endpshow proc NEAR ;将存放在bx中的数据进行输出mov cx,10000dcall dec_divmov cx,1000dcall dec_divmov cx,100dcall dec_divmov cx,10dcall dec_divmov cx,1dcall dec_divretdec_div proc nearmov ax,bxmov dx,0div cxmov bx,dxmov dl,alcmp dl,0jz exit6add dl,30hmov ah,02hint 21hexit6:retdec_div endpshow endpcode endsend begin ;搞定嘎嘎……………………。
微机原理实验报告汇编语言课程设计报告( 2012 -- 2013 年度第1 学期)实验名称:实现加减乘除四则运算的计算器专业生物医学工程学生姓名周炳威班级B100904学号B********指导教师乐洋实现加减乘除四则运算的计算器1 实验目的深化学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。
通过使用汇编语言设计实现简单计算器,以此进一步了解和掌握对数据存储,寄存器的使用,加减乘除相关指令以及模块的调用等汇编语言知识的有效运用2 实验内容课题名称:实现加减乘除四则运算的计算器主要功能:实现一个简单的计算器,要求:编写一个程序,每运行一次可执行程序,可以实现加减乘除四则运算。
计算器是最简单的计算工具,简单计算器具有加、减、乘、除四项运算功能。
3 实现方法本次汇编语言课程设计的最终目的是要实现一个简单计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。
由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。
此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。
第一步,用INT 21H的1号功能调用来进行输入。
利用1号功能调用来输入,即把单个字符一个个的输入并存储到一个数据区里。
我们要做的是两个数的运算,先认定输入的格式为1234+5678=或者1111*2222=,当然如果输入不是这样的格式计算出来的结果就不一定是我们想要的结果了。
在存储的时候也是有选择的存储,当输入的并非格式里所要求的字符时则报错。
第二步,设计程序进行判断所输入的算式是做加法运算、减法运算、乘法运算还是除法运算,即判断输入的运算符是‘+’号、‘-’号、‘*’号、‘/’号中的哪一个,因为输入的格式固定了,所以只需要把存进数据区的第三个字符拿来与加减乘除四个运算符号进行比较,和哪一个运算符号一样就调用相对应的运算模块进行计算。
2微机原理实验报告第三步,根据计算器程序所要实现的功能完成各个功能模块。
设计程序主体部分,根据主体部分所需的功能模块对各个子模块一一进行设计编写。
子模块中包含有:do_add加法运算模块,do_sub减法运算模块,do_mul乘法运算模块,do_div 除法运算模块,input输入模块等。
最后还要对这个简易计算器进行功能完善。
为了使程序符合我们使用者的操作习惯,设计当用户根据提示信息输入一个算式后,按下enter键或是‘=’符号键时,程序依据输入的算式进行计算,并将结果显示在屏幕上。
如果用户输入错误,则返回,提示信息让用户重新输入算式,当用户按下Q或q键时退出程序。
在各个子功能模块设计好的情况下,通过主题模块的合理调用,最终实现一个具有简单运算功能的计算器。
3.2程序流程图及说明此程序流程图简要地表现出了所要实现的功能以及一些功能的大概算法,同时也是我编写的程序的一个总体的框架。
程序流程图说明:通过流程图,可以看出程序开始运行时,首先输出提示语句,当用户输入后,程序根据所输入的内容进行判断,通过判断的结果来决定调用哪个功能模块,首先要判断输入的字符是否为Q或q,若是,则退出程序,不是则继续输入。
还要判断输入的是否为0--9,‘+’,‘-’,‘*’,‘/’这些字符,若不是会报错,是则将根据运算符号调用相应的功能模块完成运算。
最后将运算的结果显示在屏幕上,并返回主题程序,使用户可以重新输入。
34微机原理实验报告源程序清单B_P EQU BYTE PTRW_P EQU WORD PTRD_P EQU DWORD PTRCODE SEGMENTASSUME CS:CODE,DS:CODEORG 100H;主程序开始NEWSTAR:JMP STAREVENNUM1 DW 0,0NUM2 DW 0,0NUM3 DW 0,0JGV4 DW 0,0YSF LABEL WORDYSF1 DB 0YSF2 DB 0JUV DB 0UV DB 0;使DS:SI指向第一有效字符OVERS LABEL NEARCLDPUSH AXOVERS1:LODSBCMP AL,' 'JZ OVERS1CMP AL,9JZ OVERS1DEC SICMP AL,13POP AXRET;输出一个制表符TAB LABEL NEARMOV AL,95JMP SHORT DISP;输出一个回车换行符CRLF LABEL NEARMOV AL,13CALL DISPMOV AL,10;显示一个字符DISP LABEL NEARPUSH AXPUSH DXMOV AH,2MOV DL,ALINT 21HPOP DXPOP AXRET;检查是否为运算符ISYSF LABEL NEARCLDLODSBCALL ISJJJZ ISYSF1CALL ISIIJZ ISYSF1DEC SIISYSF1:RET;检查是否是加减运算ISJJ LABEL NEARCMP AL,'+'JZ ISYSF1CMP AL,'-'RET;检查是否为乘除运算ISII LABEL NEARCMP AL,'*'JZ ISYSF1CMP AL,'/'6微机原理实验报告JZ ISYSF1CMP AL,'\'RET;数据输出;CX=10 十进制;CX=16 十六进制DOUT LABEL NEARPUSH AXPUSH BXPUSH DXPUSH BPXOR BP,BPDOUT1:INC BPPUSH AXMOV AX,DXXOR DX,DXDIV CXMOV BX,AXPOP AXDIV CXPUSH DXMOV DX,BXOR BX,AXJNZ DOUT1DOUT2:POP AXADD AL,'0'CMP AL,'9'JBE DOUT3ADD AL,'A'-'9'-1DOUT3:CALL DISPDEC BPJNZ DOUT2POP BPPOP DXPOP BX7POP AXRET;输入数据在DX:AX中返回;CX=0 数据为10进制;CX#0 数据为16进制DATE LABEL NEARPUSH BXPUSH BPPUSH DIXOR AX,AXXOR DX,DXDATE1:MOV DI,AXLODSBCMP AL,'0'JB DATE7CMP AL,'9'JA DATE6DATE2:AND AX,0FHSHL DI,1RCL DX,1MOV BX,DIMOV BP,DXSHL DI,1RCL DX,1SHL DI,1RCL DX,1JCXZ DATE3SHL DI,1RCL DX,1Jmp short DATE4 DATE3:ADD DI,BXADC DX,BPDATE4:ADD AX,DIADC DX,08微机原理实验报告JMP DATE1DATE5:ADD AL,9JMP DATE2DATE6:JCXZ DATE7CMP AL,'A'JB DATE7CMP AL,'F'JBE DATE5CMP AL,'a'JB DATE7CMP AL,'f'JBE DATE5DATE7:MOV AX,DIDEC SIOR DI,DXPOP DIPOP BPPOP BXRET;数据1与数据2根据YSF1进行加减运算JSJJ LABEL NEARMOV AX,NUM2MOV DX,NUM2+2CMP YSF1,'+'JZ JSJJ1SUB NUM1,AXSBB NUM1+2,DXJMP SHORT JSJJ2JSJJ1:ADD NUM1,AXADC NUM1+2,DXJSJJ2:RET;数据1与数据2根据YSF1进行乘除运算JSII1 LABEL NEAR9MOV BX,OFFSET NUM1JMP SHORT JSII2_1 ;数据2与数据3根据YSF2进行乘除运算JSII2 LABEL NEARMOV BX,OFFSET NUM2 JSII2_1:DB 66HMOV AX,[BX]DB 66HMOV CX,[BX+4]CMP YSF2,'*'JNZ JSII2_2DB 66HIMUL CXJMP SHORT JSII2_3 JSII2_2:DB 66HCWDDB 66HIDIV CXCMP YSF2,'/'JZ JSII2_3DB 66HXCHG DX,AXJSII2_3:DB 66HMOV [BX],AXRET;显示结果XUJG LABEL NEARMOV AX,JGV4MOV DX,JGV4+2MOV CX,10CMP UV,10JZ XUJG0MOV CX,16XUJG0:TEST DX,8000H10微机原理实验报告JZ XUJG1CMP UV,10JZ XUJG2CALL DOUTXUJG2:NOT AXNOT DXADD AX,1ADC DX,0PUSH AXCMP UV,10JZ XUJG3MOV AL,' 'CALL DISPMOV AL,'('CALL DISPXUJG3:MOV AL,'-'CALL DISPPOP AXCMP UV,10JZ XUJG1CALL DOUTMOV AL,')'CALL DISPRETXUJG1:CALL DOUTRET;计算结果放入DX:AX中JSJG LABEL NEARCALL JSJJMOV AX,NUM1MOV DX,NUM1+2RET;从DS:SI处取一个数据LOADATE LABEL NEARLODSBCMP AL,'('JZ LOADATE1DEC SIPUSH CXXOR CX,CXCMP UV,10JZ LOADATE0INC CX ;取16进制数LOADATE0:CALL DATE ;取数据放入DX:AX中POP CXRETLOADATE1:PUSH NUM1 ;保存数据1数据2及运算符PUSH NUM1+2PUSH NUM2PUSH NUM2+2PUSH YSFINC JUVMOV JGV4,0 ;结果值清零MOV JGV4+2,0;进行四则运算SZYS LABEL NEARCALL ISYSF ;首字符是运算符?JZ SZYS2CALL LOADATE ;不是,取数并保存MOV NUM1,AXMOV NUM1+2,DXSZYS1:XOR AX,AX ;数据2清零MOV NUM2,AXMOV NUM2+2,AXCALL ISYSF ;下个是运算符?JZ SZYS3JNZ SZYS6SZYS2:PUSH AXMOV AX,JGV4 ;将结果作为数据1微机原理实验报告MOV NUM1,AXMOV AX,JGV4+2MOV NUM1+2,AXPOP AXSZYS3:MOV YSF1,ALMOV YSF2,ALCALL ISJJ ;是加减运算转JZ SZYS4CALL LOADATE ;取数据2MOV NUM2,AXMOV NUM2+2,DXCALL JSII1 ;数据1与数据2根据YSF1进行乘除运算JMP SZYS1 ; 结果保存在数据1中SZYS4:CALL LOADATE ;取数据2并保存MOV NUM2,AXMOV NUM2+2,DXSZYS4_1:CALL ISYSFJNZ SZYS6CALL ISJJ ;运算符2是加减运算?JNZ SZYS5 ;不是转PUSH AXCALL JSJJ ;数据1与数据2根据YSF1进行加减运算POP AX ; 结果保存在数据1中MOV YSF1,AL ;保存新的运算符JMP SZYS4SZYS5:MOV YSF2,AL ;保存运算符2CALL LOADATE ;取数据3MOV NUM3,AXMOV NUM3+2,DXCALL JSII2 ;数据2与数据3根据YSF2进行乘除运算JMP SZYS4_1 ; 结果保存在数据2中SZYS6:MOV CL,ALCMP AL,13JNZ SZYS9 SZYS7:CALL JSJGCMP JUV,0JZ SZYS8DEC JUVPOP YSFPOP NUM2+2POP NUM2POP NUM1+2POP NUM1RETSZYS8:CMP CL,')'JZ SZYS10MOV JGV4,AXMOV JGV4+2,DXJNZ SZYS12 SZYS9:CMP AL,')'JNZ SZYS11INC SIJMP SZYS7 SZYS10:MOV NUM1,AXMOV NUM1+2,DXJMP SZYS1 SZYS11:STCRETSZYS12:CLCRET;数制处理UVIL LABEL NEAR微机原理实验报告PUSH SIUVIL1:LODSBCMP AL,' 'JZ UVIL2CMP AL,9JZ UVIL2CMP AL,13JZ UVIL4JNZ UVIL1UVIL2:MOV BX,SICALL OVERSJZ UVIL3LODSWCALL OVERSPOP SIJNZ SZYS11CMP AX,'01'JNZ SZYS11PUSH SIMOV UV,10UVIL3:MOV AL,13MOV [BX-1],ALUVIL4:POP SICLCRET;预置结果YVJG LABEL NEARMOV AH,52HINT 21HMOV AX,ES:[BX-2]MOV DS,AXMOV AX,DS:[0CH]MOV CS:JGV4,AXMOV AX,DS:[0EH]MOV CS:JGV4+2,AXPUSH CSPOP DSPUSH CSPOP ESRET;保存结果BCJG LABEL NEARMOV AH,52HINT 21HMOV AX,ES:[BX-2]MOV DS,AXMOV AX,CS:JGV4MOV DS:[0CH],AXMOV AX,CS:JGV4+2MOV DS:[0EH],AXPUSH CSPOP DSPUSH CSPOP ESRETSTAR:MOV SI,81HCLDCALL OVERSJNZ STAR1STAR0:MOV DX,OFFSET MESS1JMP STAR4STAR1:CALL YVJGCALL UVILJB STAR0MOV SAVESP,SPCALL SZYSMOV SP,SAVESPMOV DX,OFFSET MESS2JB STAR4微机原理实验报告CALL CRLFCALL XUJGCALL BCJGMOV DX,OFFSET MESS3STAR4:MOV AH,9INT 21HINT 20HSAVESP DW 0MESS1 DB 13,10,' Syntax:',13,10DB ' JS <Expression> [10]',13,10,'$' MESS2 DB 'Error in expression !$'MESS3 DB 13,10,'$'CODE ENDSEND NEWSTAR。