21,458
社区成员
发帖
与我相关
我的任务
分享
DATAS SEGMENT //数据段DATAS定义
CTR DB 0DH,0AH,'$' //定义变量CTR, 内容为"0d0a$', 就是回车换行和$字符
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS //代码段,数据段和栈的声明
START:
MOV AX,DATAS
MOV DS,AX //DS寄存器指向数据段
MAIN:
CALL READ //读入十进制数,结果在BX
CALL CRLF //在下一行显示提示符"$"
CALL CONVERT //进行转换并输出
CALL CRLF //在下一行显示提示符"$"
JMP EX //跳转到程序结束
READ PROC FAR //读入函数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 FAR //转换函数
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 FAR //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