section .data
    msg_menu db "--- CALCULADORA ---", 10, "1) Sumar 2) Restar 3) Multiplicar 4) Dividir 5) Salir", 10, "Elige: "
    len_menu equ $ - msg_menu
    msg_num1 db 10, "Num 1: "
    len_num1 equ $ - msg_num1
    msg_num2 db "Num 2: "
    len_num2 equ $ - msg_num2
    msg_res  db 10, "Resultado = "
    len_res  equ $ - msg_res
    msg_rem  db " Residuo = "
    len_rem  equ $ - msg_rem
    msg_err  db 10, "Opcion no valida. Intente de nuevo.", 10, 10
    len_err  equ $ - msg_err
    msg_bye  db 10, "¡Adios!", 10
    len_bye  equ $ - msg_bye
    newline  db 10

section .bss
    input_buf resb 1024     ; Buffer para guardar los datos de entrada
    input_ptr resq 1        ; Puntero para leer número por número
    num_buf   resb 32       ; Espacio temporal para armar el número en texto
    num1      resq 1
    num2      resq 1
    opcion    resq 1

section .text
global _start

; Macro para mostrar texto en pantalla
%macro PRINT 2
    mov rax, 1
    mov rdi, 1
    mov rsi, %1
    mov rdx, %2
    syscall
%endmacro

; Macro para leer el siguiente número entero de la entrada
%macro READ_NUM 1
    mov rsi, [input_ptr]
    xor rax, rax
%%skip:
    movzx rdx, byte [rsi]
    test rdx, rdx
    jz %%done
    cmp rdx, '0'
    jl %%next
    cmp rdx, '9'
    jg %%next
    jmp %%parse
%%next:
    inc rsi
    jmp %%skip
%%parse:
    movzx rdx, byte [rsi]
    cmp rdx, '0'
    jl %%done
    cmp rdx, '9'
    jg %%done
    sub rdx, '0'
    imul rax, 10
    add rax, rdx
    inc rsi
    jmp %%parse
%%done:
    mov [input_ptr], rsi
    mov [%1], rax
%endmacro

; Macro para convertir un registro numérico a texto e imprimirlo
%macro PRINT_NUM 1
    mov rax, %1
    mov rbx, 10
    mov rcx, num_buf + 31
    mov byte [rcx], 0
    dec rcx
%%loop:
    xor rdx, rdx
    div rbx
    add dl, '0'
    mov [rcx], dl
    dec rcx
    test rax, rax
    jnz %%loop
    inc rcx
    mov rax, 1
    mov rdi, 1
    mov rsi, rcx
    mov rdx, num_buf + 31
    sub rdx, rcx
    syscall
%endmacro

_start:
    ; Captura todos los datos ingresados en el cuadro de entrada
    mov rax, 0
    mov rdi, 0
    mov rsi, input_buf
    mov rdx, 1024
    syscall
    mov qword [input_ptr], input_buf

menu:
    PRINT msg_menu, len_menu
    READ_NUM opcion
    mov rcx, [opcion]
    cmp rcx, 5
    je salir
    cmp rcx, 1
    jl opcion_invalida
    cmp rcx, 4
    jg opcion_invalida

    PRINT msg_num1, len_num1
    READ_NUM num1
    PRINT msg_num2, len_num2
    READ_NUM num2

    mov rcx, [opcion]
    cmp rcx, 1
    je hacer_suma
    cmp rcx, 2
    je hacer_resta
    cmp rcx, 3
    je hacer_multi
    cmp rcx, 4
    je hacer_div

opcion_invalida:
    PRINT msg_err, len_err
    jmp menu

hacer_suma:
    PRINT msg_res, len_res
    mov rax, [num1]
    add rax, [num2]
    PRINT_NUM rax
    PRINT newline, 1
    PRINT newline, 1
    jmp menu

hacer_resta:
    PRINT msg_res, len_res
    mov rax, [num1]
    sub rax, [num2]
    PRINT_NUM rax
    PRINT newline, 1
    PRINT newline, 1
    jmp menu

hacer_multi:
    PRINT msg_res, len_res
    mov rax, [num1]
    imul rax, [num2]
    PRINT_NUM rax
    PRINT newline, 1
    PRINT newline, 1
    jmp menu

hacer_div:
    PRINT msg_res, len_res
    mov rax, [num1]
    xor rdx, rdx
    mov rbx, [num2]
    div rbx                  ; rax = cociente, rdx = residuo
    push rdx                 ; PRINT_NUM va a modificar rdx
    PRINT_NUM rax
    PRINT msg_rem, len_rem
    pop rdx
    PRINT_NUM rdx
    PRINT newline, 1
    PRINT newline, 1
    jmp menu

salir:
    PRINT msg_bye, len_bye
    mov rax, 60
    xor rdi, rdi
    syscall

Embed on website

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