武汉理工十进制加减计算器Word文档格式.docx
《武汉理工十进制加减计算器Word文档格式.docx》由会员分享,可在线阅读,更多相关《武汉理工十进制加减计算器Word文档格式.docx(36页珍藏版)》请在冰豆网上搜索。
阅读资料:
1)《IBM—PC汇编语言程序设计实验教程》实验2.4
2)《IBM—PC汇编语言程序设计(第2版)》例6.11
时间安排:
设计安排一周:
周1、周2:
完成系统分析及设计。
周3、周4:
完成程序调试,和验收。
周5:
撰写课程设计报告。
指导教师签名:
2012年06月29日
系主任(或责任教师)签名:
目录
1.需求说明…………………………………………………………………………………………………4
2.设计说明…………………………………………………………………………………………………4
2.1简要分析………………………………………………………………………………………4
2.2概要设计………………………………………………………………………………………4
2.2.1主要模块………………………………………………………………………4
2.2.2主函数结构………………………………………………………………….5
3.详细的算法描述……………………………………………………………………………………6
3.1详细的算法描述…………………………………………………………………………6
3.2算法流程图…………………………………………………………………………………11
3.2.1程序流程图…………………………………………………………………11
3.2.2输入函数(inputdec)流程图………………………….12
3.2.3输出函数(outputdec)流程图……………………….12
3.2.4输出算术表达式函数(show)流程图……………13
4.源程序与执行结果………………………………………………………………………………13
4.1源程序………………………………………………………………………………………….13
4.2执行结果……………………………………………………………………………………19
4.2.1测试方法………………………………………………………………………19
4.2.2测试结果……………………………………………………………………….19
5.使用说明……………………………………………………………………………………………….20
6.总结……………………………………………………………………………………………………….21
十进制数加减计算器的设计
1.需求说明
十进制数加减计算器的设计,要求完成:
(1)用汇编语言正确编写程序,完成简单的十进制数的加减运算,
(2)求能正确进行输入和输出操作,界面追求友好,尽量实现菜单操作
(3)用若干测试用例来测试程序的正确性
2.设计说明
2.1简要分析
要正确、友好地完成用汇编语言设计十进制数的加减计算器,我们应该完成以下几个功能:
(1)相关菜单及字符输出的设计
(2)十进制数的输入
(3)十进制数的输出
(4)加法运算
(5)减法运算
(6)输出运算表达式
(7)回车换行功能(因为为了控制格式,经常要用到)
2.2概要设计
2.2.1主要模块
(1)菜单及字符
menudb‘|--------------------------------------|’0dh,0ah
db‘|1.Add|’0dh,0ah
db‘|2.Sub|’0dh,0ah
db‘|0.Exit|’0dh,0ah
db‘|--------------------------------------|’0dh,0ah
db‘Pleaseinputyourchoice:
$’
mess1db'
Pleaseinputthefirstnumber:
$'
mess2db'
Pleaseinputthesecondnumber:
mess3db'
Theresultis:
mess4db'
-$'
mess5db'
+$'
mess6db'
=$'
(2)十进制数的输入
inputdecproc
实现代码
ret
inputdecendp
(3)十进制数的输出
outputdecproc
outputdecendp
addfunproc
显示mess1;
提示输入第一个数
callinputdec;
输入第一个数
显示mess2;
提示输入第二个数
输入第二个数
做加法运算
显示mess3;
callshow;
输出运算表达式
ret
addfunendp
subtractproc
显示mess1;
做减法运算
subtractendp
(6)输出运表达算式函数
showproc
calloutputdec;
输出第一个数
输出运算符号
输出第二个数
输出等号
输出运算结果
showendp
(7)回车换行
crlfproc
实现代码
crlfendp
2.2.2主函数结构
mainproc
显示menu;
供选择
输入选项
判断选项
Case1:
calladdfun
Case2:
callsubtract
Case3:
退出程序
mainendp
3.详细的算法描述
3.1详细的算法描述
(1)main函数
pushds
xorax,ax
pushax
movax,data
movds,ax
ks:
leadx,menu;
输出菜单项
movah,09h
int21h
moval,0
movah,01h;
输入选择项
subal,30h
cmpal,2;
判断选择项
jzl2;
如果输入为2,则跳转到l2
cmpal,1
jzl1;
如果输入为1,则跳转到l1
movah,4ch;
这两句为正常返回dos界面
l1:
calladdfun;
调用加法函数
jmpks;
返回到菜单
l2:
callsubtract;
调用减法操作
(2)addfun函数(加法运算函数)
addfunproc
callcrlf
movbp,1;
给下面的show输出中间的运算符做标记,1为加号
leadx,mess1;
给出输入第一个数的提示信息
callinputdec;
调用输入函数,输入第一个数
movsi,bx;
第一个数保存在si中
leadx,mess2;
给出输入第二个数的提示信息
调用输入函数,输入第二个数
movdi,bx;
第二个数保存在di中
movbx,si;
将第一个数保存到bx中,再进行操作,以免影响到的输出
addbx,di;
第一个数和第二个数相加,结果保存在bx中
leadx,mess3;
给出输出结果的提示信息
callshow;
调用show函数,输出算术表达式
ret;
返回函数调用处
addfunendp
(3)subtract函数(减法运算函数)
subtractproc
movbp,2;
给下面的show输出中间的运算符做标记,2为减号
leadx,mess1;
movah,09h
movbx,si
cmpbx,di;
比较第一个数和第二人数的大小
jssubl1;
如果为负(第一个数小一些)则跳转
subbx,di;
否则直接进行计算,结果保存在bx中
jmpsubl2
subl1:
movbp,3;
为show里面是否输出负号作准备,3的时候要输出负号
pushdi;
先将第二个操作数进栈,否则下面的减法操作会将其值改变
subdi,bx
movbx,di
popdi;
第二个操作数出栈,再赋给di寄存器
subl2:
leadx,mess3;
输出运算表达式的提示
调用show函数,输出运算表达式
subtractendp
(4)inputdec函数(十进制输入函数)
inputdecproc
movbx,0
il0:
movah,01h;
输入数字
cmpal,0dh;
判断是否为回车
jziexit;
如果是回车,则返回到函数调用处
subal,30h;
得到输入数字的真实大小
movah,0
xchgbx,ax;
将bx值与ax值交换,因为下面乘以10是将ax中的值乘10
movcx,10;
注意,这里不能用CL,否则数较大时就会出现问题
mulcx;
将ax中的值乘以10,也就是将bx中原来的值乘以10
addbx,ax
jmpil0;
进行输入下一数值位
iexit:
callcrlf
inputdecendp
(5)outputdec函数(十进制输出函数)
outputdecproc
pushbp
movbp,0;
前导0输出与否的标志,0时不输出,1时输出
movax,bx
movdx,0;
在进行除法之前,要对dx赋0,否则结果出错
movcx,10000
divcx;
除法,字操作,商在ax中,余数在dx中
movbx,dx;
保存余数,作为下一次裤除数
movdl,al
cmpdl,0;
将万位同0比较
jzol0;
如果万位为0则不输出万位
如果万位不为0,则应将bp设为1,以后的0都要输出
ordl,30h
movah,02h
int21h;
输出万位
ol0:
movax,bx;
输出千位的方法与万位相同
movdx,0
movcx,1000
字操作,商在ax中,余数在dx中
cmpbp,0
jzol1
输出千位
jmpol2
ol1:
cmpdl,0
jzol2
movbp,1
ol2:
输出百位与千位、万位方法相同
movcx,100
jzol3
输出百位
jmpol4
ol3:
jzol4
ol4:
输出十位的方法与前面几位方法相同
movcl,10
divcl;
字节操作,商在al中,余数在ah中
movbl,ah;
保存余数,作为下一次裤除数,也就是个位数
movdl,al
jzol5
输出十位
jmpol6
ol5:
jzol6
ol6:
movdl,bl;
在上面,bl中的数直接就应该为个位,所以直接输出
popbp;
恢复bp
outputdecendp
(6)show函数(输出运算表达式函数)
showproc
pushbx;
把运算结果保存起来
第一个数放在si中
calloutputdec;
cmpbp,3;
是否为减号
jzsl0
cmpbp,2;
判断是否为减号
leadx,mess5;
输出加号
jmpsl1
sl0:
leadx,mess4;
输出减号
sl1:
movbx,di;
第二个数放在di中
calloutputdec;
leadx,mess6;
判断是否需要输出负号
jnzsl2
leadx,mess4;
输出负号
sl2:
popbx;
得到运算结果
showendp
(7)crlf函数(输出回车换行函数)
crlfproc
pushax
pushdx
movah,02h
movdl,0dh;
输出回车
movdl,0ah;
输出换行
ah值被改变
popdx
popax
crlfendp
3.2算法流程图
3.2.1程序流程图
Y
N
Y
N
返回
3.2.2十进制输入(inputdec)流程图
Y
3.2.3十进制输出(outputdec)流程图
待输出数不是个位数
3.2.4输出算术表达式(show)流程图
2or3
加法
1
4.源程序与执行结果(含测试方法和测试结果)
4.1源程序
assumecs:
code,ds:
data
datasegment;
定义数据段
dataends;
数据段结束
codesegment;
定义代码段
mainproc;
主函数
pushds
leadx,menu
movah,01h
cmpal,2
jzl2
jzl1
movah,4ch
calladdfun
jmpks
mainendp;
主函数结束
addfunproc;
加法运算函数
给下面的show输出中间的运算符做标记
leadx,mess1
callinputdec
leadx,mess2
addbx,di
leadx,mess3
输出结果
addfunendp;
加法运算函数结束
subtractproc;
减法运算函数
cmpbx,di
如果为负则跳转
subbx,di
为show里面是否输出负号作准备
pushdi
popdi
leadx,mess3
callshow
subtractendp;
减法运算函数结束
inputdecproc;
十进制输入函数
movah,01h
jziexit
xchgbx,ax
mulcl
addbx,ax
jmpil0
inputdecendp;
十进制输入函数结束
outputdecproc;
十进制输出函数
pushbp;
用来做前导0的标记
movbp,0
movax,bx
在进行除法之前,要对dx赋0,否则结果overdevide
cmpdl,0
jzol0
movax,bx
movbl,