如题:从键盘输入的两位十进制数转换为十六进制并送显示器显示。

要求:程序精炼,易读性强,转换方法代码有注释。麻烦各位了。

code segment
assume cs:code
main proc far
start:
push ds
sub ax,ax
push ax
mov bx,0
mov dx,0
mov cx,0 ;初始化
mov ah,1
int 21h ;读入第一位
sub al,'0' ;减去30H
mov dl,10
mul dl ;乘以10
mov bl,al ;放到bl中
mov ah,1
int 21h
sub al,'0'
add bl,al ;此时dl中为2进制表示

;以下换行

mov dl,13
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h

;以下为以16进制形式输出

mov cl,4
rol bl,cl ;左移四位以输出高位的16进制表示
mov dl,bl
and dl,0Fh
add dl,'0'
cmp dl,'9'
jng next1
add dl,7
next1:
mov ah,2
int 21h

rol bl,cl ;再左移四位以输出低位的16进制表示
mov dl,bl
and dl,0Fh
add dl,'0'
cmp dl,'9'
jng next2
add dl,7
next2:
mov ah,2
int 21h

ret
main endp
code ends
end start
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-12-27
;标准COM文件
;CTRL+C 结束程序
;用MASM5.0编译通过,以下是运行结果:
;
;E:\masm>10I16O
;
;13=0D
;56=38
;79=4F
;99=63
;20=14
;78=4E
;^C

CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
ORG 100H
START:
JMP BEGIN
TAB1 DB '0123456789ABCDEF'
N DB 0
MESS DB 0DH,0AH,24H

BEGIN:
MOV AL,0
MOV N,AL
MOV AH,9
MOV DX,OFFSET MESS
INT 21H

MOV CX,2 ;输入2个0-9字符
AGAIN:
MOV AH,8
INT 21H
CMP AL,'0'
JL AGAIN
CMP AL,'9'
JG AGAIN ;0-9之外字符无效
PUSH AX
MOV DL,AL
MOV AH,2 ;显示该有效字符
INT 21H
POP AX
SUB AL,30H
PUSH AX
MOV AL,N
MOV BL,10
MUL BL
POP BX
ADD AL,BL
MOV N,AL ;保存输入的10进制数据
LOOP AGAIN

MOV DL,'=' ;显示等号
MOV AH,02
INT 21H

MOV AH,0
MOV AL,N
MOV BL,16
DIV BL ;将输入的数/16,AH为余,AL为商
MOV BH,0
MOV BL,AH ;
ADD AL,30H ;转换成ASCII
MOV AH,2
MOV DL,AL ;显示16进制的第二位
INT 21H
MOV SI,OFFSET TAB1
ADD SI,BX ;在表中定位字符
MOV DL,[SI]
MOV AH,2
INT 21H ;显示16进制的第一位
JMP BEGIN

CODE ENDS
END START
第2个回答  2010-12-27
datarea segment
mess1 db 'Input:',13,10,'$'
mess2 db 'Output:',13,10,'$'
datarea ends
prognam segment
;---------------------------------------------
main proc far
assume cs:prognam,ds:datarea
start:
push ds
sub ax,ax
push ax
mov ax,datarea
mov ds,ax

lea dx,mess1
mov ah,09
int 21h

call decibin ;输入10进制转成2进制
call crlf ;回车换行

lea dx,mess2
mov ah,09
int 21h

call binihex ;2进制转成16进制

ret
main endp
;---------------------------------------------
decibin proc near
mov bx,0
newchar:
mov ah,1 ;输入数到AX
int 21h

mov dl,al
sub al,30h ;减去‘0’的ascii码,
jl exit1 ;若小于零返回
cbw ;扩展位

xchg ax,bx ;交换AX,BX
mov cx,10d
mul cx ;AX乘以10,即变成十位数
xchg ax,bx

add bx,ax ;把AX的十位数和BX个位数相加给BX
jmp newchar
exit1:
ret
decibin endp
;---------------------------------------------
binidec proc near ;2进制转10进制
push bx
push cx
push si
push di

mov cx,10000d
call dec_div
mov cx,1000d
call dec_div
mov cx,100d
call dec_div
mov cx,10d
call dec_div
mov cx,1d
call dec_div
pop di
pop si
pop cx
pop bx
ret
binidec endp
;---------------------------------------------
dec_div proc near
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al

add dl,30h
mov ah,02h
int 21h
ret
dec_div endp
;=============================================
binihex proc near ;2进制转16进制

mov ch,4
rotate:
mov cl,4
rol bx,cl ;共16位,循环左移,把高4位放到最后
mov al,bl
and al,0fh ;取AL中后四位
add al,30h
cmp al,3ah ;判断是数字还是字母
jl printit ;打印
add al,7h ;字母比数字ASCII码大7
printit:
mov dl,al
mov ah,2
int 21h
dec ch
jnz rotate
call crlf
ret
binihex endp
;---------------------------------------------
crlf proc near ;回车换行
mov dl,0ah
mov ah,2
int 21h

mov dl,0dh
mov ah,2
int 21h

ret
crlf endp
;---------------------------------------------------
prognam ends
end start