汇编语言实现十进制加减计算器_第1页
汇编语言实现十进制加减计算器_第2页
汇编语言实现十进制加减计算器_第3页
汇编语言实现十进制加减计算器_第4页
汇编语言实现十进制加减计算器_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、24武汉理工大学汇编语言程序设计课程设计说明学 号: 0120810340816课 程 设 计题 目十进制数加减计算器学 院计算机科学与技术专 业计算机科学与技术班 级计算机0808班姓 名何爽指导教师袁小玲2010年12月31日课程设计任务书学生姓名: 何爽 专业班级: 计算机0808班 指导教师: 袁小玲 工作单位:计算机科学与技术学院 题 目: 十进制数加减计算器的设计 初始条件:理论:学完“汇编语言程序设计”、“课程计算机概论”、“高级语言程序设计”和“数字逻辑”。实践:计算机学院科学系实验中心提供计算机和软件平台。如果自己有计算机可以在其上进行设计。要求完成的主要任务: (包括课程设

2、计工作量及其技术要求,以及说明书撰写等具体要求)(1) 十进制数加减计算器的设计。(2) 程序应有操作提示、输入和输出,界面追求友好,最好是菜单式的界面。(3) 设计若干用例(测试数据),上机测试程序并分析(评价)所设计的程序。(4) 设计报告格式按附件要求书写。课程设计报告书正文的内容应包括:在正文第一行写课程设计题目;1.需求说明(要求、功能简述)或问题描述;2.设计说明(简要的分析与概要设计);3.详细的算法描述;4.源程序与执行结果(含测试方法和测试结果);5.使用说明;6.总结,包括设计心得(设计的特点、不足、收获与体会)和展望(该程序进一步改进扩展的设想)。时间安排:设计时间一周:

3、 周1:查阅相关资料。周2:系统分析,设计。周34:编程并上机调试。周5:撰写课程设计报告。设计验收安排:20周星期五8:00起到计算机学院科学系实验中心进行上机验收。设计报告书收取时间:20周的星期五下午5:00之前。指导教师签名: 2010年12月31日系主任(或责任教师)签名: 2010年12月31日目录1.需求说明 42.设计说明 4 2.1 简要分析 4 2.2 概要设计 4 2.2.1 主要模块 4 2.2.2 主函数结构. 53.详细的算法描述 6 3.1 详细的算法描述 6 3.2 算法流程图 11 3.2.1 程序流程图 11 3.2.2 输入函数(inputdec)流程图.

4、 12 3.2.3 输出函数(outputdec)流程图. 12 3.2.4 输出算术表达式函数(show)流程图 134.源程序与执行结果 13 4.1 源程序.13 4.2 执行结果 19 4.2.1 测试方法 19 4.2.2 测试结果.195.使用说明.206.总结.21十进制数加减计算器的设计1.需求说明 十进制数加减计算器的设计,要求完成:(1) 用汇编语言正确编写程序,完成简单的十进制数的加减运算,(2) 求能正确进行输入和输出操作,界面追求友好,尽量实现菜单操作(3) 用若干测试用例来测试程序的正确性2.设计说明2.1 简要分析 要正确、友好地完成用汇编语言设计十进制数的加减计

5、算器,我们应该完成以下几个功能:(1) 相关菜单及字符输出的设计(2) 十进制数的输入(3) 十进制数的输出(4) 加法运算(5) 减法运算(6) 输出运算表达式(7) 回车换行功能(因为为了控制格式,经常要用到)2.2 概要设计2.2.1 主要模块(1)菜单及字符 menu db |-|0dh,0ah db | 1.Add |0dh,0ah db | 2.Sub |0dh,0ahdb | 0.Exit |0dh,0ahdb |-|0dh,0ahdb Please input your choice:$ mess1 db Please input the first number: $ mes

6、s2 db Please input the second number: $ mess3 db The result is : $ mess4 db -$ mess5 db +$mess6 db =$(2)十进制数的输入inputdec proc 实现代码 retinputdec endp(3)十进制数的输出outputdec proc 实现代码 retoutputdec endp(4) 加法运算addfun proc显示mess1 ;提示输入第一个数call inputdec ;输入第一个数显示 mess2 ;提示输入第二个数call inputdec ;输入第二个数做加法运算显示mess

