DATAS SEGMENT
MESSAGE DB 'Welcome to the system!',13,10,13,10
DB 'The function of the program is changing H(16) numbers to B(2) numbers.',13,10,'Such as ff,AA,28,and so on.',13,10,13,10
DB 'Please enter the number.',13,10,13,10,'$'
ERROR1 DB 'ERROR!',13,10,'Please enter the right numbers.',13,10,'$' ;错误提示
ERROR2 DB 'ERROR!',13,10,'Please enter the right commonds.',13,10,'$'
CR DB 13,10,'$' ;回车换行
AGAIN DB 'Do you want to try again?(Y or N)',13,10,'$'
DATAS ENDS
STACKS SEGMENT PARA STACK
DB 20 DUP(?)
STACKS ENDS
CODESG SEGMENT
ASSUME CS:CODESG,DS:DATAS,SS:STACKS
START:
HEAD:
MOV AX,0
PUSH AX
MOV AX,DATAS
MOV DS,AX
LEA DX,MESSAGE
MOV AH,09H
INT 21H ;输出提示语
MOV AH,01H
INT 21H ;输入第一个字符(十六进制数的高位)
CMP AL,'0' ;异常情况处理(输入字符不在0~9,a~f,A~F的范围内)
JB OVERFLOW1
CMP AL,'f'
JA OVERFLOW1
CMP AL,'9'
JNA QUIT1
CMP AL,'A'
JB OVERFLOW1
CMP AL,'F'
JNA QUIT1
CMP AL,'a'
JB OVERFLOW1
QUIT1:
CALL ASC2BIN ;调用:十六进制字符的ASCII转为二进制值
MOV BL,AL
MOV CL,04H
SHL BL,CL ;利用逻辑左移指令移到BL的高四位,若设AL=????abcd,则BL=abcd0000
MOV AH,01H ;输入第二个字符(十六进制数的低位)
INT 21H
CMP AL,'0' ;异常情况处理(输入字符不在0~9,a~f,A~F的范围内)
JB OVERFLOW1
CMP AL,'f'
JA OVERFLOW1
CMP AL,'9'
JNA QUIT2
CMP AL,'A'
JB OVERFLOW1
CMP AL,'F'
JNA QUIT2
CMP AL,'a'
JB OVERFLOW1
QUIT2:
CALL ASC2BIN ;调用:十六进制字符的ASCII转为二进制值
OR BL,AL ;上一次调用后,BL的低四位都为0。0||X=X,若设AL=????xyzw,则BL=abcdxyzw
LEA DX,CR
MOV AH,09H
INT 21H
MOV CX,8 ;循环8次
LOOPG:
SHL BL,1
JC LOOP1 ;CF是1则跳转
MOV DL,'0' ;否则是0
JMP LOOP2
LOOP1:
MOV DL,'1'
LOOP2:
MOV AH,02H ;显示
INT 21H
LOOP LOOPG ;程序结束前再输出一次换行
LEA DX,CR
MOV AH,09H
INT 21H
JMP EXIT
;异常情况处理
OVERFLOW1:
LEA DX,CR
MOV AH,09H
INT 21H
LEA DX,ERROR1
MOV AH,09H
INT 21H
JMP EXIT
OVERFLOW2:
LEA DX,CR
MOV AH,09H
INT 21H
LEA DX,ERROR2
MOV AH,09H
INT 21H
JMP EXIT
EXIT:
LEA DX,AGAIN ;提示是否再试一次
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H
PUSH AX
LEA DX,CR
MOV AH,09H
INT 21H
POP AX
CMP AL,'Y'
JZ HEAD
CMP AL,'y'
JZ HEAD
CMP AL,'N'
JZ OVER
CMP AL,'n'
JZ OVER
JMP OVERFLOW2
OVER:
MOV AH,4CH ;程序结束退出
INT 21H
;ASCII转换成二进制处理子程序
ASC2BIN PROC NEAR
SUB AL,30H ;先减30H,若是数字0-9则正好转成了二进制值
CMP AL,9
JNA NEXT ;是数字就跳过下面两行
SUB AL,7 ;若是大写字母A-F,再减7,就变成了0AH-0FH
AND AL,0FH ;滤除高四位,这样即使输入是小写字母也与大写字母结果一样
NEXT:
RET
ASC2BIN ENDP
CODESG ENDS
END START
书上 有 的 嘛最简单的基础