子程序及进制转换
DATAS SEGMENT
STRING DB 'PLEASE INPUT A NUMBER: $'
STRING2 DB 'INPUT A LETTER: $'
TIP DB 'INPUT A NUMBER: ','$'
TIP1 DB ' <=> ','$'
WARN DB 'ERROR! $'
BIN DW 10 DUP(?) ;存放二进制结果
BUF DB 5 DUP(?) ;存放十进制数 各个数位上的数值 如100,存放为 1,0,0
MSG1 DB 'INPUT A HEX NUMBER',13,10,'$'
MSG2 DB 'THE DEC NUMBER:',13,10,'$'
CRLF DB 13,10,'$' ;回车换行
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
RE: MOV DL, 0AH
MOV AH, 02H
INT 21H ;换行
MOV DX,OFFSET STRING
MOV AH,09H
INT 21H ;输出字符串
MOV AH,01H
INT 21H ;AL存放输入字符的ASCII码
CMP AL,31H
JZ X1
CMP AL,32H
JZ X2
CMP AL,33H
JZ X3
CMP AL,34H
JZ X4
CMP AL,35H
JZ X5
CMP AL,71H ;按q退出
JZ EN
CMP AL,'0'
JBE ERROR
CMP AL,'6'
JAE ERROR
JMP EN
X1: CALL CHECK1
JMP EN
X2: CALL CHECK2
JMP EN
X3: CALL CHECK3
JMP EN
X4: CALL CHECK4
JMP EN
X5: CALL CHECK5
JMP EN
;小写转大写 model1
CHECK1 PROC
MOV DL,0AH
MOV AH,02H
INT 21H ;换行
MOV DX,OFFSET STRING2
MOV AH,09H
INT 21H ;输出字符串
MOV AH,01H
INT 21H ;AL存放输入字符的ASCII码
CMP AL,61H ; <a
JL ERROR
CMP AL,7AH ; >z
JG ERROR
SUB AL,20H ;转换成大写字母
MOV BL,AL
MOV DL,0AH
MOV AH,02H
INT 21H ;换行
MOV DL,BL
MOV AH,02H
INT 21H ;输出
MOV DL,0AH
MOV AH,02H
INT 21H ;换行
JMP RE
CHECK1 ENDP
JMP EN
;大写转小写 model2
CHECK2 PROC
MOV DL,0AH
MOV AH,02H
INT 21H ;换行
MOV DX,OFFSET STRING2
MOV AH,09H
INT 21H ;输出字符串
MOV AH,01H
INT 21H ;AL存放输入字符的ASCII码
CMP AL,41h ; <A
JL ERROR
CMP AL,5AH ; >Z
JG ERROR
ADD AL,20H ;转换成小写字母
MOV BL,AL
MOV DL,0AH
MOV AH,02H
INT 21H ;换行
MOV DL,BL
MOV AH,02H
INT 21H ;输出
MOV DL,0AH
MOV AH,02H
INT 21H ;换行
JMP RE
CHECK2 ENDP
JMP EN
;2->16 model3
CHECK3 PROC
MOV DL,0AH
MOV AH,02H
INT 21H ;换行
LEA DX,TIP
MOV AH,09H
INT 21H ; 字符串显示
MOV CH,4 ;记录输入数字次数
MOV DL,0
INPUT:
MOV AH,1
INT 21H ;存放在AL里
CMP AL,30H
JA L1 ;高于0跳L1 输入的是1
ROL DL,1
OR DL,0 ;逻辑或 0000
JMP AGAIN
L1:
ROL DL,1 ;循环左移一位
OR DL,1 ;逻辑或 0001
AGAIN:
DEC CH ;循环输入4次
JZ PRINT ;JZ结果为零
JMP INPUT
PRINT:
CMP DL,0
JB EN ;低于
CMP DL,9
JA COMPER1 ;高于9就加37H,显示字母 刚好是对应的ACSII码
ADD DL,30H ;否则就加30H
JMP SHOW
COMPER1:
ADD DL,37H
SHOW:
MOV AL,DL
LEA DX,TIP1
MOV AH,09H
INT 21H ;显示字符串
MOV DL,AL
MOV AH,02H
INT 21H ;字符显示
MOV DL,0AH
MOV AH,02H
INT 21H ;换行
JMP RE
CHECK3 ENDP
JMP EN
;16->2 model4
CHECK4 PROC
MOV DL,0AH
MOV AH,02H
INT 21H ;换行
LEA DX,TIP
MOV AH,09H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H ;换行
MOV CH,4 ;记录输入数字次数
MOV CL,4 ;循环左移一次的位数
MOV BX,0 ;记录左移之后的数字
MOV DH,16 ;输出十六位二进制数字控制
INPUT:
MOV AH,1
INT 21H ;字符输入
CMP AL,30H ;判断是否在0-9之间
JB EN ;比0小则退出
CMP AL,39H
JA COMPER1 ;比9大则判断与A的大小
JMP CHANGE1 ;若进行到下一步则说明这次输入的是0-9之间的数字,转换成二进制
COMPER1:
CMP AL,41H ;判断与A的大小
JB EN ;若小于A则退出
CMP AL,46H ;判断与F的大小
JA COMPER2 ;若比F大则判断与a的大小
JMP CHANGE2 ;进行到这一步则说明输入的是A-F,转换成二进制
COMPER2:
CMP AL,61H ;判断与a的大小
JB EN ;小于a则退出
CMP AL,66H ; 判断与f的大小
JA EN ; 大于f则退出
JMP CHANGE3 ; 进行到这一步说明输入的是a-f,转换成二进制
CHANGE1:
SUB AL,30H ;转换成0-9
SHL BX,CL ;2进制左移四位 相当于移16进制的移位 和0000相或
OR BL,AL ;进行或运算得到四位二进制
DEC CH ;输入数字次数自减1
JZ ENT ;四位十六进制全部输入完毕则打印,否则继续输入
JMP INPUT
CHANGE2:
SUB AL,37H ;此时AL中是A-F,减去37H是0AH,0BH...0FH
SHL BX,CL
OR BL,AL
DEC CH
JZ ENT
JMP INPUT
CHANGE3:
SUB AL,57H ;此时AL中是a-f,减去57H就是0AH,0BH...0FH
SHL BX,CL
OR BL,AL
DEC CH
JZ ENT
JMP INPUT
;所有的CHANGE1,2,3道理都是一样的
ENT:
MOV DL, 0DH
MOV AH, 02H
INT 21H ;回车
MOV DL, 0AH
MOV AH, 02H
INT 21H ;换行
JMP PRINT
PRINT:
SHL BX,1 ;BX左移一位
JNC L1 ;判断进位标志位,如果是0 跳到了L1
MOV DL,'1' ;输出1
MOV AH,02H
INT 21H
DEC DH
JZ RE
JMP PRINT
L1:
MOV DL,'0' ;否则输出0
MOV AH,02H
INT 21H
DEC DH
JZ RE
JMP PRINT
CHECK4 ENDP
JMP EN
;16->10 model5
CHECK5 PROC
MOV DL,0AH
MOV AH,02H
INT 21H ;换行
MOV BX,0 ;初始化BX
LEA DX,MSG1 ;输出提示字符串
MOV AH,09H
INT 21H
INPUT:
MOV AH,01H ;输入一个字符
INT 21H ;存到AL里
SUB AL,30H ;把AL中的ASCII码转换成数值
JL INIT
CMP AL,10 ;输入的数在0-9之间跳转
JL TOBIN ;小于
SUB AL,27H ;再转换为a-f
CMP AL,0AH ;输入的字符比a小
JL INIT ;结束输入
CMP AL,10H ;输入的字符比f大
JGE INIT ;结束输入
TOBIN: ;转换为二进制,把输入组合成意义上的数值
MOV CL,4
SHL BX,CL ;BX左移4位
MOV AH,0
ADD BX,AX ;把输入后并从ASCII码转换来的值与BX相加
MOV BIN,BX ;转换成二进制数后存到内存BIN
JMP INPUT ;继续输入
INIT: ;初始化,准备转换
MOV AX,BIN
MOV BX,10
MOV SI,4 ;循环四次,
TODEC: ;转为各个数位上的数值,如100转换为1,0,0 百位为1...
MOV DX,0
DIV BX ;除10法得到各个位上的数值
MOV [BUF+SI],DL ;余数为该位上的值,第一次循环为个位,第二次为十位...;存到内存中
DEC SI
CMP AX,0 ;商是否为0,为0算法结束
JA TODEC
LEA DX,CRLF ;显示提示
MOV AH,09H
INT 21H
LEA DX,MSG2
MOV AH,09H
INT 21H
OUTPUT: ;输出内存中存放的各个数位上的数值
INC SI
MOV DL,[BUF+SI]
ADD DL,30H ;转为ASCII
MOV AH,2
INT 21H
CMP SI,4
JB OUTPUT
JMP RE
CHECK5 ENDP
JMP EN
ERROR: MOV DL,0AH
MOV AH,02H
INT 21H ;换行
LEA DX,WARN
MOV AH,09H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H ;换行
JMP RE ;错误后结束
EN: MOV AH,4CH
INT 21H
CODES ENDS
END START