📄 4位加法器.asm
字号:
DATA SEGMENT
DA55 EQU 318H
DB55 EQU 319H
CTL EQU 31BH
TABLE DW 0101H,0102H,0104H,0108H,0110H,0120H,0140H,0180H
DW 0201H,0202H,0204H,0208H,0210H,0220H,0240H,0280H
DW 0401H,0402H,0404H,0408H
CHAR DB 'CDEFBA9845673210'
CRT DB 'PRESS ANY KEY IN THE SMALL KEYBOARD!',0AH,0DH
DB 'IT WILL BE ON THE LED!',0AH,0DH,'$'
NONLED DB 00H
SEGDAT DB 9FH,18H,4FH,5EH,0d8h,0d6h,0d7h,1ch,0DFH,0DEH ;放数字转换表(即段码表)
BITDAT DB 20H,10H,8,4 ;放位码表
DA1 DB 4 DUP(?)
DA2 DB 4 DUP(?)
BUFDAT DB 4 DUP('a') ;数据缓冲区
TMP DB 4 DUP(?) ;临时交换区
SUM DB 10 DUP(?)
TESTDAT DB 18H,4FH,5EH,0d8h
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
STA DW 50 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
start: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET CRT ;调试用,显示功能说明
MOV AH,09
INT 21H
MOV CX,4
CALL INPUT
MOV AH,1 ;判断是否需要sub 30h
CALL LEDDISP2
CK:
;CALL LEDDISP2
CALL KEY
CMP DL,'A'
JZ CLR
JMP CK
CLR: CALL CLEAR
LEA SI,TMP
LEA DI,DA1
MOV CX,4
CON1: MOV AL,[SI] ;con1,con2把TMP区的数据分别移到到da1,da2
MOV [DI],AL
INC SI
INC DI
LOOP CON1
MOV CX,4
LEA SI,BUFDAT
RES: MOV BL,'a'
MOV [SI],BL
INC SI
LOOP RES
MOV CX,4
CALL INPUT
CALL CLEAR
MOV AH,1 ;判断是否需要sub 30h
CALL LEDDISP2
LEA SI,TMP
LEA DI,DA2
MOV CX,4
CON2: MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
LOOP CON2
LEA SI,DA1+3 ;为加法作准备
LEA DI,DA2+3
LEA BX,SUM+3
MOV CX,04
CALL JIAFA
LEA SI,SUM
LEA DI,BUFDAT
MOV CX,4
CON3: MOV AL,[SI] ;把SUM区的数据移到到BUFDAT
MOV [DI],AL
INC SI
INC DI
LOOP CON3
CK2:
;CALL LEDDISP2
CALL KEY
CMP DL,'B'
JZ CLR2
JMP CK2
CLR2:CALL CLEAR
LEA SI,BUFDAT ;调试用,往屏幕送结果
MOV CX,04
CLD
DISP3: CALL DISP
LOOP DISP3
;CALL CLEAR
MOV AH,00
SUMDISP:CALL LEDDISP2 ; ;在LED上显示结果,SI为位码,DI位段码
;INC SI
;DEC DI
;LOOP SUMDISP
MOV AH,0BH
INT 21H
CMP AL,00
JZ SUMDISP
CALL CLEAR
MOV AH,4CH
INT 21H
INPUT PROC
LOP1: CALL KEY ;调用小键盘输入程序,字符放在dl中
PUSH CX
PUSH DX
LEA DI,TMP+3 ;DI作存放数据的位置
LEA BX,BUFDAT+3 ;用bufdat作缓冲区
MOV DX,4 ;根据CX值计算下面的内循环需要多少次
SUB DX,CX
MOV CX,DX
CMP DX,0
JZ D1 ;如果是第一次,则直接跳到D1放入字符
PUSH CX
B1: DEC BX ;将BX移动到最高位,即bufdat-x
LOOP B1
POP CX
PUSH CX
C1: PUSH AX
MOV AL,[BX+1]
MOV [BX],AL ;将bufdat的数据依个往前移
POP AX
INC BX
LOOP C1
POP CX
D1: POP DX ;把小键盘输入的字符弹出
MOV [BX],DL ;放入bufdat+3
ADD CX,0001
;PUSH CX ;保存标志,为led显示做计数
LEA SI,BITDAT ;将段码值表首地址放到SI
LOP2: MOV AL,[BX] ;每输入一个数字,将bufdat里的数据放入TMP并全部输出的内循环
MOV [DI],AL
CALL CLEAR
;CALL DELAY ;DELAY TIME
;CALL LEDDISP
;PUSH SI
;CALL DELAY
;LEA SI,NONLED
;CALL CLEAR
;POP SI
;CALL DELAY
INC SI ;段码表下一位
DEC DI ;位码下一个(先显示低位再显示高位)
DEC BX
LOOP LOP2
;POP CX
MOV AH,01
CALL LEDDISP2
POP CX
LOOP LOP1
;CALL LEDDISP2
RET
INPUT ENDP
JIAFA PROC
JIA1: MOV AL,[SI]
ADC AL,[DI]
AAA
MOV [BX],AL
DEC SI
DEC DI
DEC BX
LOOP JIA1
RET
JIAFA ENDP
DISP PROC
PUSH CX
LODSB
OR AL,30H
MOV DL,AL
MOV AH,02
INT 21H
POP CX
RET
DISP ENDP
KEY PROC NEAR
PUSH CX
PUSH BX
LP1: MOV AL,82H
MOV DX,CTL
OUT DX,AL
WAIT1: MOV AL,00
MOV DX,DA55
OUT DX,AL
MOV DX,DB55
IN AL,DX
CMP AL,0FFH
JZ WAIT1
PUSH AX
PUSH AX
MOV CX,1000H
LP2: LOOP LP2
MOV DX,CTL
MOV AL,90H
OUT DX,AL
MOV DX,DB55
POP AX
OUT DX,AL
MOV DX,DA55
IN AL,DX
POP BX
MOV AH,BL
NOT AX
MOV SI,OFFSET TABLE
MOV DI,OFFSET CHAR
MOV CX,16
LP3: CMP AX,[SI]
JZ LP4
DEC CX
JZ LP1
ADD SI,2
INC DI
JMP LP3
LP4: MOV DL,[DI] ;调试用,往屏幕显示小键盘输入
MOV AH,02
INT 21H
PUSH DX
MOV AL,82H
MOV DX,CTL
OUT DX,AL
WAIT2: MOV AL,00
MOV DX,DA55
OUT DX,AL
MOV DX,DB55
IN AL,DX
CMP AL,0FFH
JNZ WAIT2
POP DX
POP BX
POP CX
RET
KEY ENDP
LEDDISP PROC
PUSH AX
PUSH DX
PUSH BX
XOR AX,AX
MOV AL,[DI] ;送段码
SUB AL,30H
MOV BX,OFFSET SEGDAT
XLAT
MOV DX,311H
OUT DX,AL
MOV AL,[SI] ;送位码
MOV DX,310H
OUT DX,AL
;CALL LEDDISP2
POP BX
POP DX
POP AX
RET
LEDDISP ENDP
LEDDISP2 PROC
PUSH CX
PUSH BX
PUSH SI
PUSH DI
MOV CX,1000
LOOP2:
PUSH CX
LEA DI,BUFDAT+3
LEA SI,BITDAT
MOV CX,4
LOOP1: MOV AL,[DI] ;送段码
CMP AH,1
JNZ GO1
SUB AL,30H
GO1: MOV BX,OFFSET SEGDAT
XLAT
MOV DX,311H
OUT DX,AL
MOV AL,[SI]
MOV DX,310h
OUT DX,AL
CALL DELAY
INC SI
DEC DI
LOOP LOOP1
POP CX
LOOP LOOP2
BACK:POP DI
POP SI
POP BX
POP CX
RET
LEDDISP2 ENDP
CLEAR PROC
PUSH AX
PUSH DX
mov al,0
mov dx,311h
out dx,al
mov al,1
mov dx,310h
out dx,al
POP DX
POP AX
RET
CLEAR ENDP
DELAY PROC
PUSH CX
MOV CX,2
DE1:CALL DELAY2
LOOP DE1
POP CX
RET
DELAY ENDP
DELAY2 PROC
PUSH CX
MOV CX,1500
DEL1:LOOP DEL1
POP CX
RET
DELAY2 ENDP
CODE ENDS
END start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -