ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:119.03KB ,
资源ID:8894976      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8894976.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(汇编计算器程序实验报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

汇编计算器程序实验报告.docx

1、汇编计算器程序实验报告汇编语言程序设计综合程序设计实验报告 题 目: 计算器 一、项目简介 在我们生活中无时不刻不用到计算,虽说计算并不是很麻烦,但有的时候复杂的运算仍需要花费我们大量的时间去解决。所以要有这样一个程序解决这个问题。基于这个目的,而且在这个学期中,我们又接触到了汇编语言,运用汇编语言编写了计算器,来解决这个实际并且经常遇到的问题。改程序主要针对加减乘除运算,可以进行相对复杂的问题,包含括号的相关运算。该问题主要注意四则运算的优先级问题:惩处运算比加减运算优先级高,统计运算按从左到右的顺序计算,含有括号是应该先计算括号里面的内容。二、小组成员具体分工徐其仲:调试汇编语言环境,设计

2、汇编程序功能李 秦:实现程序功能,撰写实验报告三、需求分析与设计问题:利用汇编语言编写计算器内容:从键盘输入一个四则运算表达式,按=号输出计算结果,并当结束时询问:是否继续?如果按q或Q,则退出,按其余任意键则继续。计算器主要包括以下几个模块:(1)主程序模块 主程序模块首先实现调用子程序clear清屏,初始化数据段,调用显示宏show显示界面,将寄存器ax,bx,cx,dx初始化赋初值为0,调用回车换行宏,输入字符或数字并判断调用子程序dyfq调用赋权宏fq为符号赋权,从而判断优先级,调用加减乘除子程序match对判断出的相应运算符进行运算,输出运算结果,判断是否继续,继续则返回输入,不则退

3、出程序。(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寄

4、存器入栈保存,通过ah=06h屏幕上卷功能,用bh=07h将屏幕设置为黑底白字,给dh,dl赋值将其清屏位置设定在30行80列范围,从而实现了清屏功能,然后再讲ax,bx,cx,dx寄存器出栈(6)回车换行宏模块 通过2号功能的输出功能,将0dh赋予dl输出,再调用2号功能,将0ah赋予dl输出,从而实现回车换行功能。 (7)9号功能显示字符串宏模块 通过定义宏show,用9号显示功能,通过变元str将字符串显示出来 程序设计流程图: = 数字 符号 y y n y n四、代码及分析程序代码: datas segment space db 1000 dup( ) partten1 db 5 d

5、up( ),23 dup( ),$ str1 db 0ah,0dh, ,179,*,179,$ str2 db 0ah,0dh, ,179,* *,179,$ str3 db 0ah,0dh, ,179,* Weclome! *,179,$ str4 db 0ah,0dh, ,179,* *,179,$ str5 db 0ah,0dh, ,179,*,179,$ str6 db 0ah,0dh,Press any key to continue or q to exit?$ sign1 dw 0 ;判断是否有数字输入存储区,值为0代表输入的不是数字,为1代表输入的是数字 sign2 dw 0

6、;判断括号是否配对,值为0代表输入的是符号是匹配的,为1代表不匹配 number dw 20 dup(0) ;保存输入的数值 operator db $ ;判断输入的运算符是否为空 db 10 dup(0) ;保存该运算符对应的权值 error db Wrong!$ datas endsshow macro str ;宏定义,显示字符串 lea dx,str mov ah,09h int 21h endmfq macro ascii,a,b ;宏定义,给运算符赋权值 cmp al,ascii jne s&a mov ch,b jmp s7 endmhuiche macro ;宏定义,回车换行

7、mov ah,02h mov dl,0dh int 21h mov ah,02h mov dl,0ah int 21h endmcodes segment assume cs:codes,ds:datas start: call clear mov ax,0600h call scren ; mov ax,0001h ;int 10h mov ax,datas mov ds,ax lea di,number lea si,operator show partten1 show str1 show str2 show str3 show str4 show str5 huiche mov ax,

8、0 mov bx,0 mov cx,0 mov dx,0 start1: huiche input: mov ah,01h int 21h cmp al,= ;第一种情况,第一次输入的是=,则直接=0. 第一次输入的数分为2大种情况:1.=2.数字或字符:28h-39h je let0 ;是等号,进一步判断输入括号是否配对 第1大种情况排除后就剩下数字和字符了,再判断是数字还是字符 cmp al,28h ;第二种情况,第一次输入的与28h也就是(比较 jb input ;小于28h时重新输入 cmp al,39h ;大于39h是重新输入 ja input cmp al,2fh ;判断是数字还是

9、符号 jbe let1 ;是符号转入响应操作 inc word ptr sign1 ;是数字将数字标志位加一 sub al,30h ;将ascii码转为16进制 mov ah,0 xchg ax,di mul bx mov bx,10 xchg ax,di add di,ax jmp input let0: cmp word ptr sign2,0 ;判断配对标志位 je let1 ;经过左括号和右括号抵消为0则跳转 jmp let8 ;否则显示输入错误 let1: cmp word ptr sign1,0 ;判断数值指针是否已经下移一位 je let2 add di,2 ;证明之前操作已输入

10、了数字,则下移一字单元位置将其赋0 mov word ptr sign1,0 ;将数字标志位复0 let2: call dyfq ;设定优先级 cmp ch,5 ;判断输入的符号是否是左括号 jne let3 ;不是则判断输入的是否是右括号 inc word ptr sign2 ;是左括号,括号标志位加1 let3: cmp ch,1 ;判断输入的符号是否是右括号 jne let4 dec word ptr sign2 ;是右括号,括号标志位减1 let4: cmp byte ptrsi,$ ;判断运算符存储区是否为空 je let6 cmp ch,si ;【si】的内容为前一个符号或其权值

11、ja let6 cmp byte ptrsi,( jne let5 dec si jmp input let5: dec si mov cl,si call match ;判断是什么运算符并进行相应的运算 jmp let4 let6: cmp ch,0 ;判断是否是等号 je output cmp ch,1 je input ;)不保存,输入下一个数 inc si mov si,al ;保存符号 inc si cmp ch,5 ;判断是否是左括号 jne let7 mov ch,2 ;改变(的权值 let7: mov si,ch ;紧跟着保存符号的权值 jmp input let8: lea

12、dx,error mov ah,9 int 21h jmp exitmatch proc near ;子程序,进行相应的运算 push ax mov ax,0 mov bx,0 cmp cl,2ah ;乘法运算 jne chu sub di,2 xchg bx,di sub di,2 xchg ax,di imul bx mov di,ax add di,2 jmp finish chu: ;除法运算 cmp cl,2fh jne jia sub di,2 xchg bx,di sub di,2 xchg ax,di cwd idiv bx mov di,ax add di,2 jmp fin

13、ish jia: ;加法运算 cmp cl,2bh jne jian sub di,2 xchg bx,di sub di,2 add di,bx add di,2 jmp finish jian: ;减法运算 cmp cl,2dh jne finish sub di,2 xchg bx,di sub di,2 sub di,bx add di,2 finish: pop ax retmatch endpdyfq proc ;子程序dyfq调用宏fq fq 28h,1,5 ;调用宏fq为(赋权值 s1: fq 29h,2,1 ;) s2: fq 2ah,3,4 ;* s3: fq 2fh,4,

14、4 ;/ s4: fq 2bh,5,3 ;+ s5: fq 2dh,6,3 ;- s6: fq 3dh,7,0 ;= s7: retdyfq endpclear proc near ;清屏 push ax push bx push cx push dx mov ah,06h mov bh,07h mov cx,0 mov dh,30 mov dl,80 int 10h pop ax pop bx pop cx pop dx retclear endpoutput: ;输出结果 sub di,2 cmp word ptrdi,0 jge k1 neg word ptrdi ;求负数的绝对值 mo

15、v dl,- mov ah,2 int 21h k1: mov bx,10000 mov cx,5 mov si,0 k2: mov ax,di cwd div bx mov di,dx cmp al,0 jne k3 cmp si,0 jne k3 cmp cx,1 je k3 jmp k4 k3: mov dl,al add dl,30h mov ah,2 int 21h mov si,1 k4: ;实现将10000变为1000,100,10 mov ax,bx mov dx,0 mov bx,10 div bx mov bx,ax loop k2 huiche show str6 mov

16、 ah,1 int 21h cmp al,q ;判断输入是否继续 je exit cmp al,Q je exit mov word ptrdi+2,0 huiche lea di,number lea si,operator jmp start1 exit: mov ah,4ch int 21h scren proc near mov bh,2eh mov cx,0 mov dx,184fh ;dos窗口,设置全屏,一共24行,每行78,184f就是十进制的24和78 int 10h retscren endp codes ends end start 五、总结本次课程设计的题目是计算器,通

17、过在课堂上学习的基本知识和基本方法以及平时积累的知识和方法来实现对带符号数的加减乘除运算。在设计的过程中,我们组的成员对课上讲解的内容进行了巩固,同时也了解了一些汇编语言必备的其他知识,让我们的实际动手能力得以增强。其次,通过本次课程设计,使我们对模块化,结构化的程序设计方法掌握的更加透彻。在这,就是对宏的定义,调用以及子程序的定义,调用的方法掌握的更加熟练。本次课程设计是要实现对有符号数的加减乘除运算,程序开始定义了显示界面的诸多字符串,经过调用后的清屏宏指令后显示界面,接下来,定义了判断数字和判断运算符的存储区,通过这两个存储区来判断当前位置输入的是数字还是运算符,然后,定义了保存数字和保

18、存运算符的存储区,提示错误的字符串,显示宏、赋权宏、回车换行符等,通过主程序对哥哥宏及其子程序的调用,判断出输入时数字还是运算符,若是运算符又是运算符中的哪类运算符,然后进行加减乘除运算,最后将运算结果存入到保存数字的存储区中,运用到显示输出模块最后的运算结果显示出来,从而实现了对带符号数的计算器功能。通过这次课程设计,我们小组在汇编语言上守护了很多东西,在宏定义、宏调用和子程序定义,调用方面,我学到了比以前更多的知识,尤其是通过子程序调用宏这种嵌套模式可以简化许多复杂的程序,让程序更加简洁易懂,此外,这次课程设计让我认识到了上课认真听讲的必要性,老师在课堂上讲解的许多知识都很重要,在本次试验设计中充分体现了这一点,所以学好课堂老师讲解的的许多知识很有必要。从今往后,我会加倍努力学习汇编方面的知识,使自己的能力得以提高。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1