输入两个十六制数字(0-f),计算并输出十六制
这里用ah=7,不印出字元,测试正常才印出,Check_char的副程序便是验证字元,
不是则传回cfflag, 程序会把小写变大写,所以大小写不区

SSEG SEGMENT STACK
DB 100 DUP(0)
SSEG ENDS
DSEG SEGMENT
SUM DB ?
HTAB DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 41H,42H,43H,44H,45H,46H
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
START:
MOV AX,DSEG
MOV DS,AX
MOV ES,AX
next1:
MOV AH,07H
INT 21H
mov dl,al
call check_char
jc next1
mov ch,al
mov ah,02 ;print dl
int 21h
MOV DL,'*'
MOV AH,02H
INT 21H
next2:
MOV AH,07H
INT 21H
mov dl,al
call check_char
jc next2
mov cl,al
mov ah,02 ;print dl
int 21h
mov al,cl
MUL CH
MOV SUM,AL
MOV CH,AL
MOV DL,'='
MOV AH,02H
INT 21H
MOV AL,CH
MOV CL,4
SHR AL,CL
LEA BX,HTAB
XLAT
MOV DL,AL
MOV AH,02H
INT 21H
AND CH,0FH
MOV AL,CH
XLAT
MOV DL,AL
MOV AH,02H
INT 21H
MOV DL,'H'
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
;------
check_char:
cmp al,'0'
jb checkx
cmp al,'9'
ja check20
check10:
sub al,'0'
clc
ret
check20:
and al,11011111b
cmp al,'A'
jb checkx
cmp al,'F'
ja checkx
sub al,'A'-'9' - 1
jmp short check10
checkx:
stc
ret
;------
CSEG ENDS
END START