GNU/Linux xterm-256color bash 193 views

// ****************************************************************************
// * Lenguajes de Interfaz en TECNM Campus ITT
// * Nombre del archivo: practica.s
// * Descripción: Programa que genera 20 multiplos de 5
// * Autor: [America Fernanda Nevarez de la Cruz]
// * Fecha: [2025-04-10]
// * Plataforma: Raspberry Pi OS (64 bits)
// * Demostración:  [https://asciinema.org/a/CFoQLsjKFIC87KeHHMnp6UY9h]
// ****************************************************************************

// ****************************************************************************
// * Codigo equivalente en Ruby
// *def imprimir_multiplos_de_5(n)
// *  puts "// *Los primeros #{n} múltiplos de 5 son:"
// *  (1..n).each do |i|
// *    multiplo = i * 5
// *    puts "// *#{i}. #{multiplo}"
// *  end
// *end
// *
// *print "// *Ingrese la cantidad de múltiplos de 5 que desea ver: "
// *cantidad = gets.chomp.to_i
// *
// *if cantidad <= 0
// *  puts "// *Error: Debe ingresar un número positivo"
// *else
// *  imprimir_multiplos_de_5(cantidad)
// *end
// ****************************************************************************

.data
    msg_init:       .asciz "Primeros 20 múltiplos de 5:\n"
    msg_index:      .asciz "Multiplo #"
    msg_colon:      .asciz ": "
    msg_newline:    .asciz "\n"
    buffer:         .fill 32, 1, 0

.text
    .global _start
    .align 2

_start:
    // Mostrar mensaje inicial
    mov x0, #1
    adr x1, msg_init
    mov x2, 27
    mov x8, #64
    svc #0

    mov x19, #1      // índice del múltiplo (1 al 20)
    mov x20, #5      // base de los múltiplos

loop_multiplos:
    cmp x19, #21
    bge fin_programa

    // Mostrar "Multiplo #"
    mov x0, #1
    adr x1, msg_index
    mov x2, 10
    mov x8, #64
    svc #0

    // Mostrar número de índice
    mov x0, x19
    bl print_number

    // Mostrar ": "
    mov x0, #1
    adr x1, msg_colon
    mov x2, 2
    mov x8, #64
    svc #0

    // Calcular el múltiplo: x21 = x19 * 5
    mov x0, x19
    mov x1, x20
    mul x21, x0, x1
    mov x0, x21
    bl print_number

    // Nueva línea
    mov x0, #1
    adr x1, msg_newline
    mov x2, #1
    mov x8, #64
    svc #0

    add x19, x19, #1
    b loop_multiplos

fin_programa:
    mov x0, #0
    mov x8, #93
    svc #0

// ====================================
// Función: print_number
// Entrada: x0 = número a imprimir
// ====================================
print_number:
    stp x29, x30, [sp, -16]!
    mov x29, sp

    adr x1, buffer + 31
    mov w2, #0

    mov x3, #10

convert_to_ascii:
    udiv x4, x0, x3
    msub x5, x4, x3, x0
    add x5, x5, #'0'
    strb w5, [x1], #-1

    mov x0, x4
    cbnz x0, convert_to_ascii

    adr x2, buffer + 31
    sub x2, x2, x1
    add x2, x2, #1

    add x1, x1, #1
    mov x0, #1
    mov x8, #64
    svc #0

    ldp x29, x30, [sp], 16
    ret