由于,代码中已经有了详细注释,在这里我只是说出我写该程序的思路,首先得有一个流程图,比自己的想法用流程图表示出来,之后便可以照着流程图将自己的想法用汇编语言实现出来,在不懂得地方,只需要拿笔比划一下运行过程,想想程序怎么运行,我想会得到你想要的答案!!!(说明一下,如果输入错误程序直接结束,未返回提示信息!!!我自己蠢)
DATAS SEGMENT
TIP DB 'INPUT THE NUMBER: ',0AH,0DH,'$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV DX,OFFSET TIP ;输出提示输入数字标语
MOV AH,09H
INT 21H
MOV CH,4 ;记录输入数字次数
MOV CL,4 ;一次左移位数
MOV BX,0 ;记录左移之后的数字
MOV DH,16 ;输出十六位二进制数字控制
INPUT:
MOV AH,1
INT 21H
;判断是否在0-9之间
cmp AL,30H
JB EXIT ;比0小则退出
CMP AL,39H
JA COMPER1 ;比9大则判断与A的大小
;若进行到下一步则说明这次输入的是0-9之间的数字,转换成二进制
JMP CHANGE1
COMPER1:
CMP AL,41H ;判断与A的大小
JB EXIT ;若小于A则退出
CMP AL,46H ;判断与F的大小
JA COMPER2 ;若比F大则判断与a的大小
JMP CHANGE2 ;进行到这一步则说明输入的是A-F,转换成二进制
COMPER2:
CMP AL,61H ;判断与a的大小
JB EXIT ;小于a则退出
CMP AL,66H ; 判断与f的大小
JA EXIT ; 大于f则退出
JMP CHANGE3 ; 进行到这一步说明输入的是a-f,转换成二进制
CHANGE1:
SUB AL,30H ;转换成0-9
SHL BX,CL ;左移四位
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 ;0D是回车符的ASCII码.
MOV AH, 02H ;输出单个字符.
INT 21H ;输出.
MOV DL, 0AH ;0A是换行符的ASCII码.
MOV AH, 02H
INT 21H
;这里0DH,和0AH要一起使用,单独使用会报错
JMP PRINT
PRINT:
SHL BX,1
JNC L1 ;判断进位,如果是0 跳到了L1
MOV DL,'1' ;输出1
MOV AH,02H
INT 21H
DEC DH
JZ EXIT
JMP PRINT
L1:
MOV DL,'0' ;输出0
MOV AH,02H
INT 21H
DEC DH
JZ EXIT
JMP PRINT
EXIT:
MOV AH,4CH
INT 21H
CODES ENDS
END START
这里是运行的结果截图: