// ****************************************************************************
// * Lenguajes de Interfaz en TECNM Campus ITT
// * Nombre del archivo: practica.s
// * Descripción: Programa que genera multiplos de 10 segun la cantidad que ingrese el usuario
// * Autor: [America Fernanda Nevarez de la Cruz]
// * Fecha: [202-04-10]
// * Plataforma: Raspberry Pi OS (64 bits)
// * Demostración: [https://asciinema.org/a/rv2xuVvsazpcRyz47kjkdpZpg]
// ****************************************************************************
// ****************************************************************************
// * Codigo equivalente en Ruby
// *def imprimir_multiplos_de_10(n)
// * puts "// *Los primeros #{n} múltiplos de 10 son:"
// * (1..n).each do |i|
// * multiplo = i * 10
// * puts "// *#{i}. #{multiplo}"
// * end
// *end
// *
// *print "// *Ingrese la cantidad de múltiplos de 10 que desea ver: "
// *cantidad = gets.chomp.to_i
// *
// *if cantidad <= 0
// * puts "// *Error: Debe ingresar un número positivo mayor que cero"
// *else
// * imprimir_multiplos_de_10(cantidad)
// *end
// ****************************************************************************
.data
msg_prompt: .asciz "Ingrese cantidad de múltiplos de 10 a generar: "
len_prompt = . - msg_prompt
msg_label: .asciz "Multiplo: "
len_label = . - msg_label
msg_newline: .asciz "\n"
len_newline = . - msg_newline
buffer: .fill 32, 1, 0 // Buffer para entrada y conversión
.text
.global _start
.align 2
_start:
// Mostrar prompt
mov x0, #1
adr x1, msg_prompt
mov x2, len_prompt
mov x8, #64
svc #0
// Leer entrada del usuario
mov x0, #0
adr x1, buffer
mov x2, #12
mov x8, #63
svc #0
// Convertir ASCII a número
mov x19, #0
adr x20, buffer
mov x21, #10
convert_loop:
ldrb w22, [x20], #1
cmp w22, #0xA
beq convert_done
sub w22, w22, #'0'
madd x19, x19, x21, x22
b convert_loop
convert_done:
mov x23, #1 // contador actual
mov x24, #0 // cantidad generada
loop_multiplos:
cmp x24, x19
bge exit_program
// Mostrar "Multiplo: "
mov x0, #1
adr x1, msg_label
mov x2, len_label
mov x8, #64
svc #0
// Calcular múltiplo (x0 = x23 * 10)
mov x0, x23
mov x1, #10
mul x0, x0, x1
bl print_number
// Salto de línea
mov x0, #1
adr x1, msg_newline
mov x2, len_newline
mov x8, #64
svc #0
add x23, x23, #1
add x24, x24, #1
b loop_multiplos
exit_program:
mov x0, #0
mov x8, #93
svc #0
// ===============================
// Función print_number (x0)
// ===============================
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