GNU/Linux xterm-256color zsh 155 views

.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