7、3 ;提示输入第一个数call show ;输出运算表达式retaddfun endp(5) 减法运算subtract proc 显示mess1 ;提示输入第一个数call inputdec ;输入第一个数显示 mess2 ;提示输入第二个数call inputdec ;输入第二个数做减法运算显示mess3 ;提示输入第一个数call show ;输出运算表达式retsubtract endp(6) 输出运表达算式函数show proccall outputdec ;输出第一个数输出运算符号call outputdec ;输出第二个数输出等号call outputdec ;输出运算结果rets

8、how endp(7) 回车换行crlf proc实现代码retcrlf endp2.2.2 主函数结构 main proc 显示menu ;供选择 输入选项 判断选项 Case 1: call addfun Case 2: call subtract Case 3: 退出程序 main endp3.详细的算法描述3.1详细的算法描述 (1)main函数 main proc push ds xor ax,ax push ax mov ax,data mov ds,ax ks:lea dx,menu ;输出菜单项 mov ah,09h int 21h mov al,0 mov ah,01h;输入

9、选择项 int 21h sub al,30h cmp al,2 ;判断选择项 jz l2 ;如果输入为2 ,则跳转到l2 cmp al,1 jz l1 ;如果输入为1,则跳转到l1 mov ah,4ch ;这两句为正常返回dos界面 int 21h l1:call addfun ;调用加法函数 jmp ks ;返回到菜单 l2: call subtract;调用减法操作 jmp ks ;返回到菜单 main endp (2)addfun函数(加法运算函数) addfun proc call crlf mov bp,1 ;给下面的show输出中间的运算符做标记,1为加号 lea dx,mess1

10、 ;给出输入第一个数的提示信息 mov ah,09h int 21h call inputdec;调用输入函数,输入第一个数 mov si,bx ;第一个数保存在si中 lea dx,mess2 ;给出输入第二个数的提示信息 mov ah,09h int 21h call inputdec;调用输入函数,输入第二个数 mov di,bx ;第二个数保存在di中 mov bx,si ;将第一个数保存到bx中,再进行操作,以免影响到的输出 add bx,di ;第一个数和第二个数相加,结果保存在bx中 lea dx,mess3 ;给出输出结果的提示信息 mov ah,09h int 21h cal

11、l show ;调用show函数,输出算术表达式 ret ;返回函数调用处 addfun endp(3)subtract函数(减法运算函数) subtract proc call crlf mov bp,2 ;给下面的show输出中间的运算符做标记,2为减号 lea dx,mess1;给出输入第一个数的提示信息 mov ah,09h int 21h call inputdec;调用输入函数,输入第一个数 mov si,bx ;第一个数保存在si中 lea dx,mess2 ;给出输入第一个数的提示信息 mov ah,09h int 21h call inputdec;调用输入函数,输入第一个数

12、 mov di,bx ;第二个数保存在di中 mov bx,si cmp bx,di ;比较第一个数和第二人数的大小 js subl1 ;如果为负(第一个数小一些)则跳转 sub bx,di ;否则直接进行计算,结果保存在bx中 jmp subl2 subl1:mov bp,3 ;为show里面是否输出负号作准备,3的时候要输出负号 push di ;先将第二个操作数进栈,否则下面的减法操作会将其值改变 sub di,bx mov bx,di pop di ;第二个操作数出栈,再赋给di寄存器 subl2:lea dx,mess3 ;输出运算表达式的提示 mov ah,09h int 21h

13、call show ;调用show函数,输出运算表达式 ret subtract endp(4)inputdec函数(十进制输入函数) inputdec proc mov bx,0 il0:mov ah,01h ;输入数字 int 21h cmp al,0dh ;判断是否为回车 jz iexit ;如果是回车,则返回到函数调用处 sub al,30h ;得到输入数字的真实大小 mov ah,0 xchg bx,ax ;将bx值与ax值交换,因为下面乘以10是将ax中的值乘10 mov cx,10 ;注意,这里不能用CL,否则数较大时就会出现问题 mul cx ;将ax中的值乘以10,也就是将b

