管理员
|
楼主#
更多
发布于:2011-11-20 07:37
| | | | 昨天看了别人的文章,然后写了一个进制输出的程序,程序实在是太乱了。并且可调试性也很差。于是今天重新写了一个。进制输出的原理很简单,就是先建一个‘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 转换后的字符串的起始偏移地址 段地址为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
| | | | |
|