Rutinas de Conversion ASCII-Binario y viceversa
Diversos procedimientos para hacer conversiones entre Cadenas de Caracteres y Numeros
;Autor Ensamblador
;URL
% TITLE "Rutinas de conversion de Binario a ASCII y vs.
IDEAL
DOSSEG
MODEL small
ASCNull EQU 0
DATASEG
CODESEG
EXTRN StrLong:proc, StrMayus:proc
PUBLIC HexDigito, ValCh, Num_Ascii
PUBLIC Bin_AscHex, SBin_AscDec, Bin_AscBin, Asc_Bin
%NEWPAGE
;----------------------------------------------------------------------------
; HexDigito Convierte un valor de 4-bits a un d¡gito ASCII
;----------------------------------------------------------------------------
; Entrada:
; dl = valor limitado a un rango entre 0..255
; Salida:
; dl = digito equivalente en ASCII hex
; Registros:
; dl
;----------------------------------------------------------------------------
PROC HexDigito
cmp dl,10
jb @@10
add dl, 'A'-10
ret
@@10:
or dl, '0'
ret
ENDP HexDigito
%NEWPAGE
;----------------------------------------------------------------------------
; ValCh Convierte un caracter digito ASCII a un valor binario
;----------------------------------------------------------------------------
; Entrada:
; dl = digito ASCII '0'..'9'; 'A'..'F'
; bx = base (2= binario, 10=decimal, 16=hexadecimal)
; Salida:
; cf = 0 : dx = valor binario equivalente
; cf = 1 : 1: caracter erroneo para este numero de base
; Registros:
; dx
;----------------------------------------------------------------------------
PROC ValCh
cmp dl, 9
jnbe @@10
sub dl, 7
@@10:
sub dl, '0'
test dl, 0f0h
jnz @@99
xor dh, dh
cmp dx, bx
@@99:
cmc
ret
ENDP ValCh
%NEWPAGE
;----------------------------------------------------------------------------
; Num_ASCII Convierte valores binarios sin signo a ASCII
;----------------------------------------------------------------------------
; Entrada:
; ax = valor de 16 bits a convertir
; bx = base del resultado ( 2= binario, 10 = decimal, 16 = hexadecimal)
; cx = numero minimo de digitos en la salida
; di = direcci¢n de la cadena donde almacenar el resultado
; Nota: Se asume que la cadena es lo suficientemente larga para
; almacenar el resultado
; cx = crea un resultado completo si cx es menor que el n£mero de
; d¡gitos requeridos para especificar el resultado o cx = 0
; si cx = 0 y ax = 0 entonces la longitud de la cadena ser 0
; inicializar cx = 1 se se desea la cadena = '0' si ax = 0
; Nota: asume (2 <= bx <= 16)
; Salida:
; ninguna
; Registros:
; ax, cx
;----------------------------------------------------------------------------
PROC Num_ASCII
push dx
push di
push si
; si = cuenta los digitos en pila
xor si, si
jcxz @@20
@@10:
xor dx,dx
div bx
call HexDigito
push dx
inc si
loop @@10
@@20:
inc cx
or ax,ax
jnz @@10
mov cx, si
jcxz @@40
cld
@@30:
pop ax
stosb
loop @@30
@@40:
mov [byte di],ASCNull
pop si
pop di
pop dx
ret
ENDP Num_ASCII
%NEWPAGE
;----------------------------------------------------------------------------
; Bin_ASCHex Convierte valores binarios a cadenas ASCII hex
;----------------------------------------------------------------------------
; Entrada:
; ax = valor de 16 bits a convertir
; cx = numero minimo de digitos en la salida
; di = direcci¢n de la cadena donde almacenar el resultado
; Nota: crea un resultado completo si cx es menor que el n£mero de
; d¡gitos requeridos para especificar el resultado
; Salida:
; ninguna
; Registros:
; ax,cx
;----------------------------------------------------------------------------
PROC Bin_ASCHex
push bx
mov bx,16
call Num_ASCII
pop bx
ret
ENDP Bin_ASCHex
%NEWPAGE
;----------------------------------------------------------------------------
; Bin_ASCDec Convierte valores binarios a cadenas ASCII decimal
;----------------------------------------------------------------------------
; Entrada:
; ax = valor de 16 bits a convertir
; cx = numero minimo de digitos en la salida
; di = direcci¢n de la cadena donde almacenar el resultado
; Nota: crea un resultado completo si cx es menor que el n£mero de
; d¡gitos requeridos para especificar el resultado
; Salida:
; ninguna
; Registros:
; ax,cx
;----------------------------------------------------------------------------
PROC Bin_ASCDec
push bx
mov bx,10
call Num_ASCII
pop bx
ret
ENDP Bin_ASCDec
%NEWPAGE
;----------------------------------------------------------------------------
; SBin_ASCDec Convierte valores binarios a cadenas ASCII decimal
;----------------------------------------------------------------------------
; Entrada:
; ax = valor de 16 bits a convertir
; cx = numero minimo de digitos en la salida
; di = direcci¢n de la cadena donde almacenar el resultado
; Nota: crea un resultado completo si cx es menor que el n£mero de
; d¡gitos requeridos para especificar el resultado
; Salida:
; ninguna
; Registros:
; ax,cx
;----------------------------------------------------------------------------
PROC SBin_ASCDec
push bx
push di
cmp ax,0
jge @@10
neg ax
mov [byte di],'-'
inc di
@@10:
mov bx,10
call Num_ASCII
pop di
pop bx
ret
ENDP SBin_ASCDec
%NEWPAGE
;----------------------------------------------------------------------------
; Bin_ASCBin Convierte valores binarios a cadenas ASCII binarias
;----------------------------------------------------------------------------
; Entrada:
; ax = valor de 16 bits a convertir
; cx = numero minimo de digitos en la salida
; di = direcci¢n de la cadena donde almacenar el resultado
; Nota: crea un resultado completo si cx es menor que el n£mero de
; d¡gitos requeridos para especificar el resultado
; Salida:
; ninguna
; Registros:
; ax,cx
;----------------------------------------------------------------------------
PROC Bin_ASCBin
push bx
mov bx,2
call Num_ASCII
pop bx
ret
ENDP Bin_ASCBin
%NEWPAGE
;----------------------------------------------------------------------------
; Ch_BASE Retorna el numero base de una cadena
;----------------------------------------------------------------------------
; Nota
; Subrutina privada de ASC_BIN.
;Entrada:
; si = apuntador al terminador nulo al final de la cadena
; Nota: Se asume la longitud de la cadena >= 1
; Salida:
; bx = base del resultado ( 2= binario, 10 = decimal, 16 = hexadecimal)
; si = direcci¢n del £tlimo caracter d¡gito probable en la cadena
; Registros:
; bx, dl, si
;----------------------------------------------------------------------------
PROC Ch_BASE
mov dl, [byte si - 1]
mov bx, 16
cmp dl, 'H'
je @@10
mov bx,2
cmp dl, 'B'
je @@10
mov bx,10
cmp dl, 'D'
jne @@20
@@10:
dec si
@@20:
ret
ENDP Ch_BASE
%NEWPAGE
;----------------------------------------------------------------------------
; ASC_Num Retorna el numero base de una cadena
;----------------------------------------------------------------------------
; Nota
; Subrutina privada de ASC_BIN.
;Entrada:
; ax = valor inicial
; bx = numero de base ( 2= binario, 10 = decimal, 16 = hexadecimal)
; di = direcci¢n de la cadena sin signo
; si = apuntador al terminador nulo al final de la cadena
; Salida:
; cf = 0 : ax = valor sin signo
; cf = 1 : 1: caracter erroneo para este numero de base
; Registros:
; ax, cx, dx, si
;----------------------------------------------------------------------------
PROC ASC_Num
mov cx,1
@@10:
cmp si,di
je @@99
dec si
mov dl, [byte si]
call ValCh
jc @@99
push cx
xchg ax,cx
mul dx
add cx, ax
pop ax
mul bx
xchg ax, cx
jmp @@10
@@99:
ret
ENDP ASC_Num
%NEWPAGE
;----------------------------------------------------------------------------
; ASC_Bin Retorna el numero base de una cadena
;----------------------------------------------------------------------------
; Entrada:
; di = cadena ASCIIZ para convertir en binario
; 'H' al final de la cadena = hexadecimal
; 'B' al final de la cadena = binario
; 'D' al final de la cadena = decimal
; '-' en s[0] indica n£mero negativo
; Nota: No se permiten espacios en la cadena
;
; Salida:
; cf = 0 : ax = valor sin signo
; cf = 1 : 1: caracter erroneo para este numero de base
; Nota: caracteres en la cadena convertidos a may£sculas
; Nota: cadena nula coloca 0 en ax
; Registros:
; ax
;----------------------------------------------------------------------------
PROC Asc_Bin
push ax
push cx
push dx
push si
call StrMayus
call StrLong
xor ax, ax
jcxz @@99
mov si, di
add si, cx
cmp [byte di], '-'
pushf
jne @@10
inc di
@@10:
call Ch_BASE
call Asc_Num
rcl bx, 1
popf
jne @@20
neg ax
dec di
@@20:
rcr bx, 1
@@99:
pop si
pop dx
pop cx
pop bx
ret
ENDP ASC_Bin
END
ENDP Asc_Bin