Jonathan Alexis Angulo Guzmán 10/02/2025
.MODEL SMALL
.STACK 100H
.DATA
MSG DB 'Serie de Fibonacci (30 numeros):', 0DH, 0AH, '$'
FIB1 DW 0001H, 0000H ; Primer número de Fibonacci (1) (32 bits)
FIB2 DW 0001H, 0000H ; Segundo número de Fibonacci (1) (32 bits)
COUNT DW 1 ; Contador de iteraciones
.CODE
MAIN PROC
; Inicializar segmento de datos
MOV AX, @DATA
MOV DS, AX
; Mostrar mensaje de inicio
MOV DX, OFFSET MSG
MOV AH, 09H
INT 21H
; Mostrar primer número (1)
MOV AX, FIB1
CALL PRINT_NUM
; Mostrar segundo número (1)
MOV AX, FIB2
CALL PRINT_NUM
; Bucle para calcular los siguientes 28 números
MOV CX, 28 ; Ya imprimimos los primeros dos
Jonathan Alexis Angulo Guzmán 10/02/2025
FIB_LOOP:
; Sumar los dos números anteriores (manejo de 32 bits)
MOV AX, FIB1 ; Parte baja
MOV DX, FIB1+2 ; Parte alta
ADD AX, FIB2 ; Sumar parte baja
ADC DX, FIB2+2 ; Sumar con acarreo parte alta
; Mostrar resultado
CALL PRINT_NUM
; Actualizar valores de Fibonacci
MOV BX, FIB2 ; Guardar FIB2 en BX (parte baja)
MOV FIB1, BX ; Actualizar FIB1 (parte baja)
MOV BX, FIB2+2 ; Guardar FIB2 en BX (parte alta)
MOV FIB1+2, BX ; Actualizar FIB1 (parte alta)
MOV FIB2, AX ; Actualizar FIB2 (parte baja)
MOV FIB2+2, DX ; Actualizar FIB2 (parte alta)
LOOP FIB_LOOP
; Terminar el programa
MOV AH, 4CH
INT 21H
MAIN ENDP
; -------------------------------------------------
Jonathan Alexis Angulo Guzmán 10/02/2025
; SUBRUTINA PARA IMPRIMIR UN NÚMERO EN DECIMAL
; -------------------------------------------------
PRINT_NUM PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
; Si el número es menor a 10, imprimir directamente
CMP AX, 10
JL PRINT_SINGLE
; Convertir número a ASCII y almacenarlo en pila
XOR CX, CX ; Limpiar contador
CONVERT_LOOP:
MOV DX, 0 ; Limpiar DX antes de la división
MOV BX, 10
DIV BX ; AX / 10, AL = cociente, DL = residuo (último dígito)
PUSH DX ; Guardar dígito en pila
INC CX ; Aumentar contador de dígitos
CMP AX, 0 ; Si AX == 0, salir
JNE CONVERT_LOOP
; Imprimir los dígitos en orden
PRINT_LOOP:
POP DX
ADD DL, '0' ; Convertir a ASCII
MOV AH, 02H
Jonathan Alexis Angulo Guzmán 10/02/2025
INT 21H
LOOP PRINT_LOOP
JMP PRINT_END
PRINT_SINGLE:
ADD AL, '0'
MOV DL, AL
MOV AH, 02H
INT 21H
PRINT_END:
; Imprimir espacio para separar los números
MOV DL, ' '
MOV AH, 02H
INT 21H
POP DX
POP CX
POP BX
POP AX
RET
PRINT_NUM ENDP
END MAIN
Jonathan Alexis Angulo Guzmán 10/02/2025