| 
				
				
				
				
				
				
					管理员   | 
				楼主#更多
				
								发布于:2011-11-20 07:37 
								
									 
				
					
				
				 
					|  |  |  |  |  | 昨天看了别人的文章,然后写了一个进制输出的程序,程序实在是太乱了。并且可调试性也很差。于是今天重新写了一个。进制输出的原理很简单,就是先建一个‘0123456789ACDEF’的数据表然后根据 除(2,10或者16 这要看你想以什么进制数据形式输出了) 取余,再拿商去除(2,10,16) 再取余的原理。  拿余数跟数据表比较,取得相应的ASCII码。哎说不清楚,还是看程序吧。自认为程序写的还算清晰明了assume cs:codescodes  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  转换后的字符串的起始偏移地址  段地址为CSdata_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
 
 |  |  |  |  |  | 
 |