汇编语言中十进制转十六进制----( 6 )

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

 

  • 16
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值