如何用汇编程序 将一个十进制数转化为十六进制数(思路)

hsw1120141296 2016-11-12 08:16:44
求解这段程序的每部分的意思

DATAS SEGMENT
CTR DB 0DH,0AH,'$'
DATAS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX

MAIN:
CALL READ
CALL CRLF
CALL CONVERT
CALL CRLF
JMP EX

READ PROC FAR
MOV BX,0
NEWCHAR:
MOV AH,1
INT 21H
XOR AH,AH
CMP AL,'0'
JS EXIT
CMP AL,'9'
JA EXIT
SUB AL,'0'
XCHG BX,AX
MOV CX,0AH
MUL CX
XCHG BX,AX
ADD BX,AX
JMP NEWCHAR

EXIT:
RET
READ ENDP

CONVERT PROC FAR
MOV CH,04D
ROTATE:
MOV CL,04D
ROL BX,CL
MOV AL,BL
AND AL,0FH
ADD AL,30H
CMP AL,'9'
JB PRINT
ADD AL,07H

PRINT:
MOV DL,AL
MOV AH,2
INT 21H
DEC CH
JNE ROTATE
RET
CONVERT ENDP

CRLF PROC FAR
LEA DX,CTR
MOV AH,09H
INT 21H
RET
CRLF ENDP


EX:
MOV AH,4CH
INT 21H
CODES ENDS
END START
...全文
4778 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hsw1120141296 2016-11-18
  • 打赏
  • 举报
回复
多谢大神,帮大忙了
northwesternwind 2016-11-16
  • 打赏
  • 举报
回复
十几年没有玩汇编了,已经有点儿生疏了。。。。。。
northwesternwind 2016-11-16
  • 打赏
  • 举报
回复

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

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