14、x中原来的值乘以10 add bx,ax jmp il0 ;进行输入下一数值位 iexit:call crlf ret inputdec endp(5)outputdec函数(十进制输出函数) outputdec proc push bp mov bp,0 ;前导0输出与否的标志,0时不输出,1时输出 mov ax,bx mov dx,0 ;在进行除法之前,要对dx赋0,否则结果出错 mov cx,10000 div cx ;除法,字操作,商在ax中,余数在dx中 mov bx,dx ;保存余数,作为下一次裤除数 mov dl,al cmp dl,0 ;将万位同0比较 jz ol0 ;如果万位

15、为0则不输出万位 mov bp,1 ;如果万位不为0,则应将bp设为1,以后的0都要输出 or dl,30h mov ah,02h int 21h ;输出万位 ol0:mov ax,bx ;输出千位的方法与万位相同 mov dx,0 mov cx,1000 div cx ;字操作,商在ax中,余数在dx中 mov bx,dx ;保存余数,作为下一次裤除数 mov dl,al cmp bp,0 jz ol1 or dl,30h mov ah,02h int 21h ;输出千位 jmp ol2 ol1:cmp dl,0 jz ol2 mov bp,1 or dl,30h mov ah,02h in

16、t 21h ;输出千位 ol2:mov ax,bx ;输出百位与千位、万位方法相同 mov dx,0 mov cx,100 div cx ;字操作,商在ax中,余数在dx中 mov bx,dx ;保存余数,作为下一次裤除数 mov dl,al cmp bp,0 jz ol3 mov bp,1 or dl,30h mov ah,02h int 21h ;输出百位 jmp ol4 ol3:cmp dl,0 jz ol4 or dl,30h mov ah,02h int 21h ;输出百位 ol4:mov ax,bx ;输出十位的方法与前面几位方法相同 mov cl,10 div cl ;字节操作,

17、商在al中,余数在ah中 mov bl,ah ;保存余数,作为下一次裤除数,也就是个位数 mov dl,al cmp bp,0 jz ol5 mov bp,1 or dl,30h mov ah,02h int 21h ;输出十位 jmp ol6 ol5:cmp dl,0 jz ol6 or dl,30h mov ah,02h int 21h ;输出十位 ol6:mov dl,bl ;在上面,bl中的数直接就应该为个位,所以直接输出 or dl,30h mov ah,02h int 21h pop bp ;恢复bp ret outputdec endp(6)show函数(输出运算表达式函数) s

18、how proc push bx ;把运算结果保存起来 mov bx,si ;第一个数放在si中 call outputdec;输出第一个数 cmp bp,3 ;是否为减号 jz sl0 cmp bp,2 ;判断是否为减号 jz sl0 lea dx,mess5 ;输出加号 mov ah,09h int 21h jmp sl1 sl0:lea dx,mess4 ;输出减号 mov ah,09h int 21h sl1:mov bx,di ;第二个数放在di中 call outputdec ;输出第二个数 lea dx,mess6 ;输出等号 mov ah,09h int 21h cmp bp,

19、3 ;判断是否需要输出负号 jnz sl2 lea dx,mess4 ;输出负号 mov ah,09h int 21h sl2:pop bx ;得到运算结果 call outputdec;输出运算结果 call crlf ret show endp(7)crlf函数(输出回车换行函数) crlf proc push ax push dx mov ah,02h mov dl,0dh ;输出回车 int 21h mov dl,0ah ;输出换行 int 21h ;ah值被改变 pop dx pop ax ret crlf endp3.2 算法流程图开始显示菜单输入选择项值为2吗值为1吗结束调用减法

20、函数调用加法函数调用inputdec输入第一个数调用inputdec输入第二个数调用addfun做加法运算调用inputdec输入第一个数调用inputdec输入第二个数调用subtract做减法运算调用show输运算表达式3.2.1 程序流程图 Y N YN 调用show输运算表达式 返回 返回3.2.2 十进制输入(inputdec)流程图开始判断是否为回车保存数字返回函数调用处输入数字 N Y 3.2.3 十进制输出(outputdec)流程图开始待输出数字除以10000/1000/100/10100/10设前导0标志bp=0将余数设置为下一次待输出数bp=1输出商数商数是否为0输出商数

