Vistas de página en total

domingo, 16 de junio de 2013

ENTERO A CADENA

    Esta es la función contraria a la anterior. A esta función le daremos un valor numérico (32bits) y nos devolverá una cadena alfanumérica que representa el número en la base indicada. El formato de la función, como en el resto de mis funciones queda reflejado en la llamada a la función rutina
   
ITOA.ASM
; Copyright (C) 2013  José Ángel Moneo Fernández

;    This program is free software: you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation, either version 3 of the License, or
;   (at your option) any later version.

;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.

;    You should have received a copy of the GNU General Public License
;    along with this program.  If not, see <http://www.gnu.org/licenses/>.

include main.mac
;_modelo com ; quitar el ; para  compilar para com

_code

rutina _itoa dest,dato,base
        push bx
        push cx
        push dx
        push si
        push di
        mov cx,[bp].base    ;recogida del parámetro base a la que se convertirá
        mov bx,[bp].dato   ;recogida del parámetro numero de 16 bits a convertir
        mov si,offset numero  ;puntero a la variable auxiliar para procesamiento del número
        mov di,[bp].dest     ;recogida del parámetro destino, donde se quiere dejar el string de salida
        mov ax,[bx]        ;tomamos el numero a procesar y lo guardamos en la variable número
        mov [si],ax        ; primer word
        mov dx,[bx+2]    ;segundo word
        mov [si+2],dx   
        cmp word ptr [bp].base,10   ;Verifica si la base es 10
        jne posit
        test word ptr [si+2],8000h  ; si la base es 10, verifica el signo en el bit alto
        jz posit
        xor word ptr [si],0ffffh      ; el signo es negativo y por lo tanto hace el complemento a 2
        xor word ptr [si+2],0ffffh
        add word ptr [si],1
        adc word ptr [si+2],0
        mov byte ptr [di],'-'        ; añade el signo a la cadena de salida
        inc di                              ; incrementa el puntero de salida
        mov puntero,di               ; almacena el puntero para el inicio la posterior formación del número   posit:

        xor di,di                       ;inica cuenta de caracteres , uso ahora di como contador  

         xor bh,bh                    ;inicia bh
  conv:
        mov ax,[si+2]           ;toma la parte alta del número
        xor dx,dx                ;borra el resto
        div cx                       ;divide por la base
        mov [si+2],ax        ; almacena el resultado
        mov ax,[si]        ;toma la parte baja
        div cx                ; divide por la base
        mov [si],ax    ;almacena el resultado
        mov bl,dl               ;toma el resto en bl, para indexar el caraceter
        mov dl,[bx+caracteres]       ; coge el caracter correspondiente al valor del resto
        push dx                         ;almacena en pila el caracter interpretado, para recogerlo luego en ax
        inc di                         ;incrementa di, usado como contador de caracteres
        cmp byte ptr [si],0    ;Ha terminado la conversión si el número ya es 0
        jne conv
        cmp byte ptr [si+2],0
        jne conv
        mov cx,di               ;almacena el contador en cx para la copia
        mov di,puntero; recupero el valor de DI como puntero al destino
   final:
        pop ax                  ; recupera el caracter interpretado
        mov [di],al         ;almacena el caracter en la cadena
        inc di                  ;incrementa el puntero
        loop final           ; continua la copia
        mov byte ptr [di],0    ; coloca el 0 de final de cadena
        pop di
        pop si
        pop dx
        pop cx
        pop bx
        pop bp
        ret
_itoa endp
_data
caracteres db "0123456789ABCDEF"
numero dd 0
puntero dw 0
_end






No hay comentarios:

Publicar un comentario

Si tienes algún comentario, duda o sugerencia, o si quieres aportar algún código creado a partir de las librerías expuestas aquí, por favor, indícamelo.