|
进制输出的原理很简单,就是先建一个‘0123456789ACDEF’的数据表
然后根据 除(2,10或者16 这要看你想以什么进制数据形式输出了) 取余,再拿商去除(2,10,16) 再取余的原理。 拿余数跟数据表比较,取得相应的ASCII码。
哎说不清楚,还是看程序吧。自认为程序写的还算清晰明了
assume cs:codes
codes segment
start:
mov ax,cs
mov ds,ax
mov ax,0b800h
mov es,ax
mov cl,2
mov dl,011111111b
call data_turn
mov cx,ax
mov di,160*10+40
moves: mov ah,[si]
mov es:[di],ah
inc si
add di,2
loop moves
mov ah,04ch
int 21h
;/**////////////////////////////////////////////////////////////////////////////////转换程序开始nc
;数制转换通用程序
;功能:将内存中的数据转换成以2进制 16进制 或 10进制 表示的 相应的ASCII码字符串
;进口参数CL 需要转换成的进制
;进口参数DL 被转换数
;出口参数AX 转换后的字符串的长度
;出口参数SI 转换后的字符串的起始偏移地址 段地址为CS
data_turn proc
jmp turn_start
table_t1 db '0123456789abcdef'
table_t2 db 8 dup(?) ;用来存储转换后的数据
turn_start: push ds
push bx
mov ax,cs
mov ds,ax
mov si,7
mov al,dl
cmp al,0
je dl_zero ;如果被转换数为0 则直接将0写入table_t2+7处
LP: xor bh,bh
xor ah,ah
DIV cl
mov bl,ah
mov bh,table_t1[bx]
mov table_t2[si],bh
dec si
cmp al,0
je turn_end
jmp LP
dl_zero: mov ds:[table_t2+7],'0'
mov ax,1
lea si,table_t2
add si,7
jmp over
turn_end: mov ax,7
sub ax,si
lea si,table_t2
add si,8
sub si,ax
over: pop bx
pop ds
ret
data_turn endp
;/**//////////////////////////////////////////////转换程序结束
codes ends
end start
|
|