GNU/Linux xterm-256color zsh 131 views

.section .data
buffer_int:     .skip 8              // para parte entera
buffer_dec:     .skip 8              // para parte decimal
dot:            .asciz "."           // punto decimal
arrow:          .asciz " -> "        // separador
newline:        .asciz "\n"          // salto de línea

.section .text
.global _start

_start:
    mov x19, #9                      // contador desde 9 hasta 25

loop:
    // 1. Convertir x19 a texto (entero original)
    mov x0, x19
    ldr x1, =buffer_int
    bl itoa

    // 2. Imprimir el número original
    mov x0, #1
    ldr x1, =buffer_int
    bl strlen
    mov x2, x0
    mov x0, #1
    mov x8, #64
    svc 0

    // 3. Imprimir " -> "
    ldr x1, =arrow
    bl strlen
    mov x2, x0
    mov x0, #1
    mov x8, #64
    svc 0

    // 4. Calcular raíz cuadrada
    scvtf s0, x19              // convertir entero a float
    fsqrt s1, s0               // s1 = sqrt(float)

    // 5. Obtener parte entera
    fcvtzu w0, s1              // w0 = int(sqrt)
    ldr x1, =buffer_int
    bl itoa

    // 6. Imprimir parte entera de la raíz
    mov x0, #1
    ldr x1, =buffer_int
    bl strlen
    mov x2, x0
    mov x0, #1
    mov x8, #64
    svc 0

    // 7. Imprimir punto decimal "."
    ldr x1, =dot
    bl strlen
    mov x2, x0
    mov x0, #1
    mov x8, #64
    svc 0

    // 8. Obtener primer decimal (parte decimal truncada)
    fmov s2, #10.0
    fmul s3, s1, s2            // multiplicamos por 10
    fcvtzu w0, s3              // convertir float a int
    mov x1, #10
    udiv x2, x0, x1
    msub x0, x2, x1, x0        // x0 = x0 % 10 (solo primer decimal)
    add x0, x0, #'0'           // convertir a ASCII
    ldr x1, =buffer_dec
    strb w0, [x1]              // guardar carácter decimal
    mov w0, #0
    strb w0, [x1, #1]          // terminar string

    // 9. Imprimir decimal
    mov x0, #1
    ldr x1, =buffer_dec
    bl strlen
    mov x2, x0
    mov x0, #1
    mov x8, #64
    svc 0

    // 10. Imprimir salto de línea
    ldr x1, =newline
    bl strlen
    mov x2, x0
    mov x0, #1
    mov x8, #64
    svc 0

    // 11. Siguiente número
    add x19, x19, #1
    cmp x19, #26
    blt loop

    // Salida del programa
    mov x8, #93
    mov x0, #0
    svc 0

// ------------ strlen ------------
strlen:
    mov x2, x1
.loop:
    ldrb w3, [x2], #1
    cmp w3, #0
    b.ne .loop
    sub x0, x2, x1
    ret

// ------------ itoa (entero -> string) ------------
itoa:
    mov x2, x0
    mov x3, x1
    add x4, x1, #10
    mov x5, #0
    strb w5, [x4]
    mov x6, x4
.itoa_loop:
    mov x5, #10
    udiv x0, x2, x5
    msub x5, x0, x5, x2
    add x5, x5, #'0'
    sub x6, x6, #1
    strb w5, [x6]
    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