;MI VERSION
section .data
;Mensaje de ingresar el primer numero
num1 db "Ingresa el primer numero: "
num1_len equ $ - num1
;Mensaje de ingresar segundo numero
num2 db "Ingresa un segundo numero (debe ser menor que el primer número capturado): "
num2_len equ $ - num2
;Mensaje de seleccion de opción sume o resta
opcion db "Ingresar 1 si desea sumar los dos números ingresados o 2 si los desea restar"
opcion_lem equ $ - opcion
;Leer el valor 1
valor1 times 64 db 0
valor1_lem equ $ - valor1
;Leer el valor 2
valor2 times 64 db 0
valor2_lem equ $ - valor2
;Leer el seleccion
selc times 2 db 0
;Mensaje de resultado dela suma
msgs db "El resultado de la suma es: "
msgs_lem equ $ - msgs
;Mensaje de resultado de la resta
msgr db "El resultado de la resta es: "
msgr_lem equ $ - msgr
;Reserva del resultado delimita a 64 byts pero podemos ponerlo en equ $ - resultado
resultado times 64 db 0
resultado_lem equ 64
section .text
global _start
_start:
;solicitud del primer numero
mov rax, 1 ;imprimir
mov rdi, 1 ;en pantalla
mov rsi, num1
mov rdx, num1_len
syscall
;leemos el primer digito
mov rax, 0 ;sysread
mov rdi, 0 ;teclado estandar
mov rsi, valor1
mov rdx, valor1_lem
syscall
;convertir el numero a ASCII
mov rax, [valor1] ;CONTENIDO EN CORCHETES NO LA DIRECCION
add rax, 30h
;solicitud del segundo numero
mov rbx, 1 ;imprimir
mov rdi, 1 ;en pantalla
mov rsi, num2
mov rdx, num2_len
syscall
;leemos el digito
mov rax, 0 ;sysread
mov rdi, 0 ;teclado estandar
mov rsi, valor2
mov rdx, valor2_lem
syscall
;convertir el numero a ASCII
mov rbx, [valor2] ;CONTENIDO EN CORCHETES NO LA DIRECCION
add rbx, 30h
; mostrar seleccion de opcion suma o resta
mov rax, 1 ;imprimir
mov rdi, 1 ;en pantalla
mov rsi, opcion
mov rdx, opcion_lem
syscall
;leemos el digito
mov rax, 0 ;sysread
mov rdi, 0 ;teclado estandar
mov rsi, selc
mov rdx, 2
syscall
;Convetir opccion a ASCII
mov al, [selc]
sub al, '0'
seleccion:
;Comprobar opcion
cmp al, 1
je suma
cmp al, 2
je resta
jmp seleccion
suma:
add rax, rbx
mov rax, 1 ;imprimir
mov rdi, 1 ;en pantalla
mov rsi, msgs
mov rdx, msgs_lem
syscall
resta:
sub rax, rbx
mov rax, 1 ;imprimir
mov rdi, 1 ;en pantalla
mov rsi, msgr
mov rdx, msgr_lem
syscall
mov rbx, 10 ;Divisor
mov rsi, resultado_lem ;Cuanto va imprimer/tamaño
mov rcx, 0 ;Contador cuantos digitos almacenamos
;El resultado se convierte de derecha a izquierda
convertir:
xor rdx, rdx ;Limpiar y colocar 0
div rbx ;Dividir
add dl, '0' ;Convertir residuo a caracter ASCII
dec rsi ;Retroceder una posicion
mov [resultado + rsi], dl ;Guarda el caracter en resultado sumando el retroceso de posición
inc rcx ;Contador del los digitos
test rax, rax ;Comprueba que el cociente es cero
jnz convertir ;Si no es cero repite, cuando todo se almaceno y es 0 sale para imprimir
;Impresion del resultado
mov rax, 1
mov rdi, 1
lea rsi, [resultado + rsi] ;Movemos los datos a rsi para su impresión
mov rdx, rcx ;Cantidad real de digitos
syscall
;TERMINAR PROGRAMA
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: