;Eduardo Nahim Moo Canche 
;Saul Ricardo Contreras Hau
;Bricia Aide Chan Cante
;Hector Gonzales Pacheco Illesca 
section .data
    menu db "Selecciona una operacion:", 10
         db "1. Suma", 10
         db "2. Resta", 10
    menu_len equ $-menu

    prompt_n1 db "Teclea el primer numero (5 digitos, ej. 00045)", 10
    prompt_n1_len equ $-prompt_n1

    prompt_n2 db "Teclea el segundo numero (5 digitos, ej. 00045)", 10
    prompt_n2_len equ $-prompt_n2

    mensaje_suma db "La suma es: "
    mensaje_suma_len equ $-mensaje_suma

    mensaje_resta db "La resta es: "
    mensaje_resta_len equ $-mensaje_resta

    mensaje_error db "Error: el primer numero debe ser mayor o igual al segundo", 10
    mensaje_error_len equ $-mensaje_error

    mensaje_opcion db "Opcion no valida", 10
    mensaje_opcion_len equ $-mensaje_opcion

    opcion times 2 db 0
    num1 times 6 db 0
    num2 times 6 db 0
    resultado times 6 db 0
    salto db 10

section .text
    global _start

_start:
    ; Mostrar menu
    mov rax, 1
    mov rdi, 1
    mov rsi, menu
    mov rdx, menu_len
    syscall

    ; Leer opcion
    mov rax, 0
    mov rdi, 0
    mov rsi, opcion
    mov rdx, 2
    syscall

    ; Verificar opcion
    mov al, [opcion]
    sub al, '0'

    cmp al, 1
    je pedir_numeros

    cmp al, 2
    je pedir_numeros

    jmp opcion_invalida

pedir_numeros:
    ; Pedir primer numero
    mov rax, 1
    mov rdi, 1
    mov rsi, prompt_n1
    mov rdx, prompt_n1_len
    syscall

    mov rax, 0
    mov rdi, 0
    mov rsi, num1
    mov rdx, 6
    syscall

    ; Pedir segundo numero
    mov rax, 1
    mov rdi, 1
    mov rsi, prompt_n2
    mov rdx, prompt_n2_len
    syscall

    mov rax, 0
    mov rdi, 0
    mov rsi, num2
    mov rdx, 6
    syscall

    ; Convertir num1 de ASCII a entero
    xor rcx, rcx

    xor rax, rax
    mov al, [num1]
    sub al, '0'
    mov rbx, 10000
    mul rbx
    add rcx, rax

    xor rax, rax
    mov al, [num1 + 1]
    sub al, '0'
    mov rbx, 1000
    mul rbx
    add rcx, rax

    xor rax, rax
    mov al, [num1 + 2]
    sub al, '0'
    mov rbx, 100
    mul rbx
    add rcx, rax

    xor rax, rax
    mov al, [num1 + 3]
    sub al, '0'
    mov rbx, 10
    mul rbx
    add rcx, rax

    xor rax, rax
    mov al, [num1 + 4]
    sub al, '0'
    add rcx, rax

    ; Convertir num2 de ASCII a entero
    xor r8, r8

    xor rax, rax
    mov al, [num2]
    sub al, '0'
    mov rbx, 10000
    mul rbx
    add r8, rax

    xor rax, rax
    mov al, [num2 + 1]
    sub al, '0'
    mov rbx, 1000
    mul rbx
    add r8, rax

    xor rax, rax
    mov al, [num2 + 2]
    sub al, '0'
    mov rbx, 100
    mul rbx
    add r8, rax

    xor rax, rax
    mov al, [num2 + 3]
    sub al, '0'
    mov rbx, 10
    mul rbx
    add r8, rax

    xor rax, rax
    mov al, [num2 + 4]
    sub al, '0'
    add r8, rax

    ; Verificar operacion seleccionada
    mov al, [opcion]
    sub al, '0'

    cmp al, 1
    je sumar

    cmp al, 2
    je restar

sumar:
    mov rax, rcx
    add rax, r8
    jmp convertir_resultado

restar:
    ; Verificar que num1 >= num2
    cmp rcx, r8
    jb error_resta

    mov rax, rcx
    sub rax, r8
    jmp convertir_resultado

convertir_resultado:
    ; Separar digitos y convertir a ASCII
    mov rbx, 100000
    xor rdx, rdx
    div rbx
    add rax, '0'
    mov [resultado], al

    mov rax, rdx
    mov rbx, 10000
    xor rdx, rdx
    div rbx
    add rax, '0'
    mov [resultado + 1], al

    mov rax, rdx
    mov rbx, 1000
    xor rdx, rdx
    div rbx
    add rax, '0'
    mov [resultado + 2], al

    mov rax, rdx
    mov rbx, 100
    xor rdx, rdx
    div rbx
    add rax, '0'
    mov [resultado + 3], al

    mov rax, rdx
    mov rbx, 10
    xor rdx, rdx
    div rbx
    add rax, '0'
    mov [resultado + 4], al

    add dl, '0'
    mov [resultado + 5], dl

    ; Mostrar mensaje segun operacion
    mov al, [opcion]
    sub al, '0'

    cmp al, 1
    je mostrar_suma

    cmp al, 2
    je mostrar_resta

mostrar_suma:
    mov rax, 1
    mov rdi, 1
    mov rsi, mensaje_suma
    mov rdx, mensaje_suma_len
    syscall
    jmp imprimir_resultado

mostrar_resta:
    mov rax, 1
    mov rdi, 1
    mov rsi, mensaje_resta
    mov rdx, mensaje_resta_len
    syscall
    jmp imprimir_resultado

imprimir_resultado:
    mov rax, 1
    mov rdi, 1
    mov rsi, resultado
    mov rdx, 6
    syscall

    mov rax, 1
    mov rdi, 1
    mov rsi, salto
    mov rdx, 1
    syscall

    jmp salir

error_resta:
    mov rax, 1
    mov rdi, 1
    mov rsi, mensaje_error
    mov rdx, mensaje_error_len
    syscall
    jmp salir

opcion_invalida:
    mov rax, 1
    mov rdi, 1
    mov rsi, mensaje_opcion
    mov rdx, mensaje_opcion_len
    syscall

salir:
    mov rax, 60
    mov rdi, 0
    syscall

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: