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.