汇编是复杂的,可以下载MASM或者Radasm编译如下代码,在linux平台 可以直接用gcc自带的as汇编器进行编译。
DATA SEGMENT
DATA1 DB ?
DATA2 DB 2 DUP(?)
DATA20 DB 2 DUP(?)
DATA3 DB 'Input Error, Please Enter Again!','$'
DATA ENDS
STACK SEGMENT
DB 5 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV BX,0
INPUT:MOV AH,01H
INT 21H
CMP AL,51H;判断输入的字符是否为Q
JE EXIT
;如果是Q就退出
CMP AL,71H;判断输入的字符是否为q
JE EXIT
;如果是Q就退出
PUSH AX
;把从键盘输入的字符的ASCII存到堆栈段
SUB AL,30H ;判断是否为数字
CMP AL,00H
JL INDI ;如果不是就提示错误
CMP AL,09H ;
MOV BL,AL ;
JLE OUTPUT2;如果是数字就输出
POP AX ;把AL的值取出来
PUSH AX ;
MOV BL,AL
SUB AL,41H;判断是否为大写字母A到F
CMP AL,00H
JL INDI
;如果不是就提示错误
CMP AL,06H
JL CHANGE
POP AX
PUSH AX
MOV BL,AL
SUB AL,61H;判断是否为小写字母a到f
CMP AL,00H
JL INDI ;如果不是就提示错误
CMP AL,06H
JL CHANGE
POP AX
JMP INDI
CHANGE:MOV SI,0
MOV DI,0
MOV CL,4
MOV AL,BL
AND AL,11011111B;统一换为大写字母再转换,如果是大写字母就不变
SUB AL,31H
MOV BL,AL
AND AL,0FH ;与运算,取低位
MOV [DATA2+SI],AL ;把个位数存到DATA2中
MOV AL,BL
SAR AL,CL ;算术右移,取高位
MOV[DATA20+DI],AL;把十位数存到DATA20中
OUTPUT1: MOV DL,48H;输出十六进制符号H
MOV AH,02H
INT 21H
MOV DL,3DH ;输出等号‘=’
MOV AH,02H
INT 21H
MOV DL,[DATA20+DI];输出十位数
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,[DATA2+SI];输出个位数
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,20H
MOV AH,02H
INT 21H
JMP INPUT;跳到输入数字
OUTPUT2: MOV DL,48H ;输出数字
MOV AH,02H
INT 21H
MOV DL,3DH
MOV AH,02H
INT 21H
MOV DL,BL
ADD DL,30H
MOV AH,02H
INT 21H
MOV DL,20H
MOV AH,02H
INT 21H
JMP INPUT
INDI:MOV DL,20H ;提示子程序
MOV AH,02H
INT 21H
MOV DX,OFFSET DATA3 ;显示提示信息
MOV AH,09H
INT 21H
JMP INPUT
EXIT:MOV AH,4CH
INT 21H
CODE ENDS
END START
输入一个多位十六进制数,显示等值的十进制。
输入字符,需要减去 37H 或 30H,变换为十六进制数字。再组成一个多位数。
显示之前,则需要相反的变化。
本程序具有对输入数据进行合法性判断的功能。
输入非十六进制数的符号时,本程序将不做反应。