第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