GNU/Linux xterm-256color bash 152 views

// ****************************************************************************
// * Nombre del archivo: practica.s
// * Descripción: Imprimir la tabla de multiplicar hasta 12 x 12
// * Autor: Roldan Castro Luis Alberto
// * Fecha: 07-04-2025
// * Plataforma: Raspberry Pi OS (64 bits)
// * Asciinema: https://asciinema.org/a/l4jNvyhGHcKYWCitUj8dvx0Iz
// ****************************************************************************

// ****************************************************************************
// Version de JavaScript
//
// Función para imprimir la tabla de multiplicar hasta 12x12
//function imprimirTablaMultiplicar() {
//    // Crear una tabla HTML
//    let tabla = '<table border="1" cellpadding="5" cellspacing="0">';
//    
    // Encabezado de la tabla
//    tabla += '<tr><th>×</th>';
//    for (let i = 1; i <= 12; i++) {
//        tabla += `<th>${i}</th>`;
//    }
//    tabla += '</tr>';
//    
//    // Filas de la tabla
//   for (let i = 1; i <= 12; i++) {
//        tabla += `<tr><th>${i}</th>`;
//        for (let j = 1; j <= 12; j++) {
//            tabla += `<td>${i * j}</td>`;
//        }
//        tabla += '</tr>';
//    }
//    
//    tabla += '</table>';
//   
// Mostrar la tabla en el documento
//    document.body.innerHTML = tabla;
//    
// También imprimir en consola
//    console.log("Tabla de multiplicar hasta 12x12:");
//    for (let i = 1; i <= 12; i++) {
//        let fila = "";
//        for (let j = 1; j <= 12; j++) {
//            fila += (i * j).toString().padStart(4, ' ');
//        }
//        console.log(fila);
//    }
//}

// Llamar a la función
//imprimirTablaMultiplicar();
// ****************************************************************************

.section .data
espacio:    .asciz " "
newline:    .asciz "\n"

.section .bss
buffer: .skip 20         // Para convertir número a cadena

.section .text
.global _start

_start:
    mov x20, #1          // i = 1 (multiplicando externo)

fila_loop:
    cmp x20, #13
    b.eq fin

    mov x21, #1          // j = 1 (multiplicando interno)

columna_loop:
    cmp x21, #13
    b.eq salto_linea

    mul x22, x20, x21    // resultado = i * j

    // convertir número (x22) a cadena ASCII
    mov x0, x22
    bl print_num

    // imprimir espacio
    ldr x0, =espacio
    mov x1, #1
    bl print

    add x21, x21, #1
    b columna_loop

salto_linea:
    ldr x0, =newline
    mov x1, #1
    bl print

    add x20, x20, #1
    b fila_loop

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

// -------------------------------
// print_num:
// Convierte el número en x0 a cadena y lo imprime
// -------------------------------
print_num:
    ldr x1, =buffer
    add x1, x1, #19      // apuntar al final del buffer
    mov x2, #0           // contador de dígitos

.num_loop:
    mov x3, #10
    udiv x4, x0, x3
    msub x5, x4, x3, x0  // x5 = x0 - x4*10 = resto

    add x5, x5, #'0'
    sub x1, x1, #1
    strb w5, [x1]
    mov x0, x4
    add x2, x2, #1
    cmp x0, #0
    b.ne .num_loop

    // imprimir resultado
    mov x0, #1          // stdout
    mov x8, #64         // syscall write
    mov x2, x2          // longitud
    mov x1, x1          // puntero al número
    svc #0
    ret

// Función print: x0 = puntero, x1 = longitud
print:
    mov x2, x1
    mov x1, x0
    mov x0, #1
    mov x8, #64
    svc #0
    ret