📄 p28.asm
字号:
.model small
.stack 100
.data
CR EQU 0AH
LF EQU 0DH
MES_1 DB CR,LF,'ENTER 4-DIGIT BCD NO $'
MES_2 DB CR,LF,'HEX NO : $'
MES_3 DB CR,LF,'INPUT IS INVALID BCD $'
MULTI DW 1,10,100,1000
RESULT DW(00)
INP DB 05
DB 00
DB 05 DUP(0)
BUFF DB 05
DB 00
DB 05 DUP (0)
CNT1 DW 0
.code
MAIN : MOV AX,@data ; Initialise data segment
MOV DS,AX
MOV AH,09H
MOV DX,OFFSET MES_1 ; Display
INT 21H
XOR DI,DI
MOV AH,0AH
MOV DX,OFFSET INP ; I/P number
INT 21H
XOR AX,AX
XOR DI,DI
MOV CX,0004H
INC DI
BACK: INC DI
MOV AL,INP[DI] ; Check for validity
CMP AL,30H
JB TER
CMP AL,39H
JG TER
SUB AL,30H
MOV INP[DI],AL
DEC CX
JNZ BACK
JMP NEXT
TER: MOV DX,00H
MOV AH,09H
MOV DX,OFFSET MES_3 ; I/P is invalid BCD number
INT 21H
MOV AH,4CH ; Terminate
INT 21H
NEXT: MOV DX,0000H
XOR DI,DI
INC DI
INC DI
MOV CH,INP[DI]
XOR SI,SI
ADD SI,06H ; Index for multiplier
MOV AL,INP[DI]
MOV AH,00H
MOV BX,MULTI[SI]
MUL BX ; Multiply by 1000
ADD RESULT,AX
XOR SI,SI
ADD SI,04H
INC DI
MOV AL,INP[DI]
MOV AH,00H
MOV BX,MULTI[SI]
MUL BX ; Multiply by 100
ADD RESULT,AX
INC DI
XOR SI,SI
ADD SI,02H
MOV AL,INP[DI]
MOV AH,00H
MOV BX,MULTI[SI]
MUL BX ; Multiply by 10
ADD RESULT,AX
INC DI
XOR SI,SI
ADD SI,00H
MOV AL,INP[DI]
MOV AH,00H
MOV BX,MULTI[SI]
MUL BX ; Multiply by 1
ADD RESULT,AX
MOV AH,09H
MOV DX,OFFSET MES_2 ; Display string
INT 21H
XOR SI,SI
MOV AX,RESULT ; HEX to ASCII
MOV BH,AH
MOV CL,04H
AND AH,0F0H
SHR AH,CL
CMP AH,09H
JBE SKIP1
ADD AH,37H
JMP SKIP2
SKIP1: ADD AH,30H
SKIP2: MOV DL,AH
MOV AH,02H
INT 21H
MOV AH,BH
AND AH,0FH
CMP AH,09H
JBE SKIP3
ADD AH,37H
JMP SKIP4
SKIP3: ADD AH,30H
SKIP4: MOV DL,AH
MOV AH,02H ; Character O/P
INT 21H
MOV AX,RESULT
MOV BL,AL
MOV CL,04H
AND AL,0F0H
SHR AL,CL
CMP AL,09H
JBE SKIP5
ADD AL,37H
JMP SKIP6
SKIP5: ADD AL,30H
SKIP6: MOV DL,AL
MOV AH,02H
INT 21H
MOV AL,BL
AND AL,0FH
CMP AL,09H
JBE SKIP7
ADD AL,37H
JMP SKIP8
SKIP7: ADD AL,30H
SKIP8: MOV DL,AL
MOV AH,02H
INT 21H
MOV AH,4CH ; Terminate
INT 21H
END MAIN
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -