例1:十六进制数的输入
- 清空BX寄存器
- 输入一个字符
- 如果是回车就表明输入完成,跳出循环
- 如果不是0-9或者A-F就跳转ERROR(16进制是由0-9和A-F组成)
- 转换成十六进制
- BX左移4个位
- 用OR把AL的最低位给BL
@BEGIN:
XOR BX,BX ;清空BX寄存器,相当于给BX初始化为0
MOV CL,4 ;CL存储4,之后左移的时候需要用到
MOV AH,1
INT 21H ;键盘输入并回显
@WHILE:
CMP AL,0DH
JE @END_WHILE ;如果输入的是回车就跳转END_WHILE
CMP AL,30H
JB @ERROR ;如果输入的小于30H,ASCII表中小于30H是一些符号什么的 就跳转ERROR
CMP AL,39H
JA @LETTER ;如果大于39H(符号字母的情况)就跳转LETTER
AND AL,0FH ;取AL的低四位
JMP @SHIFT ;跳转SHIFT
@LETTER:
CMP AL,'A' ;如果小于A(符号的情况)
JB @ERROR ;小于就跳转ERROR
CMP AL,'F'
JA @ERROR ;如果大于F的情况也跳转ERROR
;因为十六进制数是由0-9和A到F组成的,A到F分别代表10到15
SUB AL,37H ;将A-F转换成十六进制
;A-F在ASCII码中的值为41-5A,A在16进制中代表0AH,又因为0AH+37H=41H,所以要转换成16进制减37H即可
@SHIFT:
SHL BX,CL ;左移CL个位,CL最开始的时候定义了是4,所以左移4位
OR BL,AL ;把AL的最低位给BL的最低位
INT 21H ;键盘输入
JMP @WHILE ;继续循环
@END_WHILE:
JMP @EXIT ;跳转结束
@ERROR:
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H ;输出回车换行
JMP @BEGIN ;从头开始
@EXIT:
如何将A-F转换成十六进制?
使用SUB AL,37H
A-F在ASCII码中的值为41-5A
A在16进制中代表0AH
又因为0AH+37H=41H
所以要转换成16进制减37H即可
反之,十六进制的转回A-F 加上37H就可以
例2:十六进制数的输出
- 十六进制,四个一组,需要一个计次DH设置为4,每循环一次减1
- 左移四个单元 需要CL
- 把BH存到DL里,BH是BX的高八位
- 然后DL左移四个位
- 然后判断是数字还是字母
- 再将真实的数字转换成ASCII码
- 再输出,再左移
MOV DH,4 ;用于计数,四个为一组
MOV CL,4 ;CL存储4,为后面左移四个单位埋下伏笔
MOV AH,2
@OUTPUT:
MOV DL,BH ;将BH的内容存储到DL里
SHR DL,CL ;左移CL个位,此时CL为4
CMP DL,0AH
JL @NUMBER ;如果小于A,数字的情况,跳转NUMBER
ADD DL,37H ;将十六进制值转换成A-F.加37H
JMP @NEXT ;跳转NEXT
@NUMBER:
OR DL,30H ;把DL中的数值转换成对应的ASCII码
@NEXT:
INT 21H ;键盘输出
ROL BX,CL ;循环左移4次,BX=BH+BL
DEC DH ;计数器减1
JNZ @OUTPUT ;如果不等于(ZF=0运算结果不为零)就跳转