; ============================================================
; PROGRAMA:
; Pedir dos números de 3 dígitos por teclado, sumarlos y
; mostrar el resultado (hasta 4 dígitos) en la terminal.
;
; Ejemplo:
;
;       teclea el primer numero (3 digitos, ej. 045)
;       475
;       teclea el segundo numero (3 digitos, ej. 045)
;       868
;       La suma es: 1343
;
; REGLA DE ENTRADA:
;       Siempre se teclean 3 dígitos.
;       Un número de 2 dígitos se escribe con un cero al inicio:
;       45 -> 045
;
; Instrucciones usadas: mov, add, sub, mul, div, xor, syscall
; (sin ciclos, sin saltos, sin comparaciones)
; ============================================================


section .data
    prompt_n1 db "teclea el primer numero (3 digitos, ej. 045)", 10
    prompt_n1_len equ $-prompt_n1

    prompt_n2 db "teclea el segundo numero (3 digitos, ej. 045)", 10
    prompt_n2_len equ $-prompt_n2

    mensaje_res db "La suma es: "
    mensaje_res_len equ $-mensaje_res

    ; 4 bytes por número: 3 dígitos + el Enter (10)
    num1 times 4 db 0
    num2 times 4 db 0

    ; 4 dígitos del resultado + salto de línea
    resultado times 4 db 0
    salto db 10


section .text
    global _start

_start:

    ; ========================================================
    ; PASO 1
    ; PEDIR Y LEER EL PRIMER NÚMERO
    ; ========================================================

    mov rax, 1                  ; write
    mov rdi, 1                  ; stdout
    mov rsi, prompt_n1
    mov rdx, prompt_n1_len
    syscall

    mov rax, 0                  ; read
    mov rdi, 0                  ; stdin (teclado)
    mov rsi, num1
    mov rdx, 4                  ; 3 dígitos + Enter
    syscall


    ; ========================================================
    ; PASO 2
    ; PEDIR Y LEER EL SEGUNDO NÚMERO
    ; ========================================================

    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, 4
    syscall


    ; ========================================================
    ; PASO 3
    ; CONVERTIR num1 DE ASCII A ENTERO
    ;
    ; Si teclean "475":
    ;
    ; num1 = '4' '7' '5'  (34h 37h 35h)
    ;
    ; Cada carácter menos "0" (30h) da el dígito:
    ;
    ; 4, 7, 5
    ;
    ; Y se arma el número así:
    ;
    ; ((4 * 10) + 7) * 10 + 5 = 475
    ; ========================================================

    mov rbx, 10                 ; multiplicador

    xor rax, rax
    mov al, [num1]              ; '4'
    sub al, "0"                 ; 4

    mul rbx                     ; RAX = 4 * 10 = 40

    xor rdx, rdx
    mov dl, [num1 + 1]          ; '7'
    sub dl, "0"                 ; 7
    add rax, rdx                ; RAX = 47

    mul rbx                     ; RAX = 47 * 10 = 470

    xor rdx, rdx
    mov dl, [num1 + 2]          ; '5'
    sub dl, "0"                 ; 5
    add rax, rdx                ; RAX = 475

    mov rcx, rax                ; guardamos num1 en RCX


    ; ========================================================
    ; PASO 4
    ; CONVERTIR num2 DE ASCII A ENTERO
    ; (mismo procedimiento)
    ; ========================================================

    xor rax, rax
    mov al, [num2]
    sub al, "0"

    mul rbx

    xor rdx, rdx
    mov dl, [num2 + 1]
    sub dl, "0"
    add rax, rdx

    mul rbx

    xor rdx, rdx
    mov dl, [num2 + 2]
    sub dl, "0"
    add rax, rdx                ; RAX = num2


    ; ========================================================
    ; PASO 5
    ; SUMAR
    ;
    ; RAX = num2 + num1
    ; ========================================================

    add rax, rcx


    ; ========================================================
    ; PASO 6
    ; SEPARAR LOS DÍGITOS Y CONVERTIRLOS A ASCII
    ;
    ; Antes de cada DIV se pone RDX = 0 con XOR.
    ; Después de cada DIV:
    ;
    ; RAX = cociente (el dígito)
    ; RDX = residuo  (lo que falta separar)
    ; ========================================================

    ; ---- Millares: 1343 / 1000 -> RAX = 1, RDX = 343 ----
    mov rbx, 1000
    xor rdx, rdx
    div rbx
    add rax, "0"
    mov [resultado], al

    ; ---- Centenas: 343 / 100 -> RAX = 3, RDX = 43 ----
    mov rax, rdx
    mov rbx, 100
    xor rdx, rdx
    div rbx
    add rax, "0"
    mov [resultado + 1], al

    ; ---- Decenas: 43 / 10 -> RAX = 4, RDX = 3 ----
    mov rax, rdx
    mov rbx, 10
    xor rdx, rdx
    div rbx
    add rax, "0"
    mov [resultado + 2], al

    ; ---- Unidades: el último residuo ya es la unidad ----
    add dl, "0"
    mov [resultado + 3], dl


    ; ========================================================
    ; PASO 7
    ; IMPRIMIR "La suma es: " Y EL RESULTADO
    ; ========================================================

    mov rax, 1
    mov rdi, 1
    mov rsi, mensaje_res
    mov rdx, mensaje_res_len
    syscall

    mov rax, 1
    mov rdi, 1
    mov rsi, resultado
    mov rdx, 4
    syscall

    mov rax, 1
    mov rdi, 1
    mov rsi, salto
    mov rdx, 1
    syscall


    ; ========================================================
    ; PASO 8
    ; SALIR
    ; ========================================================

    mov rax, 60
    xor rdi, rdi                ; código de salida 0
    syscall

Embed on website

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