GNU/Linux xterm-256color bash 208 views

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