汇编小程序:从键盘输入2位十六进制数转换成等值二进制数

实验内容:将键盘输入的2位十六进制数转换为等值的二进制数,并在屏幕上显示。例如,输入F2,则显示威者11110010

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

没有调整字符对齐,不过无伤大雅。

这个程序设有两个附加功能,即提示错误和提示是否重试一次。有一些汇编程序会出错,删掉是否重复即可运行。

其实现在已经很少人在用手动汇编了,主流的方法是把需要的程序用高级语言编号后生成.exe文件,然后用反汇编工具实现。最后如有需要,再用汇编对反汇编得出的结果进行小面积的修改。