注册 登录
编程论坛 汇编论坛

[求助]十进制到十六进制的转换

xxygdufs 发布于 2006-05-13 09:59, 1524 次点击

DECIHEX SEGMENT
ASSSUME CS:DECIHEX
;*****************************************************************
MAIN PROC FAR
REPEAT: CALL DECIBIN
CALL CRLF
CALL BINIHEX
CALL CRLF
JMP REPEAT
MAIN ENDP
;*******************************************************************
DECIBIN PROC NEAR
MOV BX,0
NEWCHAR: MOV AH,01H
INT 21H
SUB AL,30H
JL EXIT
CMP AL,39H
JG EXIT
CBW
XCHG AX,BX
MOV CX,10
MUL CX
XCHG AX,BX
ADD BX,AX
JMP NEWCHAR
EXIT: RET
DECIBIN ENDP
;********************************************************************
BINIHEX PROC NEAR
MOV CH,4
ROTATE:MOV CL,4
ROL BX,CL
MOV AL,BL
ADN AL,0FH
ADD AL,30H
CMP AL,3AH
JL PRINTIT
ADD AL,7H
PRINTIT:MOV DL,AL
MOV AH,02H
INT 21H
DEC CH
JNZ ROTATE
RET
BINIHEX ENDP
;*****************************************************************
CRLF PROC NEAR
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
RET
CRLF ENDP
;******************************************************************
DECIHEX ENDS
END MAIN

请各位大侠帮忙看看上面的程序,错在哪里?
还有,里面的DECIBIN子程序块我不是很理解

4 回复
#2
公子吕2006-05-13 12:24

没有注释的代码就像谜语.尤其是汇编.

DECIBIN PROC NEAR
MOV BX,0
NEWCHAR: MOV AH,01H
INT 21H
SUB AL,30H ;接收数字字符,小于0退出.
JL EXIT
CMP AL,39H ;大于9退出.
JG EXIT
CBW ;扩展符号位
XCHG AX,BX
MOV CX,10
MUL CX
XCHG AX,BX
ADD BX,AX
JMP NEWCHAR
EXIT: RET
DECIBIN ENDP

你可能不理解加色的代码,第一次接收一个数字经运算送bx,第二次接收数后,bx(也就是第一个数)送到ax乘以10在加上第二个数.依此类推,但要注意,因为mul cx 它的结果是放在dx,ax中的,必须限制输入的数不能超过16位二进制补码的最大表示范围.

#3
公子吕2006-05-13 13:04
补充一下:你的程序有两处错误.
ASSSUME CS:DECIHEX ;错误多了一个S

BINIHEX PROC NEAR
MOV CH,4
ROTATE:MOV CL,4
ROL BX,CL
MOV AL,BL
ADN AL,0FH ;ADN应该是AND
ADD AL,30H
CMP AL,3AH

另外,你最好把MAIN PROC FAR里面的JMP REPEAT去掉并在其后面加上:
mov ah,7
int 21h
mov ah,4ch
int 21h
这样可以顺利退出程序.免得一直循环.
#4
xxygdufs2006-05-13 16:52

多谢楼上大侠
#5
公子吕2006-05-13 17:49

我不是大侠,看你的提问,我也复习了一下汇编.

1