DATAS SEGMENT ;数据段DATAS定义
CTR DB 0DH,0AH,'$' ;定义变量CTR, 内容为"0d0a$', 就是回车换行和$字符
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS ;代码段,数据段和栈的声明
START:
MOV AX,DATAS
MOV DS,AX ;DS寄存器指向数据段
MAIN:
CALL READ ;读入十进制数,结果在BX
CALL CRLF ;在下一行显示提示符"$"
CALL CONVERT ;进行转换并输出
CALL CRLF ;在下一行显示提示符"$"
JMP EX ;跳转到程序结束
READ PROC near ;读入函数READ
MOV BX,0
NEWCHAR:
MOV AH,1 ; INT 21H, AH=1表示从键盘带回显读入字符到AL中
INT 21H
XOR AH,AH
CMP AL,'0' ;如果输入‘0'-'9'之外的字符,则结束读入
JS EXIT
CMP AL,'9'
JA EXIT
SUB AL,'0' ;把字符转换为数字,比如'8'转换为数字8,保存在AL
XCHG BX,AX
MOV CX,0AH
MUL CX ;把之前输入的数乘以10,加上本次输入,保存到BX.
XCHG BX,AX
ADD BX,AX
JMP NEWCHAR ;结果在BX
EXIT:
RET
READ ENDP
CONVERT PROC near ;转换函数
MOV CH,04D
ROTATE:
MOV CL,04D
ROL BX,CL ;BX循环左移4个bit, 也就是把最高位的16进制数放到BL的末尾
MOV AL,BL
AND AL,0FH ;把4位数放到AL
ADD AL,30H ;转换为ASCII
CMP AL,'9'
JB PRINT ;字符为'9'之下,直接显示;这个条件好象不对啊,应该是JBE才对
ADD AL,07H ;'9'之上的,转换为'A'-'F'
PRINT:
MOV DL,AL ;显示字符
MOV AH,2
INT 21H
DEC CH
JNE ROTATE ;循环
RET
CONVERT ENDP
CRLF PROC near ;INT 21 09H, 显示CTR字符串
LEA DX,CTR
MOV AH,09H
INT 21H
RET
CRLF ENDP
EX:
MOV AH,4CH
INT 21H ;程序结束系统调用(功能号4c, 这里应该设置AL为0比较好)
CODES ENDS
END START