| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1456 人关注过本帖
标题:[原创]进制数据输出的通用程序
只看楼主 加入收藏
liyun2060
Rank: 2
等 级:新手上路
威 望:3
帖 子:22
专家分:0
注 册:2007-9-2
收藏
 问题点数:0 回复次数:1 
[原创]进制数据输出的通用程序
*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: liyun2060 E-mail:blakcuttlefish@hotmail.com
*/ 时间: 2007-9-5 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------


昨天看了别人的文章,然后写了一个进制输出的程序,程序实在是太乱了。并且可调试性也很差。于是今天重新写了一个。

进制输出的原理很简单,就是先建一个‘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

搜索更多相关主题的帖子: 进制 数据 输出 
2007-09-05 09:28
爱以走远
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:52
帖 子:7542
专家分:21
注 册:2007-3-16
收藏
得分:0 

DATA SEGMENT

DAT DW 32768D,16384D,8192D,4096D,2048D,1024D,512D,256D,128D,64D,32D,16D,8D,4D,2D,1D

DATAW DW 2710H,03E8H,64H,0AH,0001H

TEMP DB 0

TEMPDEC DW 0

DATA ENDS

;**********************************************;

;STACK SEGMENT STACK 'STACK'

;STA DB 50 DUP(?)

;STACK ENDS

;**********************************************;

CODE SEGMENT

ASSUME CS:CODE,DS:DATA ;,SS:STACK

START: MOV AX,DATA

MOV DS,AX

LEA BX,DAT

MOV SI,0

MOV DX,0

MOV CX,0

CLOOP: CALL ENTER_BIN ;return TEMP

NOPOP: CMP TEMP,1

JE YES_1

CMP TEMP,0

JE YES_0

JMP EXITLOOP

YES_1: ADD CX,WORD PTR[BX]

YES_0: INC BX

INC BX

INC SI

CMP SI,15D

JBE CLOOP

EXITLOOP:MOV DX,CX

INC SI

MOV CX,SI

RCL DX,CL

CALL CR_LF

CALL PRINT_DEC ;DX enter to PRINT_DEC or PRINT_HEX

CALL CR_LF

EXIT: MOV AX,4C00H

INT 21H

;-------------------------------------------------;

ENTER_BIN PROC NEAR ;return TEMP

MOV AH,01H

INT 21H

SUB AL,30H

MOV TEMP,AL

RET

ENTER_BIN ENDP

;-------------------------------------------------;

;PRINT_HEX PROC NEAR ;DX enter to PRINT_DEC or PRINT_HEX

;PRINT_HEX ENDP

;-------------------------------------------------;

PRINT_DEC PROC NEAR ;DX enter to PRINT_DEC or PRINT_HEX

MOV AX,DX

LEA BX,DATAW

MOV SI,0

MOV CX,05H

PLOOP: XOR DX,DX

DIV WORD PTR [BX+SI]

ADD AX,30H ;get ASCII

XCHG AX,DX

MOV TEMPDEC,AX

MOV AH,02H

INT 21H

MOV AX,TEMPDEC

INC SI

INC SI

LOOP PLOOP

RET

PRINT_DEC ENDP

;-------------------------------------------------;

CR_LF PROC NEAR

MOV TEMP, DL

MOV DL,0DH

MOV AH,02H

INT 21H

MOV DL,0AH

MOV AH,02H

INT 21H

MOV DL,TEMP

RET

CR_LF ENDP

;-------------------------------------------------;

CODE ENDS

END START


这个 二进制转换为10进制的
也发上来


   好好活着,因为我们会死很久!!!
2007-09-07 00:11
快速回复:[原创]进制数据输出的通用程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016535 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved