Teorema Fundamental de la Numeración (TFN)
Permite convertir una cadena de caracteres numérica y la transforma a su valor numérico mediante el teorema fundamental de la numéración.
;Autor Hector Torres
;URL
.model small
.stack
.data
cuantos db 6
cad db '000000$'
cad2 db '000000$'
cad3 db '000000$'
num dd 0
tfn dd 1000000,100000,10000,1000,100,10,1
.386
.code
.startup
; limpiar pantalla
mov ah,00h
mov al,03h
int 10h
mov cl,0 ; contar los caracteres leidos
mov SI,0 ; Indice de posiciones en la cadena cad
otro:
mov ah,07h ; leer caracteres sin eco
int 21h
cmp al,13 ;comparo con enter
je salir
cmp al,30h ; comparo si es menor que cero leo otro
jl otro
cmp al,39h ; comparo si es mayor que 9 leo otro
jg otro
mov cad[SI],al ; guardo en la cadena cad los caracteres leidos
mov dl,al ; imprimo el caracter leido
mov ah,02h
int 21h
inc SI ; incremento el indice de la cadena
inc cl ; incremento el contador
cmp cl,cuantos ; pregunto si ya lei todos los digitos
jne otro
salir:
; acomodar la $#%&&$#%/%$#" cadena
mov bl, cuantos ; obtengo el total de caracteres
sub bl,cl ; obtengo los espacios en cero
mov DI,BX ; a partid de donde voy a mover los caracteres
mov SI,0
mascad:
mov al,cad[SI]
mov cad2[DI],al
inc DI
inc SI
cmp SI,6
jne mascad
; convierte una cadena de carcteres en un solo numero
mov SI,0
mov DI,0
mov cl,0
masmul:
mov EAX,0
mov al,cad2[SI] ; tomo el primer carcater
sub al,30h ; lo convierto a numero restando 30h
mul tfn[DI] ; multiplico por 10 a la posicion
add num,EAX ; voy agregando las posiciones en num
inc SI ; dsiminuyo el indice de posicion y cadena
inc cl ; disminuyo el contador
add DI,4
cmp cl,cuantos ; comparo con cero
jne masmul ; si no es cero hago otro de lo contrario sale
; convierte un numero a cadena de caracteres
mov SI,0 ; indice de cadena
mov DI,0 ; indice de tfn
mov cl,0 ; contador de ocurrencias
mov EAX,num ; recuperamos en EAX el numero
masdiv:
mov EDX,0 ; limpiamos EDX para la division
div tfn[DI] ; dividimos entre las posiciones de TFN
add al,30h ; agrego 30h para convertir el numero a caracter
mov cad3[SI],al ; muevo el caracter a la cadena de impresion
inc SI ; incremto el indice de posicion y cadena
inc cl ; incremento el contador
add DI,4 ; incremento el indice de TFN
mov EAX,EDX
cmp cl,cuantos ; comparo con cero
jne masdiv ; si no es cero hago otro de lo contrario sale
mov ah,09h
lea dx,cad3
int 21h
.exit
end