简单计算器8086汇编代码
![简单计算器8086汇编代码](https://img.360docs.net/img8e/1gnbsyioujz7d3jfu3sib81xa31032sf-e1.webp)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【课题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系列微机接口实验系统软件实验项目
; 键盘扫描显示实验
;******************************************
INIT MACRO NAME
mov NAME+0,0ffh
mov NAME+1,0c0h
mov NAME+2,0ffh
mov NAME+3,0ffh
mov NAME+4,0ffh
mov NAME+5,0ffh
ENDM
code segment
assume cs:code
OUTSEG equ 0ffdch ;段控制口
OUTBIT equ 0ffddh ;位控制口/键扫口
IN_KEY equ 0ffdeh ;键盘读入口
LedBuf db 10 dup(?) ;显示缓冲
Store db 10 dup(?) ;存放显示第一组数据
num db 10 dup(?)
Store1 db 10 dup(?) ;用于存放第一组数据
num1 db 10 dup(?) ;用于存放第二组数据
flag db 0 ; 作为标记位,若为1代表加为0代表减temp db 0
jinwei db 0
jiewei db 0
in_flag db 0
Key_Buff db 30 dup(?) ;用于键盘输入的存储
org 1000h
Start:
INIT Store
INIT num
INIT LedBuf
mov si,-1 ;设置数组的下标
mov Store1+0,0
mov Store1+1,0
mov Store1+2,0
mov Store1+3,0
mov Store1+4,0
mov num1+0,0
mov num1+1,0
mov num1+2,0
mov num1+3,0
mov num1+4,0
MLoop:
call Disp ;显示
call GetKey ;扫描键盘并读取键值
cmp al,20h
je LL
jmp LL1
LL: mov temp,0
jmp MLoop
LL1: push dx
mov dl,temp
mov temp,1
cmp al,09h
ja transmit
cmp Key_Buff[si],al
jz inkey_flag
jmp LL2
inkey_flag:
cmp temp,dl
pop dx
jz MLoop
jmp LL2 ;!!注意要加这一句
transmit:jmp SPECIAL ;特殊字符特殊处理
LL2: inc si
mov Key_Buff[si],al;将键盘输入的键盘码放到Key_Buff中
cmp si,5
jae abc
push dx
mov dl,Store1+1
mov Store1+0,dl
mov dl,Store1+2
mov Store1+1,dl
mov dl,Store1+3
mov Store1+2,dl
mov dl,Store1+4
mov Store1+3,dl
mov Store1+4,al
pop dx
jmp bcd
abc: mov di,si
sub di,5
push dx
mov dl,num1+1
mov num1+0,dl
mov dl,num1+2
mov num1+1,dl
mov dl,num1+3
mov num1+2,dl
mov dl,num1+4
mov num1+3,dl
mov num1+4,al
pop dx
jmp bcd
bcd: and al,0fh ;显示键码
mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
cmp si,5
jae next1
mov Store[si+1],al
jmp back1
next1: mov di,si
sub di,5
mov num[di+1],al
jmp start1
back1: push dx ;将Store里的数据放到Led中,方便以后显示 mov dl,Store+1
mov LedBuf+1,dl
mov dl,Store+2
mov LedBuf+2,dl
mov dl,Store+3
mov LedBuf+3,dl
mov dl,Store+4
mov LedBuf+4,dl
mov dl,Store+5
mov LedBuf+5,dl
pop dx
jmp MLoop
start1:
INIT LedBuf
call Disp
;jmp MLoop back2: push dx
mov dl,num+1
mov LedBuf+1,dl mov dl,num+2
mov LedBuf+2,dl mov dl,num+3
mov LedBuf+3,dl mov dl,num+4
mov LedBuf+4,dl mov dl,num+5
mov LedBuf+5,dl pop dx
jmp MLoop
back3: push dx
mov dl,Store+0 mov LedBuf+0,dl mov dl,Store+1 mov LedBuf+1,dl mov dl,Store+2 mov LedBuf+2,dl mov dl,Store+3 mov LedBuf+3,dl mov dl,Store+4 mov LedBuf+4,dl mov dl,Store+5 mov LedBuf+5,dl pop dx
jmp MLoop SPECIAL:
cmp al,0ah
jne decre
mov flag,1
mov si,4
jmp MLoop
decre: cmp al,0bh
jne Restart mov flag,0
mov si,4
jmp MLoop
Restart: cmp al,0ch
jne Exit
mov flag,0
jmp Start
Exit: cmp al,0eh
jne Display
mov Store+0,0Ch ;显示"P"
mov Store+1,0ffh
jmp back1
Display:cmp al,0dh
je print
jmp back3
print: cmp flag,0
je subb
jmp adda
subb:
mov cl,num1+0 ;比较两数大小,如果用小数减大数则交换数据 mov bl,Store1+0
cmp bl,cl
jb jiaoh
mov cl,num1+1
mov bl,Store1+1
cmp bl,cl
jb jiaoh
mov cl,num1+2
mov bl,Store1+2
cmp bl,cl
jb jiaoh
mov cl,num1+3
mov bl,Store1+3
cmp bl,cl
jb jiaoh
mov cl,num1+4
mov bl,Store1+4
cmp bl,cl
jb jiaoh
jmp jianfa
jiaoh: push dx ;交换两个数组中的数值 mov dh,num1+0
mov dl,Store1+0
mov num1+0,dl
mov Store1+0,dh
mov dh,num1+1
mov dl,Store1+1
mov num1+1,dl
mov Store1+1,dh
mov dh,num1+2
mov dl,Store1+2
mov num1+2,dl
mov Store1+2,dh
mov dh,num1+3
mov dl,Store1+3
mov num1+3,dl
mov Store1+3,dh
mov dh,num1+4
mov dl,Store1+4
mov num1+4,dl
mov Store1+4,dh
mov Store[0],0BFh ;最高位显示“-”
pop dx
jianfa: mov cl,num1+4 ;最低位相减
mov bl,Store1+4
cmp bl,cl
jae H1
mov jiewei,1
mov bh,0ah
sub bh,cl
add bl,bh
mov cl,bl
jmp F1
H1:
sub bl,cl
mov cl,bl
jmp F1
F1:
mov al,cl
and al,0fh ;显示键码
mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
mov Store[5],al
mov cl,num1+3 ;第二位相减
mov bl,Store1+3
sub bl,jiewei
cmp bl,0Fh ;考虑0被借位变成F jz N1
jmp M1
N1: mov bl,09h
jmp M1
M1: mov jiewei,0
cmp bl,cl
jae H2
mov jiewei,1
mov bh,0ah
sub bh,cl
add bl,bh
mov cl,bl
jmp F2
H2:
sub bl,cl
mov cl,bl
jmp F2
F2:
mov al,cl
and al,0fh ;显示键码
mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
mov Store[4],al
mov cl,num1+2 ;第三位相减
mov bl,Store1+2
sub bl,jiewei
cmp bl,0Fh ;考虑0被借位变成F jz N2
jmp M2
N2: mov bl,09h
jmp M2
M2: mov jiewei,0
cmp bl,cl
jae H3
mov jiewei,1
mov bh,0ah
sub bh,cl
add bl,bh
mov cl,bl
jmp F3
H3:
sub bl,cl
mov cl,bl
jmp F3
F3:
mov al,cl
and al,0fh ;显示键码
mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
mov Store[3],al
mov cl,num1+1 ;第四位相减
mov bl,Store1+1
sub bl,jiewei
cmp bl,0Fh ;考虑0被借位变成F jz N3
jmp M3
N3: mov bl,09h
jmp M3
M3: mov jiewei,0
cmp bl,cl
jae H4
mov jiewei,1
mov bh,0ah
sub bh,cl
add bl,bh
mov cl,bl
jmp F4
H4:
sub bl,cl
mov cl,bl
jmp F4
F4:
mov al,cl
and al,0fh ;显示键码 mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
mov Store[2],al
mov cl,num1+0 ;最高位相减 mov bl,Store1+0
sub bl,jiewei
mov jiewei,0
cmp bl,cl
jae H5
mov jiewei,1
sub cl,bl
jmp F5
H5:
sub bl,cl
mov cl,bl
jmp F5
F5:
mov al,cl
and al,0fh ;显示键码 mov ah,0
mov bx,offset LEDMAP
add bx,ax
mov al,[bx]
mov Store[1],al
jmp back3
ADDa:
mov cl,num1+4 ; 最低位执行加法 mov bl,Store1+4
add cl,bl
cmp cl,0ah