;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    

Embed on website

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