.global _start
.section .bss
input: .skip 20 // buffer de entrada
buffer: .skip 32 // buffer para imprimir resultado
.section .text
_start:
// --- Leer número desde teclado ---
mov x0, #0 // STDIN
ldr x1, =input // buffer
mov x2, #20 // bytes
mov x8, #63 // syscall read
svc 0
// --- Convertir texto a número entero → x6
ldr x1, =input
mov x6, #0 // resultado
mov x2, #0 // índice
mov x9, #10 // constante 10
parse_loop:
ldrb w3, [x1, x2]
cmp w3, #10
beq done_parse
sub w3, w3, #'0'
uxtw x4, w3
mul x6, x6, x9
add x6, x6, x4
add x2, x2, #1
b parse_loop
done_parse:
// x6 ahora contiene el valor de entrada: n
// --- Calcular factorial de x6 ---
mov x0, x6 // n
mov x1, #1 // acumulador: resultado = 1
fact_loop:
cmp x0, #1
ble end_fact
mul x1, x1, x0 // resultado *= n
sub x0, x0, #1 // n--
b fact_loop
end_fact:
// x1 contiene el resultado del factorial
// --- Convertir x1 a decimal y guardar en buffer ---
ldr x5, =buffer
add x5, x5, #31 // apuntar al final del buffer
mov x2, #0 // longitud
mov x7, x1 // número a convertir
mov x9, #10
convert_loop:
udiv x6, x7, x9
mul x3, x6, x9
sub x4, x7, x3
add x4, x4, #'0'
strb w4, [x5]
sub x5, x5, #1
add x2, x2, #1
mov x7, x6
cmp x7, #0
bne convert_loop
add x5, x5, #1 // puntero al primer dígito
mov w3, #'\n'
strb w3, [x5, x2]
add x2, x2, #1
// --- syscall write(STDOUT, buffer, length) ---
mov x0, #1
mov x1, x5
mov x8, #64
svc 0
// --- syscall exit(0) ---
mov x0, #0
mov x8, #93
svc 0