21、并 将bp设为1输出个位数返回函数调用处 N Y 待输出数不是个位数 Y N3.2.4 输出算术表达式(show)流程图开始输出第一个数判断加减法bp=1 ,2,3输出加号输出第二个数输出等号判断bp=3?输出负号输出运算结果返回函数调用处 2 or 3输出减号 加法 1 N4.源程序与执行结果(含测试方法和测试结果)4.1 源程序 assume cs:code,ds:data data segment ;定义数据段 menu db |-|0dh,0ah db | 1.Add |0dh,0ah db | 2.Sub |0dh,0ahdb | 0.Exit |0dh,0ahdb |-|0dh,0

22、ahdb Please input your choice:$ mess1 db Please input the first number: $ mess2 db Please input the second number: $ mess3 db The result is : $ mess4 db -$ mess5 db +$mess6 db =$data ends ;数据段结束code segment ;定义代码段 main proc ;主函数 push ds xor ax,ax push ax mov ax,data mov ds,ax ks:lea dx,menu mov ah,0

23、9h int 21h mov al,0 mov ah,01h int 21h sub al,30h cmp al,2 jz l2 cmp al,1 jz l1 mov ah,4ch int 21h l1:call addfun jmp ks l2: call subtract jmp ks main endp ;主函数结束 addfun proc ;加法运算函数 call crlf mov bp,1 ;给下面的show输出中间的运算符做标记 lea dx,mess1 mov ah,09h int 21h call inputdec mov si,bx ;第一个数保存在si中 lea dx,me

24、ss2 mov ah,09h int 21h call inputdec mov di,bx ;第二个数保存在di中 mov bx,si add bx,di lea dx,mess3 mov ah,09h int 21h call show ;输出结果 ret addfun endp ;加法运算函数结束 subtract proc ;减法运算函数 call crlf mov bp,2 ;给下面的show输出中间的运算符做标记 lea dx,mess1 mov ah,09h int 21h call inputdec mov si,bx ;第一个数保存在si中 lea dx,mess2 mov

25、ah,09h int 21h call inputdec mov di,bx ;第二个数保存在di中 mov bx,si cmp bx,di js subl1 ;如果为负则跳转 sub bx,di jmp subl2 subl1:mov bp,3 ;为show里面是否输出负号作准备 push di sub di,bx mov bx,di pop di subl2:lea dx,mess3 mov ah,09h int 21h call show ret subtract endp;减法运算函数结束 inputdec proc ;十进制输入函数 mov bx,0 il0:mov ah,01h i

26、nt 21h cmp al,0dh ;判断是否为回车 jz iexit sub al,30h mov ah,0 xchg bx,ax mov cl,10 mul cl add bx,ax jmp il0 iexit:call crlf ret inputdec endp ;十进制输入函数结束 outputdec proc ;十进制输出函数 push bp ;用来做前导0的标记 mov bp,0 mov ax,bx mov dx,0 ;在进行除法之前,要对dx赋0,否则结果over devide mov cx,10000 div cx ;字操作,商在ax中,余数在dx中 mov bx,dx ;保

27、存余数,作为下一次裤除数 mov dl,al cmp dl,0 jz ol0 mov bp,1 or dl,30h mov ah,02h int 21h ;输出万位 ol0:mov ax,bx mov dx,0 mov cx,1000 div cx ;字操作,商在ax中,余数在dx中 mov bx,dx ;保存余数,作为下一次裤除数 mov dl,al cmp bp,0 jz ol1 or dl,30h mov ah,02h int 21h ;输出千位 jmp ol2 ol1:cmp dl,0 jz ol2 mov bp,1 or dl,30h mov ah,02h int 21h ;输出千位

28、 ol2:mov ax,bx mov dx,0 mov cx,100 div cx ;字操作,商在ax中,余数在dx中 mov bx,dx ;保存余数,作为下一次裤除数 mov dl,al cmp bp,0 jz ol3 or dl,30h mov ah,02h int 21h ;输出百位 jmp ol4 ol3:cmp dl,0 jz ol4 mov bp,1 or dl,30h mov ah,02h int 21h ;输出百位 ol4:mov ax,bx mov cl,10 div cl ;字节操作,商在al中,余数在ah中 mov bl,ah ;保存余数,作为下一次裤除数 mov dl,

