十进制数加减计算器地设计.docx
《十进制数加减计算器地设计.docx》由会员分享,可在线阅读,更多相关《十进制数加减计算器地设计.docx(12页珍藏版)》请在冰豆网上搜索。
十进制数加减计算器地设计
十进制数加减计算器的设计
1问题描述
用汇编语言设计一个十进制数加减计算器,能够实现两个二位十进制数的加减运算,并具有友好的界面。
2设计说明
该程序数据流程图:
开始
输入DATA1,DATA2
选择运算类型?
+,-?
初始化界面
进行加法运算
进行减法运算
显示运算结果
继续计算?
退出
除ESC外任意键
ESC
键盘输入+
键盘输入-
3详细的算法描述
定义两个数据段,通过键盘输入,存储于AX,BX中,选择运算符号“+或-”,自动运算AX,BX中的数据,然后将结果转化为十进制输出。
(详细解释见源程序)
4源程序与执行结果
4.1源程序:
CURSMACROA,B
MOVAH,2;置光标位置
MOVBH,0;页号为0
MOVDH,A;设置光标的坐标为(A.B)
MOVDL,B
INT10H;BIOS调用
ENDM
;-------------------------------
DISPMSGMACROMESSAGE
LEADX,MESSAGE;传递MESSAGE的偏移地址
MOVAH,9;显示字符串
INT21H;DOS调用
ENDM
;----------------------------------
CLEARMACROCOLOR;清屏
MOVAH,6;屏幕初始化
MOVAL,0;页号
MOVCH,0;设置左上角的坐标为(0,0)
MOVCL,0
MOVDL,100;设置右上角的坐标为(100,100)
MOVDH,100
MOVBH,COLOR;卷入行属性
INT10H;BIOS调用
ENDM
.MODELSMALL
.STACK
.DATA;数据段定义
MSG0DB'********************',0DH,0AH;,0dh,0ah,0dh,0ah
DB'**',0DH,0AH
;db'**',0dh,0ah
;db'**',0dh,0ah
DB'*--------COUNTER--------*',0DH,0AH;,0dh,0ah,0dh,0ah
DB'**',0DH,0AH
DB'**',0DH,0AH
DB'**',0DH,0AH
DB'*DATA1:
'
DB'_______________*',0DH,0AH;,0dh,0ah,0dh,0ah,0dh
DB'**',0DH,0AH
DB'**',0DH,0AH
DB'**',0DH
DB'*DATA2:
'
DB'_______________*',0DH,0AH;,0dh,0ah,0dh,0ah,0dh
DB'**',0DH,0AH
DB'**',0DH,0AH
DB'**',0DH
DB'*RESULT:
'
DB'_______________*',0DH,0AH,0DH;,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh
DB'**',0DH,0AH
DB'**',0DH,0AH
DB'**',0DH,0AH
DB'**',0DH,0AH
DB'**',0DH,0AH
DB'********************','$'
MSG1DB'choose+,-','$'
MSG2DB'youchoosewrong','$',0AH,0DH
MSG3DB'PressESCtoExit!
',0DH,0AH,'$'
MSG4DB'Pressanykeytocontinue!
',0DH,0AH,'$'
MSG5DB'-','$'
MSG6DB'.','$'
MSG7DB'errorinput!
','$'
MSG8DB'data2iswrong!
','$'
DATA1DW?
DATA2DW?
.CODE;代码段从这里开始
;--------------------------------------------
DEC_DIVPROCNEAR
CWD;将字转换为双字,AX内容符号扩展到DX
DIVCX
PUSHDX
MOVDL,AL
ADDDL,30H;将不是数字的字符转换为数字
MOVAH,2;显示输出
INT21H;DOS调用
POPDX
MOVAX,DX
RET
DEC_DIVENDP
;------------------------------------------
CHANGEPROCNEAR;该子程序的功能:
将AX中存储的十六进制数转换为十进制数
CMPAX,1000
JAEC1;AX≥1000则转移
CMPAX,100
JAEC2;AX≥100则转移
CMPAX,10
JAEC3;AX≥10则转移
JMPC4;AX<10
C1:
MOVCX,1000D
CALLDEC_DIV
C2:
MOVCX,100D
CALLDEC_DIV
C3:
MOVCX,10D
CALLDEC_DIV
C4:
MOVCX,1D
CALLDEC_DIV
RET
CHANGEENDP
;-------------------------------
BEGINPROCNEAR
BACK:
CLEAR1EH
CURS2,20;设置光标为(2.20)
DISPMSGMSG0;显示用户界面
CURS8,41;设置光标为(8,41),第一行
MOVBX,0
MOVCX,2
NEWCHAR1:
MOVAH,1;键盘输入并回显
INT21H;DOS调用
CMPAL,30H;检查输入的字符是不是数字
JAEJ1;如果不是,则转移至J1
JMPD2;是,转移到D2执行
J1:
CMPAL,39H;与9的ASCII侣氡
JBEJ2;如果输入的字符是0-9,则转移至J2
JMPD2;如果不是数字,则转移至D2
J2:
SUBAL,30H
CBW;AL的内容符号扩展到AH
XCHGAX,BX
MOVDI,10
MULDI
XCHGAX,BX
ADDBX,AX
LOOPNEWCHAR1
MOVDATA1,BX
CURS11,41;设置光标位为(11,40),第二行
MOVBX,0
MOVCX,2
NEWCHAR2:
MOVAH,1;键盘输入并回显
INT21H;DOS调用
CMPAL,30H;与0的ASCII码比较
JAEJ3;如果输入数字大于等于0则跳转至J3
JMPD2
J3:
CMPAL,39H;与9比较
JBEJ4;如果小于或等于9则跳转
JMPD2;如果输入不是数字则跳转
J4:
SUBAL,30H;如果输入不是0-9,则转化成相应的字符
CBW;将AL符号扩展到AH
XCHGAX,BX
MOVDI,10
MULDI
XCHGAX,BX
ADDBX,AX
LOOPNEWCHAR2
MOVDATA2,BX
MOVAX,DATA1
MOVBX,DATA2
PUSHAX
PUSHBX
CURS15,33;设置光标的位置为(15.33),第三行
DISPMSGMSG1;显示提示信息
MOVAH,1;接受键盘输入并回显
INT21H;DOS调用
CMPAL,'+'
JEADDI;如果运算符为+,则计算两数之和
CMPAL,'-'
JESUBT;如果运算符为-,则计算两数之差
CURS16,25;设置光标为(16,25)
DISPMSGMSG2;在屏幕上输出提示信息
JMPD1
;----------------------------------------
;ADDTHETWODATAS
ADDI:
POPBX
POPAX
ADDAX,BX;计算两数字之和
PUSHAX
CURS14,41;设置光标位置为(14,41)
POPAX
CALLCHANGE;将结果转换为十进制数
JMPD1
;---------------------------------------
;SUBTRACTTHETWODATAS
SUBT:
POPBX
POPAX
CMPAX,BX;比较两数大小
JAED0;如果AX>=BX则跳转
XCHGAX,BX
PUSHAX
PUSHBX
CURS14,40;设置光标位置为(14,40)
DISPMSGMSG5;在屏幕上显示负号
POPBX
POPAX
D0:
SUBAX,BX;计算两数之差
PUSHAX
CURS14,41;设置光标位置为(14,41)
POPAX
CALLCHANGE;将结果转换为十进制数
JMPD1
;---------------------------------------
D1:
RET
D2:
PUSHAX
PUSHBX
CURS15,33;设置光标位置为(15,33)
DISPMSGMSG7;提示输入出错
POPBX
POPAX
RET
BEGINENDP
;----------------------------------------
MAINPROCNEAR
MOVAX,@DATA
MOVDS,AX
MOVES,AX
PUSHDS
XORAX,AX
PUSHAX
MOVDATA2,0;将缓冲区清空
MOVDATA1,0
AGAIN:
CALLBEGIN
CURS16,23;设置光标位置为(16.23)
DISPMSGMSG3;在屏幕上输出提示信息,提示退出的方法
CURS17,23;设置光标位置为(17.23)
DISPMSGMSG4;在屏幕上输出提示信息,提示继续的方法
MOVAH,7;键盘输入,无回显
INT21H;DOS调用
CMPAL,27;判断输入的是否为ESC
JNEAGAIN;如果不是就继续执行以上运算
EXIT:
MOVAX,4C00H;如果是就退出系统
INT21H;DOS调用
MAINENDP
ENDMAIN
4.2对源程序汇编生成目标文件
4.3链接目标文件生成可执行文件“12.EXE”,并用DEBUG命令调试程序
4.4运行最终可执行程序“12.EXE”,执行结果:
5使用说明
打开可执行文件“十进制加减计算器.exe”,键盘输入需要运算的两个十进制数,然后小键盘选择运算符号,则程序自动运算两个数并输出结果,并提供选择“ESC退出”、“任意键继续”。
6总结
6.1设计心得:
通过本次汇编课程设计,让我对汇编这门计算机低级语言有了更深的认识。
汇编是低级语言,也就是说对一个人的编程思想要求会高一些。
可用的资源很少,某些指令只能用某些寄存器,指令也不多,所以怎么尽量少用寄存器,怎么充分利用每一份资源就很重要。
所以汇编编程前一定得先画好流程图,以梳理编程思路,提前想好哪步怎么走。
汇编就像写好文章,得先列好提纲才能写好。
6.2设计展望:
本程序只能进行2位十进制数的加减运算,如果加以改进,可以进行乘法和除法的运算,也可以扩展为任意十进制数的运算。
使之成为功能更强大的计算器。