![]() |
#2
爱以走远2007-09-07 00:11
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 |
*/ 出自: 编程中国 https://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