.global _start
.section .bss
input: .skip 20 // Buffer para lectura desde teclado
buffer: .skip 20 // Buffer para impresión del resultado
.section .text
_start:
// --- Leer número como texto desde teclado ---
mov x0, #0 // STDIN
ldr x1, =input // Dirección de buffer
mov x2, #20 // Tamaño máximo
mov x8, #63 // syscall read
svc 0
// --- Contar cuántos caracteres numéricos hay ---
ldr x1, =input // x1 = puntero al buffer
mov x2, #0 // x2 = índice
mov x3, #0 // x3 = contador de dígitos
count_loop:
ldrb w4, [x1, x2] // Cargar byte input[x2]
cmp w4, #10 // ¿Es '\n'?
beq done_count
cmp w4, #'0'
blt skip // si menor que '0', saltar
cmp w4, #'9'
bgt skip // si mayor que '9', saltar
add x3, x3, #1 // contador++
skip:
add x2, x2, #1
b count_loop
done_count:
// x3 contiene el número de dígitos
mov x7, x3 // pasamos valor a x7 para convertir
// --- Convertir x7 a texto decimal ---
ldr x5, =buffer
add x5, x5, #19 // apuntar al final del buffer
mov x2, #0 // longitud de impresión
mov x9, #10 // constante 10
mov x10, x7
convert_loop:
udiv x6, x10, x9
mul x8, x6, x9
sub x4, x10, x8
add x4, x4, #'0'
strb w4, [x5]
sub x5, x5, #1
add x2, x2, #1
mov x10, x6
cmp x10, #0
bne convert_loop
add x5, x5, #1
mov w3, #'\n'
strb w3, [x5, x2]
add x2, x2, #1
// --- syscall write(STDOUT, buffer, len) ---
mov x0, #1
mov x1, x5
mov x8, #64
svc 0
// --- syscall exit(0) ---
mov x0, #0
mov x8, #93
svc 0