// ****************************************************************************
// * 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