⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4位加法器.asm

📁 部分程序具体运行步骤: 放数字转换表(即段码表); 放位码表; 数据缓冲区; 临时交换区;
💻 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 + -