GNU/Linux xterm-256color bash 149 views

// ****************************************************************************
// * Lenguajes de Interfaz en TECNM Campus ITT
// * Nombre del archivo: practica.s
// * Descripción: Ciclo de iteraciones con incremento personlizado de 2
// * Autor: [America Fernanda Nevarez de la Cruz]
// * Fecha: [2025-04-08]
// * Plataforma: Raspberry Pi OS (64 bits)
// * Demostración:  [https://asciinema.org/a/3pge5jd2Kamm0LDKCFMU1EsMC]
// ****************************************************************************

// ****************************************************************************
// * Codigo equivalente en python
// *def print_number(num):
// *    """Función equivalente a print_int: convierte entero a string y lo imprime"""
// *    print(num)
// *
// *def main():
// *    # Equivalente a _start
// *    print("Ciclo de 10 iteraciones:")  # Equivalente a print_msg
// *    
// *    i = 1  # x20 = contador (inicializado en 1)
// *    
// *    while i < 11:  # Equivalente al loop (cmp x20, #11 / bge end_program)
// *        print_number(i)  # Equivalente a mov x0, x20 / bl print_int
// *        i += 1  # Equivalente a add x20, x20, #1
// *    
// *    print()  # Equivalente al salto de línea final
// *
// *if __name__ == "__main__":
// *    main()
// ****************************************************************************
.section .data
msg:        .ascii "Ciclo con incremento de 2:\n"
len_msg = . - msg

newline:    .ascii "\n"

.section .bss
num_buffer: .skip 16

.section .text
.global _start

_start:
    // Imprimir mensaje
    ldr x0, =msg
    mov x1, #len_msg
    bl print_msg

    mov x20, #1        // Contador i = 1

loop:
    cmp x20, #11       // ¿i > 10?
    bge end_program

    mov x0, x20        // Copiar i en x0 para imprimir
    bl print_int

    add x20, x20, #2   // i += 2
    b loop

end_program:
    // Salto de línea final
    ldr x1, =newline
    mov x2, #1
    mov x0, #1
    mov x8, #64
    svc #0

    // Salir
    mov x8, #93
    mov x0, #0
    svc #0

// ---------------- Funciones ----------------

print_msg:
    mov x2, x1
    mov x1, x0
    mov x0, #1
    mov x8, #64
    svc #0
    ret

print_int:
    ldr x1, =num_buffer
    add x1, x1, #15
    mov x2, #10
    mov x3, x0
    mov x4, x1

convert:
    udiv x5, x3, x2
    msub x6, x5, x2, x3
    add x6, x6, #'0'
    sub x1, x1, #1
    strb w6, [x1]
    mov x3, x5
    cbz x3, print_it
    b convert

print_it:
    sub x2, x4, x1
    mov x0, #1
    mov x8, #64
    mov x1, x1
    svc #0

    // Salto de línea
    ldr x1, =newline
    mov x2, #1
    mov x0, #1
    mov x8, #64
    svc #0
    ret