29、al cmp bp,0 jz ol5 or dl,30h mov ah,02h int 21h ;输出十位 jmp ol6 ol5:cmp dl,0 jz ol6mov bp,1 or dl,30h mov ah,02h int 21h ;输出十位 ol6:mov dl,bl or dl,30h mov ah,02h int 21h pop bp ;恢复bp ret outputdec endp ;十进制输出函数结 show proc ;输出运算式函数 push bx ;把运算结果保存起来 mov bx,si ;第一个数放在si中 call outputdec cmp bp,3 ;是否为减号

30、jz sl0 cmp bp,2 jz sl0 lea dx,mess5 mov ah,09h int 21h jmp sl1 sl0:lea dx,mess4 mov ah,09h int 21h sl1:mov bx,di ;第二个数放在di中 call outputdec lea dx,mess6 mov ah,09h int 21h cmp bp,3 jnz sl2 lea dx,mess4 mov ah,09h int 21h sl2:pop bx ;得到运算结果 call outputdec call crlf ret show endp ;输出运算式函数结束 crlf proc ;

31、回车换行函数 push ax push dx mov ah,02h mov dl,0dh int 21h mov dl,0ah int 21h ;ah值被改变 pop dx pop ax ret crlf endp ;回车换行函数结束code ends ;代码段结束 end main ;程序结束4.2 执行结果4.2.1 测试方法 本次测试我们采用的是通过菜单形式,输出选择项,然后根据提示信息,输入相关数字,进行举例测试。 对于加法,我们是随便输入两组数:10与1000 122与321 对于减法,我们也是随意输入两组数,200与2 (结果为正的情况) 10与198(结果为负的情况) 对于本题,

32、我们也设置了错误结果测试:加法60000与6000,减法 2与700004.2.2 测试结果 (1)加减法正确测试结果如下:减法测试结果加法测试结果 (2)错误结果显示如下: 错误结果 错误结果分析: 加法,60000+6000等于66000,而我们用的的BX寄存器保存值,BX寄存器最大能保存16位数字,最大能表示的无符号数为:216-1=65535;而值66000超过了范围,66000-216=464,即把66000当成了补码,所以为464 减法,2-70000=69998,与加法错误一样,69998-216=4462,即把4462当成了69998补码。5.使用说明 1.本次程序的使用说明,

33、我们先把源程序拷贝到一个文本文件中,并把它命名为一个汇编程序的格式(*.asm),如ca.asm 2.我们在dos中找到masm.exe与link.exe文件所在的文件夹 masmmasm ca masmlink ca masmca 然后根据提示信息进行相关操作 3.操作示例图如下: 进入dos找到masm.exe所在的文件夹 上一步回车后,进行如图所示的操作 接着一上步回车,输入ca,便进入了操作演示界面6.总结 经过几天的奋斗,本次汇编语言课程设计总算是完成了。本次课程设计,是对我所学汇编语言知识的一次比较综合的检测,同是也是一次很有意义的实践训练。一拿到题目的时候,一看,是设计十进制加减

34、计算器,心里面感觉好像比较简单,好像也有了大体模块: 菜单提示,加法、减法运算操作,十进制输入、输出操作,主函数。可是当我真正的动起手的时候,才发现很多基本问题都忘记了,比如:汇编程序的格式只记得一般都有代码段和数据段,但具体怎么写?菜单,我要怎么设置字符串变量?输入、输出操作,用的是哪个寄存器?比如这些问题,都把我给难住了。 后来看看课本,也把以前写的程序看了看,才对这些基本问题有了比较清楚的了解。写程序确实不是很难,几个基本模块没有花多长时间就写好,但是后来陆续碰到各种各样的错误,修改它可就相当困难了,明明觉得逻辑上应该是对的呀,可是结果却相差很远。典型的错误有以下几种情况。比如,有一次,无论输入什么,程序直接跳出,加法、减法都没有执行。后来分析才发现,是因为在输入选项之后,我为了控制格式,调用了回车换行函数(当时没有对dx,ax进行进栈和出栈操作)再进行判断,此时al的值因为调用int 21h语句而被改变为0了,所以你

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论