GNU/Linux xterm-256color zsh 150 views

.global _start

.section .bss
input:  .skip 20        // Buffer para entrada

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

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

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

parse_loop:
    ldrb w3, [x1, x2]
    cmp w3, #10
    beq parsed
    sub w3, w3, #'0'
    uxtw x4, w3
    mul x6, x6, x9
    add x6, x6, x4
    add x2, x2, #1
    b parse_loop
parsed:
    // x6 = año

    // Evaluar año % 4
    mov x0, x6
    mov x1, #4
    bl modulo
    cmp x0, #0
    bne no_bisiesto     // si año % 4 != 0

    // Evaluar año % 100
    mov x0, x6
    mov x1, #100
    bl modulo
    cmp x0, #0
    bne es_bisiesto     // si año % 100 != 0

    // Evaluar año % 400
    mov x0, x6
    mov x1, #400
    bl modulo
    cmp x0, #0
    beq es_bisiesto     // si año % 400 == 0

no_bisiesto:
    ldr x1, =msg_no
    mov x2, #16
    b imprimir

es_bisiesto:
    ldr x1, =msg_si
    mov x2, #14

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

    mov x0, #0
    mov x8, #93         // syscall exit
    svc 0

// ----------------------------------------------
// Subrutina: modulo
// Entrada: x0 = dividendo, x1 = divisor
// Salida:  x0 = resultado de x0 % x1
// ----------------------------------------------
modulo:
    udiv x2, x0, x1     // x2 = cociente
    mul x3, x2, x1      // x3 = cociente * divisor
    sub x0, x0, x3      // x0 = residuo
    ret