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