例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运算结果不为零)就跳转

最后修改:2022 年 03 月 08 日
如果觉得我的文章对你有用,请随意赞赏