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