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
To embed this project on your website, copy the following code and paste it into your website's HTML: