.section .data
buffer: .skip 16 // Espacio para guardar el resultado en texto
.section .text
.global _start
_start:
// Paso 1: Cargar los dos números (60 y 68)
mov x1, #60 // x1 = 60
mov x2, #68 // x2 = 68
// Paso 2: Sumar los dos números
add x3, x1, x2 // x3 = x1 + x2 = 128
// Paso 3: Dividir entre 2 (media)
mov x4, #2
udiv x0, x3, x4 // x0 = x3 / 2 = 64
// Paso 4: Convertir el resultado a texto (itoa)
ldr x1, =buffer // x1 apunta al buffer
bl itoa // convierte x0 → string en buffer
// Paso 5: Imprimir el resultado con syscall write
mov x0, #1 // x0 = STDOUT
ldr x1, =buffer // x1 = puntero al string
bl strlen // x0 = longitud
mov x2, x0 // x2 = longitud
mov x0, #1 // stdout otra vez
mov x8, #64 // syscall write
svc 0
// Paso 6: Finalizar el programa
mov x8, #93
mov x0, #0
svc 0
// ----------------------- strlen -----------------------
strlen:
// Entrada: x1 = puntero al string
// Salida: x0 = longitud del string
mov x2, x1
.loop:
ldrb w3, [x2], #1
cmp w3, #0
b.ne .loop
sub x0, x2, x1
ret
// ----------------------- itoa -----------------------
itoa:
// Entrada: x0 = número entero a convertir
// x1 = buffer destino
// Salida: buffer contiene el número como string
mov x2, x0 // x2 = número a convertir
mov x3, x1 // x3 = puntero base
add x4, x1, #10 // x4 = final del buffer
mov x5, #10
strb w5, [x4] // '\n'
mov x5, #0
strb w5, [x4, #1] // '\0'
mov x6, x4
.itoa_loop:
mov x5, #10
udiv x0, x2, x5
msub x5, x0, x5, x2 // x5 = x2 - (x0 * 10)
add x5, x5, #'0' // convertir a ASCII
sub x6, x6, #1
strb w5, [x6] // guardar carácter
mov x2, x0
cbnz x2, .itoa_loop
.copy_loop:
ldrb w5, [x6], #1
strb w5, [x1], #1
cmp w5, #0
b.ne .copy_loop
ret