Tema IV Proyecto Final - Crypto-ch4r/Lenguajes-de-Interfaz- GitHub Wiki

Resumen

Desarrolla un programa que calcule el factorial de un número dado. El usuario podrá ingresar un número y el programa mostrará el resultado del factorial. Asegúrate de manejar correctamente los casos de números grandes y mostrar mensajes de error si es necesario.

Objetivo

Aplicar los conocimientos adquiridos a lo largo de la materia para implementar un programa que permita calcular el factorial de un número ingresado por el usuario.

Introducción

El factorial de un número se define como el producto de todos los números enteros positivos desde 1 hasta el número dado. El programa solicitará al usuario que ingrese un número y, posteriormente, mostrará en pantalla el resultado del factorial correspondiente. Para garantizar un funcionamiento adecuado, se ha tenido en cuenta el manejo correcto de números grandes, considerando las limitaciones de almacenamiento de los tipos de datos utilizados.

Metodología

Código

;Se declaran las etiquetas globales main, printf y scanf. Esto indica que estas etiquetas 
;están definidas en otro lugar y serán enlazadas durante el proceso de enlace.
global main        ; declara que main es una función global
extern printf      ; Declaración de la función externa "printf" (simbolos externos C)
extern scanf       ; Declaración de la función externa "scanf" (simbolos externos C)

;El código comienza declarando las secciones de datos y texto utilizando las directivas de ensamblador NASM. 
;La sección .data se utiliza para declarar datos estáticos, mientras que la sección .text se utiliza para el código ejecutable.
;En la sección .data, se definen varias variables y constantes:
SECTION .data
    MENSAJE DB 10,"Ingresa un número",10, 0  ; Cadena de texto: "Ingresa un número" seguido de un salto de línea
    SALTO DB 10                              ; Carácter de salto de línea
    LMENSAJE EQU $-MENSAJE                   ; Macro que calcula la longitud de la cadena "MENSAJE"
    CONT db 1                                ; Variable "CONT" inicializada en 1
    NUM2 DB 1                                ; Variable "NUM2" inicializada en 1
    FORMAT DB "%d",0                         ; Cadena de formato utilizada por "scanf"
    NM DB 1                                  ; Variable "NM" inicializada en 1

SECTION .bss
    RESULTADO RESB 2                         ; Reserva de 2 bytes de memoria para la variable "RESULTADO"

SECTION .text
main:
    PUSH MENSAJE                             ; Se empuja la dirección de "MENSAJE" en la pila
    CALL printf                              ; Se llama a la función "printf" para imprimir el mensaje
    ADD ESP, 4                               ; Se ajusta el puntero de la pila (se libera el espacio de "MENSAJE")

    PUSH NM                                  ; Se empuja la dirección de "NM" en la pila
    PUSH FORMAT                              ; Se empuja la dirección de "FORMAT" en la pila
    CALL scanf                               ; Se llama a la función "scanf" para leer un entero
    ADD ESP, 8                               ; Se ajusta el puntero de la pila (se liberan los espacios de "NM" y "FORMAT")

    MOV EAX, 1                               ; Se mueve el valor 1 a "EAX"
    MOV [RESULTADO], EAX                     ; Se almacena el valor de "EAX" en "RESULTADO"

    MOV ECX, 1                               ; Se mueve el valor 1 a "ECX"
    JMP factorial                            ; Se salta a la etiqueta "factorial"

    MOV ECX, [NM]                            ; Se mueve el valor de "NM" a "ECX"
    MOV EDX, 10                              ; Se mueve el valor 10 a "EDX"
    ADD ECX, EDX                             ; Se suma "EDX" a "ECX"
    MOV [NM], ECX                            ; Se almacena el valor de "ECX" en "NM"

ret

factorial:
    MOV AL, BYTE [CONT]                      ; Se carga el contenido de "CONT" en "AL"
    INC byte [CONT]                          ; Se incrementa en 1 el contenido de "CONT"
    MOV CL, BYTE [RESULTADO]                 ; Se mueve el contenido de "RESULTADO" a "CL"
    MUL CL                                   ; Se multiplica "AL" y "CL" y se guarda el resultado en "AL"
    MOV [RESULTADO], AL                      ; Se almacena el contenido de "AL" en "RESULTADO"
    MOV DL, BYTE [NM]                        ; Se mueve el contenido de "NM" a "DL"
    MOV CL, BYTE [CONT]                      ; Se mueve el contenido de "CONT" a "CL"
    CMP CL, DL                               ; Se compara "CL" con "DL"
    jnlE finalizar                           ; Salta a "finalizar" si "CL" es mayor o igual que "DL"
    jmp factorial                            ; Salta a "factorial" para continuar con la iteración

finalizar:
    MOV AL, BYTE [RESULTADO]                 ; Se mueve el contenido de "RESULTADO" a "AL"
    PUSH EAX                                 ; Se empuja "EAX" en la pila
    PUSH FORMAT                              ; Se empuja la dirección de "FORMAT" en la pila
    CALL printf                              ; Se llama a la función "printf" para imprimir el resultado
    ADD ESP, 8                               ; Se ajusta el puntero de la pila (se liberan los espacios de "EAX" y "FORMAT")
    ret                                      ; Fin de la función "main"

Resultados

image

Analisis

El código proporcionado para la calculadora de factoriales implementa de manera sencilla el cálculo del factorial de un número ingresado por el usuario haciendo uso de Ensamblador junto con funciones pertenecientes a C.

Conclusiónes

se ha logrado implementar un programa "funcional" que permite calcular el factorial de un número ingresado por el usuario. El programa solicita al usuario ingresar un número, realiza el cálculo del factorial y muestra el resultado correspondiente. A lo largo del proceso de desarrollo, se han aplicado conceptos fundamentales de programación, como el uso de bucles, la manipulación de variables y el manejo de entrada y salida de datos.

Fuentes