汇编语言实现十进制加减计算器.docx
《汇编语言实现十进制加减计算器.docx》由会员分享,可在线阅读,更多相关《汇编语言实现十进制加减计算器.docx(31页珍藏版)》请在冰豆网上搜索。
![汇编语言实现十进制加减计算器.docx](https://file1.bdocx.com/fileroot1/2023-1/23/63b66c8a-14af-49b0-818f-749d4098519e/63b66c8a-14af-49b0-818f-749d4098519e1.gif)
汇编语言实现十进制加减计算器
学号:
0120810340816
课程设计
题目
十进制数加减计算器
学院
计算机科学与技术
专业
计算机科学与技术
班级
计算机0808班
姓名
何爽
指导教师
袁小玲
2010
年
12
月
31
日
课程设计任务书
学生姓名:
何爽专业班级:
计算机0808班
指导教师:
袁小玲工作单位:
计算机科学与技术学院
题目:
十进制数加减计算器的设计
初始条件:
理论:
学完“汇编语言程序设计”、“课程计算机概论”、“高级语言程序设计”和“数字逻辑”。
实践:
计算机学院科学系实验中心提供计算机和软件平台。
如果自己有计算机可以在其上进行设计。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
(1)十进制数加减计算器的设计。
(2)程序应有操作提示、输入和输出,界面追求友好,最好是菜单式的界面。
(3)设计若干用例(测试数据),上机测试程序并分析(评价)所设计的程序。
(4)设计报告格式按附件要求书写。
课程设计报告书正文的内容应包括:
在正文第一行写课程设计题目;
1.需求说明(要求、功能简述)或问题描述;
2.设计说明(简要的分析与概要设计);
3.详细的算法描述;
4.源程序与执行结果(含测试方法和测试结果);
5.使用说明;
6.总结,包括设计心得(设计的特点、不足、收获与体会)和展望(该程序进一步改进扩展的设想)。
时间安排:
设计时间一周:
周1:
查阅相关资料。
周2:
系统分析,设计。
周3~4:
编程并上机调试。
周5:
撰写课程设计报告。
设计验收安排:
20周星期五8:
00起到计算机学院科学系实验中心进行上机验收。
设计报告书收取时间:
20周的星期五下午5:
00之前。
指导教师签名:
2010年12月31日
系主任(或责任教师)签名:
2010年12月31日
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
实现代码
ret
outputdecendp
(4)加法运算
addfunproc
显示mess1;提示输入第一个数
callinputdec;输入第一个数
显示mess2;提示输入第二个数
callinputdec;输入第二个数
做加法运算
显示mess3;提示输入第一个数
callshow;输出运算表达式
ret
addfunendp
(5)减法运算
subtractproc
显示mess1;提示输入第一个数
callinputdec;输入第一个数
显示mess2;提示输入第二个数
callinputdec;输入第二个数
做减法运算
显示mess3;提示输入第一个数
callshow;输出运算表达式
ret
subtractendp
(6)输出运表达算式函数
showproc
calloutputdec;输出第一个数
输出运算符号
calloutputdec;输出第二个数
输出等号
calloutputdec;输出运算结果
ret
showendp
(7)回车换行
crlfproc
实现代码
ret
crlfendp
2.2.2主函数结构
mainproc
显示menu;供选择
输入选项
判断选项
Case1:
calladdfun
Case2:
callsubtract
Case3:
退出程序
mainendp
3.详细的算法描述
3.1详细的算法描述
(1)main函数
mainproc
pushds
xorax,ax
pushax
movax,data
movds,ax
ks:
leadx,menu;输出菜单项
movah,09h
int21h
moval,0
movah,01h;输入选择项
int21h
subal,30h
cmpal,2;判断选择项
jzl2;如果输入为2,则跳转到l2
cmpal,1
jzl1;如果输入为1,则跳转到l1
movah,4ch;这两句为正常返回dos界面
int21h
l1:
calladdfun;调用加法函数
jmpks;返回到菜单
l2:
callsubtract;调用减法操作
jmpks;返回到菜单
mainendp
(2)addfun函数(加法运算函数)
addfunproc
callcrlf
movbp,1;给下面的show输出中间的运算符做标记,1为加号
leadx,mess1;给出输入第一个数的提示信息
movah,09h
int21h
callinputdec;调用输入函数,输入第一个数
movsi,bx;第一个数保存在si中
leadx,mess2;给出输入第二个数的提示信息
movah,09h
int21h
callinputdec;调用输入函数,输入第二个数
movdi,bx;第二个数保存在di中
movbx,si;将第一个数保存到bx中,再进行操作,以免影响到的输出
addbx,di;第一个数和第二个数相加,结果保存在bx中
leadx,mess3;给出输出结果的提示信息
movah,09h
int21h
callshow;调用show函数,输出算术表达式
ret;返回函数调用处
addfunendp
(3)subtract函数(减法运算函数)
subtractproc
callcrlf
movbp,2;给下面的show输出中间的运算符做标记,2为减号
leadx,mess1;给出输入第一个数的提示信息
movah,09h
int21h
callinputdec;调用输入函数,输入第一个数
movsi,bx;第一个数保存在si中
leadx,mess2;给出输入第一个数的提示信息
movah,09h
int21h
callinputdec;调用输入函数,输入第一个数
movdi,bx;第二个数保存在di中
movbx,si
cmpbx,di;比较第一个数和第二人数的大小
jssubl1;如果为负(第一个数小一些)则跳转
subbx,di;否则直接进行计算,结果保存在bx中
jmpsubl2
subl1:
movbp,3;为show里面是否输出负号作准备,3的时候要输出负号
pushdi;先将第二个操作数进栈,否则下面的减法操作会将其值改变
subdi,bx
movbx,di
popdi;第二个操作数出栈,再赋给di寄存器
subl2:
leadx,mess3;输出运算表达式的提示
movah,09h
int21h
callshow;调用show函数,输出运算表达式
ret
subtractendp
(4)inputdec函数(十进制输入函数)
inputdecproc
movbx,0
il0:
movah,01h;输入数字
int21h
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
ret
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则不输出万位
movbp,1;如果万位不为0,则应将bp设为1,以后的0都要输出
ordl,30h
movah,02h
int21h;输出万位
ol0:
movax,bx;输出千位的方法与万位相同
movdx,0
movcx,1000
divcx;字操作,商在ax中,余数在dx中
movbx,dx;保存余数,作为下一次裤除数
movdl,al
cmpbp,0
jzol1
ordl,30h
movah,02h
int21h;输出千位
jmpol2
ol1:
cmpdl,0
jzol2
movbp,1
ordl,30h
movah,02h
int21h;输出千位
ol2:
movax,bx;输出百位与千位、万位方法相同
movdx,0
movcx,100
divcx;字操作,商在ax中,余数在dx中
movbx,dx;保存余数,作为下一次裤除数
movdl,al
cmpbp,0
jzol3
movbp,1
ordl,30h
movah,02h
int21h;输出百位
jmpol4
ol3:
cmpdl,0
jzol4
ordl,30h
movah,02h
int21h;输出百位
ol4:
movax,bx;输出十位的方法与前面几位方法相同
movcl,10
divcl;字节操作,商在al中,余数在ah中
movbl,ah;保存余数,作为下一次裤除数,也就是个位数
movdl,al
cmpbp,0
jzol5
movbp,1
ordl,30h
movah,02h
int21h;输出十位
jmpol6
ol5:
cmpdl,0
jzol6
ordl,30h
movah,02h
int21h;输出十位
ol6:
movdl,bl;在上面,bl中的数直接就应该为个位,所以直接输出
ordl,30h
movah,02h
int21h
popbp;恢复bp
ret
outputdecendp
(6)show函数(输出运算表达式函数)
showproc
pushbx;把运算结果保存起来
movbx,si;第一个数放在si中
calloutputdec;输出第一个数
cmpbp,3;是否为减号
jzsl0
cmpbp,2;判断是否为减号
jzsl0
leadx,mess5;输出加号
movah,09h
int21h
jmpsl1
sl0:
leadx,mess4;输出减号
movah,09h
int21h
sl1:
movbx,di;第二个数放在di中
calloutputdec;输出第二个数
leadx,mess6;输出等号
movah,09h
int21h
cmpbp,3;判断是否需要输出负号
jnzsl2
leadx,mess4;输出负号
movah,09h
int21h
sl2:
popbx;得到运算结果
calloutputdec;输出运算结果
callcrlf
ret
showendp
(7)crlf函数(输出回车换行函数)
crlfproc
pushax
pushdx
movah,02h
movdl,0dh;输出回车
int21h
movdl,0ah;输出换行
int21h;ah值被改变
popdx
popax
ret
crlfendp
3.2算法流程图
3.2.1程序流程图
Y
N
Y
N
返回
返回
3.2.2十进制输入(inputdec)流程图
N
Y
3.2.3十进制输出(outputdec)流程图
N
Y
待输出数不是个位数
Y
N
3.2.4输出算术表达式(show)流程图
2or3
加法
1
N
4.源程序与执行结果(含测试方法和测试结果)
4.1源程序
assumecs:
code,ds:
data
datasegment;定义数据段
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'=$'
dataends;数据段结束
codesegment;定义代码段
mainproc;主函数
pushds
xorax,ax
pushax
movax,data
movds,ax
ks:
leadx,menu
movah,09h
int21h
moval,0
movah,01h
int21h
subal,30h
cmpal,2
jzl2
cmpal,1
jzl1
movah,4ch
int21h
l1:
calladdfun
jmpks
l2:
callsubtract
jmpks
mainendp;主函数结束
addfunproc;加法运算函数
callcrlf
movbp,1;给下面的show输出中间的运算符做标记
leadx,mess1
movah,09h
int21h
callinputdec
movsi,bx;第一个数保存在si中
leadx,mess2
movah,09h
int21h
callinputdec
movdi,bx;第二个数保存在di中
movbx,si
addbx,di
leadx,mess3
movah,09h
int21h
callshow;输出结果
ret
addfunendp;加法运算函数结束
subtractproc;减法运算函数
callcrlf
movbp,2;给下面的show输出中间的运算符做标记
leadx,mess1
movah,09h
int21h
callinputdec
movsi,bx;第一个数保存在si中
leadx,mess2
movah,09h
int21h
callinputdec
movdi,bx;第二个数保存在di中
movbx,si
cmpbx,di
jssubl1;如果为负则跳转
subbx,di
jmpsubl2
subl1:
movbp,3;为show里面是否输出负号作准备
pushdi
subdi,bx
movbx,di
popdi
subl2:
leadx,mess3
movah,09h
int21h
callshow
ret
subtractendp;减法运算函数结束
inputdecproc;十进制输入函数
movbx,0
il0:
movah,01h
int21h
cmpal,0dh;判断是否为回车
jziexit
subal,30h
movah,0
xchgbx,ax
movcl,10
mulcl
addbx,ax
jmpil0
iexit:
callcrlf
ret
inputdecendp;十进制输入函数结束
outputdecproc;十进制输出函数
pushbp;用来做前导0的标记
movbp,0
movax,bx
movdx,0;在进行除法之前,要对dx赋0,否则结果overdevide
movcx,10000
divcx;字操作,商在ax中,余数在dx中
movbx,dx;保存余数,作为下一次裤除数
movdl,al
cmpdl,0
jzol0
movbp,1
ordl,30h
movah,02h
int21h;输出万位
ol0:
movax,bx
movdx,0
movcx,1000
divcx;字操作,商在ax中,余数在dx中
movbx,dx;保存余数,作为下一次裤除数
movdl,al
cmpbp,0
jzol1
ordl,30h
movah,02h
int21h;输出千位
jmpol2
ol1:
cmpdl,0
jzol2
movbp,1
ordl,30h
movah,02h
int21h;输出千位
ol2:
movax,bx
movdx,0
movcx,100
divcx;字操作,商在ax中,余数在dx中
movbx,dx;保存余数,作为下一次裤除数
movdl,al
cmpbp,0
jzol3
ordl,30h
movah,02h
int21h;输出百位
jmpol4
ol3:
cmpdl,0
jzol4
movbp,1
ordl,30h
m