Diversos procedimientos para hacer conversiones entre Cadenas de Caracteres y Numeros

Rutinas de Conversion ASCII-Binario y viceversa

Diversos procedimientos para hacer conversiones entre Cadenas de Caracteres y Numeros

Búsqueda de ejemplos en Ensamblador
;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