16进制转换:10进制转换成2~16进...

;该程序运用子程序设计的方法实现它的功能
;功能:该程序是把从键盘上敲入的数字转换成2~16进制中的任一进制
;功能:用户可以反复输入要转换的数制和要转换的数,按非'y'结束程序的运行
stack segment stack
db 200 dup(0)
stack ends
data segment
buf db 'p=$'
buf1 db 0dh,0ah,'number=$'
buf2 db 0dh,0ah,'continue?(y/n):$'
buf10 db 7
db ?
db 7 dup(0)
bufp db 16 dup(0)
bufer db 0dh,0ah,'error!',0dh,0ah,'p must larger than 1$'
result db 0dh,0ah,'result=$'
style db 0dh,0ah,'$'
data ends
code segment
assume ds:data,cs:code,ss:stack
begin: mov ax,data
mov ds,ax ;初始化
lea dx,buf ;显示p=
mov ah,9
int 21h
lea dx,buf10 ;输入一个进制(大于等于2)数到buf10
mov ah,10
int 21h
cmp [buf10+2],'-'
je exit1
cmp [buf10+2],31h
jbe exit1
lea si,buf10+2 ;初始化子过程f10to2的入口参数
mov cl,[si-1]
mov ch,0
call f10to2 ;调用子过程f10to2
cmp si,-1 ;异常处理
je exit1
mov bx,ax ;初始化子过程f2top的入口参数
lea dx,buf1 ;显示nubmer=
mov ah,9
int 21h
lea dx,buf10 ;输入一个要转换的数到buf10
mov ah,10
int 21h
lea si,buf10+2 ;初始化子过程f10to2的入口参数
mov cl,[si-1]
mov ch,0
call f10to2 ;调用子过程f10to2
cmp si,-1 ;异常处理
je exit1
lea si,bufp ;初始化子过程f2top的入口参数
or ax,ax
jns lopf
neg ax
mov [si],byte ptr '-'
inc si
lopf: call f2top
lea dx,result ;显示result=
mov ah,9
int 21h
mov [si],byte ptr 0dh ;为输出作准备
mov [si+1],byte ptr 0ah
mov [si+2],byte ptr '$'
lea dx,bufp ;输出
mov ah,9
int 21h
lea dx,buf2 ;输出continue?(y/n):
mov ah,9
int 21h
mov ah,1 ;输入一个字符到al
int 21h
cmp al,'y'
je next
mov ah,4ch ;返回DOS
int 21h
exit1: lea dx,bufer
mov ah,9
int 21h
mov ah,4ch
int 21h
next: lea dx,style
mov ah,9
int 21h
jmp begin




;子程序名: f10to2
;功能: 将由si指示的字节存储区的有符号十进制数转换成二进制数送入ax之中
;入口参数: si----指向待转换的有符号十进制数存储区的首址
; cx----存放待转换十进制数的位数(包括符号位)
;出口参数: si----当其值为-1时,表示十进制数的绝对值超过了65535,或者被转换的不是合法的十进制数
; ax----转换后的二进制数
;所用寄存器: bx----用来存放十进制的第i位
; dx----用来存放乘积的高位
data segment
dat dw 10
sign db ?
data ends
f10to2 proc
push dx
push bx
mov ax,0
mov sign,0
mov bl,[si]
cmp bl,'+'
jz a
cmp bl,'-'
jnz next2
mov sign,1
a: dec cx
next1: inc si
mov bl,[si]
next2: cmp bl,30h
jb d1
cmp bl,39h
ja d1
sub bl,30h
mov bh,0
mul dat
jo d1
add ax,bx
jc d1
dec cx
jne next1
cmp sign,1
jne qq
neg ax
qq: pop bx
pop dx
ret
d1: mov si,-1
jmp qq
f10to2 endp
;子程序名: f2top
;功能: 将ax中的十六位无符号数转换成p进制数
;入口参数: ax----存放待转换的十六位无符号数
; bx----存放要转换的数制p
; si----存放p进制的字节存储区首址
;出口参数: 所求p进制数各位数字的ASCII码按高位在前,低位在后的顺序存放在 以si为指针的字节存储区中,si指向最后一个ascii码的下一个字节
;所用寄存器: cx----p进制数字入栈出栈的计数器
; dx----做除法时存放被除数高位或余数
f2top proc
push cx
push dx
mov cx,0
lop1: mov dx,0
div bx
push dx
inc cx
or ax,ax
jne lop1
lop2: pop ax
cmp al,10
jb l1
add al,7
l1: add al,30h
mov [si],al
inc si
dec cx
jne lop2
pop dx
pop cx
ret
f2top endp

code ends
end begin
Tags:  16进制转换器 16进制转换

延伸阅读

最新评论

发表评论