简单计算器8086汇编代码.docx
- 文档编号:4554960
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:21
- 大小:18.02KB
简单计算器8086汇编代码.docx
《简单计算器8086汇编代码.docx》由会员分享,可在线阅读,更多相关《简单计算器8086汇编代码.docx(21页珍藏版)》请在冰豆网上搜索。
简单计算器8086汇编代码
【课题5】模拟十进制计算器(加,减)
(一)设计要求
1.通过小键盘输入,做十进制的加、减运算,允许五位数以内的不同数位的2个数相加或相减,连加与/或连减。
七段数码管显示器的高位作为符号位,其他5位作为输入数据和计算结果的显示。
2.数字用小键盘0~9;功能键为:
A,B,C,D。
C———开始运算(包括取消没有完成的运算),六位七段数码管全部显示‘0’。
A———‘+’,加法操作。
B———‘-’,减法操作。
D———‘=’,计算并显示结果。
3.运算规则(按照一般计算器的功能要求):
a.输入第一个数据,显示器跟随显示。
b.按‘+’或‘-’,显示器内容不变。
c.再输入第二个数据,显示器跟随显示。
d.按‘=’,显示器显示计算结果,当超出能显示的最大值时,显示“F”(溢出)。
e.按‘C’,清除显示,重新开始运算。
(二)提示
1.七段数码管显示和键盘可参考软件实验9、10,LED显示实验,以及可参阅教材第9章有关章节。
2.显示是动态的、要不断刷新,建议把键盘输入与运算作为主程序,动态显示作为子程序,在主程序中调用显示子程序。
(三)要完成的工作
1.设计出完整的汇编语言程序。
2.上机调试,在实验系统中通过验收。
3.写出课程设计报告,内容包括:
设计思想、功能流程图、结果讨论和完整的源程序。
;
(1)通过小键盘做十进制的加、减运算,允许不同数位的5个数相加或相减。
七段数码管显示器作输入数据和结果数据的显示。
;
(2)数字用小键盘0~9,A、B、C、D作功能键。
;C———开始运算(包括撤销运算),显示‘0’。
;A———‘+’。
;B———‘-’。
;D———‘=’。
;E———退出,返回DOS。
;(3)运算顺序:
;①输入一原始数据,显示器跟随显示。
;②按‘+’或‘-’,显示器内容不变。
;③再输入一数据,显示器跟随显示。
;④按‘=’,显示器显示结果数据,当超出能显示的最大值时,显示“FFFFF”(溢出)。
;⑤按‘C’,重新开始运算。
;⑥按‘E’,结束退出。
;******************************************
; 8086系列微机接口实验系统 软件实验项目
; 键盘扫描显示实验
;******************************************
INITMACRONAME
movNAME+0,0ffh
movNAME+1,0c0h
movNAME+2,0ffh
movNAME+3,0ffh
movNAME+4,0ffh
movNAME+5,0ffh
ENDM
codesegment
assumecs:
code
OUTSEGequ0ffdch;段控制口
OUTBITequ0ffddh;位控制口/键扫口
IN_KEYequ0ffdeh;键盘读入口
LedBufdb10dup(?
);显示缓冲
Storedb10dup(?
);存放显示第一组数据
numdb10dup(?
)
Store1db10dup(?
);用于存放第一组数据
num1db10dup(?
);用于存放第二组数据
flagdb0;作为标记位,若为1代表加为0代表减
tempdb0
jinweidb0
jieweidb0
in_flagdb0
Key_Buffdb30dup(?
);用于键盘输入的存储
org1000h
Start:
INITStore
INITnum
INITLedBuf
movsi,-1;设置数组的下标
movStore1+0,0
movStore1+1,0
movStore1+2,0
movStore1+3,0
movStore1+4,0
movnum1+0,0
movnum1+1,0
movnum1+2,0
movnum1+3,0
movnum1+4,0
MLoop:
callDisp;显示
callGetKey;扫描键盘并读取键值
cmpal,20h
jeLL
jmpLL1
LL:
movtemp,0
jmpMLoop
LL1:
pushdx
movdl,temp
movtemp,1
cmpal,09h
jatransmit
cmpKey_Buff[si],al
jzinkey_flag
jmpLL2
inkey_flag:
cmptemp,dl
popdx
jzMLoop
jmpLL2;!
!
注意要加这一句
transmit:
jmpSPECIAL;特殊字符特殊处理
LL2:
incsi
movKey_Buff[si],al;将键盘输入的键盘码放到Key_Buff中
cmpsi,5
jaeabc
pushdx
movdl,Store1+1
movStore1+0,dl
movdl,Store1+2
movStore1+1,dl
movdl,Store1+3
movStore1+2,dl
movdl,Store1+4
movStore1+3,dl
movStore1+4,al
popdx
jmpbcd
abc:
movdi,si
subdi,5
pushdx
movdl,num1+1
movnum1+0,dl
movdl,num1+2
movnum1+1,dl
movdl,num1+3
movnum1+2,dl
movdl,num1+4
movnum1+3,dl
movnum1+4,al
popdx
jmpbcd
bcd:
andal,0fh;显示键码
movah,0
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
cmpsi,5
jaenext1
movStore[si+1],al
jmpback1
next1:
movdi,si
subdi,5
movnum[di+1],al
jmpstart1
back1:
pushdx;将Store里的数据放到Led中,方便以后显示
movdl,Store+1
movLedBuf+1,dl
movdl,Store+2
movLedBuf+2,dl
movdl,Store+3
movLedBuf+3,dl
movdl,Store+4
movLedBuf+4,dl
movdl,Store+5
movLedBuf+5,dl
popdx
jmpMLoop
start1:
INITLedBuf
callDisp
;jmpMLoop
back2:
pushdx
movdl,num+1
movLedBuf+1,dl
movdl,num+2
movLedBuf+2,dl
movdl,num+3
movLedBuf+3,dl
movdl,num+4
movLedBuf+4,dl
movdl,num+5
movLedBuf+5,dl
popdx
jmpMLoop
back3:
pushdx
movdl,Store+0
movLedBuf+0,dl
movdl,Store+1
movLedBuf+1,dl
movdl,Store+2
movLedBuf+2,dl
movdl,Store+3
movLedBuf+3,dl
movdl,Store+4
movLedBuf+4,dl
movdl,Store+5
movLedBuf+5,dl
popdx
jmpMLoop
SPECIAL:
cmpal,0ah
jnedecre
movflag,1
movsi,4
jmpMLoop
decre:
cmpal,0bh
jneRestart
movflag,0
movsi,4
jmpMLoop
Restart:
cmpal,0ch
jneExit
movflag,0
jmpStart
Exit:
cmpal,0eh
jneDisplay
movStore+0,0Ch;显示"P"
movStore+1,0ffh
jmpback1
Display:
cmpal,0dh
jeprint
jmpback3
print:
cmpflag,0
jesubb
jmpadda
subb:
movcl,num1+0;比较两数大小,如果用小数减大数则交换数据
movbl,Store1+0
cmpbl,cl
jbjiaoh
movcl,num1+1
movbl,Store1+1
cmpbl,cl
jbjiaoh
movcl,num1+2
movbl,Store1+2
cmpbl,cl
jbjiaoh
movcl,num1+3
movbl,Store1+3
cmpbl,cl
jbjiaoh
movcl,num1+4
movbl,Store1+4
cmpbl,cl
jbjiaoh
jmpjianfa
jiaoh:
pushdx;交换两个数组中的数值
movdh,num1+0
movdl,Store1+0
movnum1+0,dl
movStore1+0,dh
movdh,num1+1
movdl,Store1+1
movnum1+1,dl
movStore1+1,dh
movdh,num1+2
movdl,Store1+2
movnum1+2,dl
movStore1+2,dh
movdh,num1+3
movdl,Store1+3
movnum1+3,dl
movStore1+3,dh
movdh,num1+4
movdl,Store1+4
movnum1+4,dl
movStore1+4,dh
movStore[0],0BFh;最高位显示“-”
popdx
jianfa:
movcl,num1+4;最低位相减
movbl,Store1+4
cmpbl,cl
jaeH1
movjiewei,1
movbh,0ah
subbh,cl
addbl,bh
movcl,bl
jmpF1
H1:
subbl,cl
movcl,bl
jmpF1
F1:
moval,cl
andal,0fh;显示键码
movah,0
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
movStore[5],al
movcl,num1+3;第二位相减
movbl,Store1+3
subbl,jiewei
cmpbl,0Fh;考虑0被借位变成F
jzN1
jmpM1
N1:
movbl,09h
jmpM1
M1:
movjiewei,0
cmpbl,cl
jaeH2
movjiewei,1
movbh,0ah
subbh,cl
addbl,bh
movcl,bl
jmpF2
H2:
subbl,cl
movcl,bl
jmpF2
F2:
moval,cl
andal,0fh;显示键码
movah,0
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
movStore[4],al
movcl,num1+2;第三位相减
movbl,Store1+2
subbl,jiewei
cmpbl,0Fh;考虑0被借位变成F
jzN2
jmpM2
N2:
movbl,09h
jmpM2
M2:
movjiewei,0
cmpbl,cl
jaeH3
movjiewei,1
movbh,0ah
subbh,cl
addbl,bh
movcl,bl
jmpF3
H3:
subbl,cl
movcl,bl
jmpF3
F3:
moval,cl
andal,0fh;显示键码
movah,0
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
movStore[3],al
movcl,num1+1;第四位相减
movbl,Store1+1
subbl,jiewei
cmpbl,0Fh;考虑0被借位变成F
jzN3
jmpM3
N3:
movbl,09h
jmpM3
M3:
movjiewei,0
cmpbl,cl
jaeH4
movjiewei,1
movbh,0ah
subbh,cl
addbl,bh
movcl,bl
jmpF4
H4:
subbl,cl
movcl,bl
jmpF4
F4:
moval,cl
andal,0fh;显示键码
movah,0
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
movStore[2],al
movcl,num1+0;最高位相减
movbl,Store1+0
subbl,jiewei
movjiewei,0
cmpbl,cl
jaeH5
movjiewei,1
subcl,bl
jmpF5
H5:
subbl,cl
movcl,bl
jmpF5
F5:
moval,cl
andal,0fh;显示键码
movah,0
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
movStore[1],al
jmpback3
ADDa:
movcl,num1+4;最低位执行加法
movbl,Store1+4
addcl,bl
cmpcl,0ah
jbH
subcl,0ah
incjinwei
H:
moval,cl
andal,0fh;显示键码
movah,0
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
movStore[5],al
movcl,num1+3;第二位加法
movbl,Store1+3
addcl,bl
addcl,jinwei
movjinwei,0
cmpcl,0ah
jbHA
subcl,0ah
incjinwei
HA:
moval,cl
andal,0fh;显示键码
movah,0
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
movStore[4],al
movcl,num1+2;第三位执行加法
movbl,Store1+2
addcl,bl
addcl,jinwei
movjinwei,0
cmpcl,0ah
jbHB
subcl,0ah
incjinwei
HB:
moval,cl
andal,0fh;显示键码
movah,0
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
movStore[3],al
movcl,num1+1;执行加法
movbl,Store1+1
addcl,bl
addcl,jinwei
movjinwei,0
cmpcl,0ah
jbHC
subcl,0ah
incjinwei
HC:
moval,cl
andal,0fh;显示键码
movah,0
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
movStore[2],al
movcl,num1+0;最高位执行加法
movbl,Store1+0
addcl,bl
addcl,jinwei
movjinwei,0
cmpcl,0ah
jaecontinue
moval,cl
andal,0fh;显示键码
movah,0
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
movStore[1],al
jmpback3
continue:
movStore[0],8Eh
movStore[1],8Eh
movStore[2],8Eh
movStore[3],8Eh
movStore[4],8Eh
movStore[5],8Eh
jmpback3
;系统原有的函数直接调用
Disp:
movbx,offsetLEDBuf
movcl,6;共6个八段管
movah,00100000b;从左边开始显示
DLoop:
movdx,OUTBIT
moval,0
outdx,al;关所有八段管
moval,[bx]
movdx,OUTSEG
outdx,al
movdx,OUTBIT
moval,ah
outdx,al;显示一位八段管
pushax
movah,1
callDelay
popax
shrah,1
incbx
deccl
jnzDLoop
movdx,OUTBIT
moval,0
outdx,al;关所有八段管
ret
Delay:
;延时子程序
pushcx
movcx,256
loop$
popcx
ret
GetKey:
;键扫子程序
moval,0ffh;关显示口
movdx,OUTSEG
outdx,al
movbl,0
movah,0feh
movcx,8
key1:
moval,ah
movdx,OUTBIT
outdx,al
shlal,1
movah,al
nop
nop
nop
nop
nop
nop
movdx,IN_KEY
inal,dx
notal
nop
nop
andal,0fh
jnzkey2
incbl
loopkey1
nkey:
moval,20h
ret
key2:
testal,1
jekey3
moval,0
jmpkey6
key3:
testal,2
jekey4
moval,8
jmpkey6
key4:
testal,4
jekey5
moval,10h
jmpkey6
key5:
testal,8
jenkey
moval,18h
key6:
addal,bl
cmpal,10h
jncfkey
movbx,offsetKeyTable
xlat
fkey:
ret
LedMap:
;八段管显示码
db0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h
db080h,090h,088h,083h,0c6h,0a1h,086h,08eh
KeyTable:
;键码定义
db07h,04h,08h,05h,09h,06h,0ah,0bh
db01h,00h,02h,0fh,03h,0eh,0ch,0dh
codeends
endStart
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 计算器 8086 汇编 代码