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.

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