GNU/Linux xterm-256color zsh 163 views

.global _start

.section .bss
input:  .skip 20

.section .rodata
msg_si: .asciz "CUADRADO PERFECTO\n"
msg_no: .asciz "NO ES CUADRADO PERFECTO\n"

.section .text
_start:
    // Leer número desde teclado
    mov x0, #0           // STDIN
    ldr x1, =input
    mov x2, #20
    mov x8, #63          // syscall read
    svc 0

    // Convertir string a número → x6
    ldr x1, =input
    mov x6, #0
    mov x2, #0
    mov x9, #10

parse:
    ldrb w3, [x1, x2]
    cmp w3, #10
    beq parsedone
    sub w3, w3, #'0'
    uxtw x4, w3
    mul x6, x6, x9
    add x6, x6, x4
    add x2, x2, #1
    b parse
parsedone:
    // x6 tiene el número a probar

    // Probar desde x0 = 1 hasta x0*x0 > x6
    mov x0, #1

check_loop:
    mul x1, x0, x0       // x1 = x0 * x0
    cmp x1, x6
    beq es_cuadrado
    bgt no_cuadrado
    add x0, x0, #1
    b check_loop

es_cuadrado:
    ldr x1, =msg_si
    mov x2, #19
    b imprimir

no_cuadrado:
    ldr x1, =msg_no
    mov x2, #25

imprimir:
    mov x0, #1           // STDOUT
    mov x8, #64          // syscall write
    svc 0

    mov x0, #0           // exit(0)
    mov x8, #93
    svc 0