GNU/Linux xterm bash 82 views

📌 Demostración: Mostrar la tabla del 2 en ARM64 Assembly

💻 Lenguajes de Interfaz en TECNM Campus ITT
👨‍💻 Autor: Alejandro Suarez Sandoval
📅 Fecha: 2025/04/09

🎯 Descripción

Este programa muestra la tabla del 2 en la terminal.
La implementación se realiza en:

Assembly ARM64 para RaspbianOS en Raspberry Pi

🔧 Compilación en Raspberry Pi (ARM64)

as tabla_2.s -o tabla_2.o  
ld tabla_2.o -o tabla_2

▶️ Ejecución

./tabla_2

👀 Código fuente

🔗 Código fuente en Gist: Programa 21 Tabla de multiplicar del número 2 Código Assembly ARM64 para RaspbianOS

/*
 ______  ____               ____  __ __      
/\  _  \/\  _`\   /'\_/`\  /'___\/\ \\ \     
\ \ \L\ \ \ \L\ \/\      \/\ \__/\ \ \\ \    
 \ \  __ \ \ ,  /\ \ \__\ \ \  _``\ \ \\ \_  
  \ \ \/\ \ \ \\ \\ \ \_/\ \ \ \L\ \ \__ ,__\
   \ \_\ \_\ \_\ \_\ \_\\ \_\ \____/\/_/\_\_/
    \/_/\/_/\/_/\/ /\/_/ \/_/\/___/    \/_/  
                                             
♡ ∩_∩ 
(„• ֊ •„)♡
| ̄U U ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| 
| • Lenguajes de Interfaz en TECNM Campus ITT                            |   
| • Autor: Alejandro Suarez Sandoval                                     | 
| • Fecha: 2025/04/09                                                    | 
| • Descripción: Programa que muestra la tabla                           | 
|   del 2 en C# y Assembly ARM64 para RaspbianOS.                        | 
| • Demostración:                                                        |
|   https://asciinema.org/a/713434                                       |
| • Compilación (Raspberry Pi ARM64):                                    |  
|     as tabla_2.s -o tabla_2.o                                          |  
|     ld tabla_2.o -o tabla_2                                            |  
| • Ejecución: ./tabla_2                                                 |  
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄                                        

⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂ ⠂⠄⠄⠂☆
═════════•°• Demostración Código en lenguaje C# •°•═══════

using System;

class Program
{
    static void Main()
    {
        int i = 1;

        while (i <= 10)
        {
            int result = 2 * i;

            Console.WriteLine($"2 × {i} = {result}");

            i++;
        }
    }
}

════════════════════•°• ☆ •°•══════════════════════════════
/*

/* ⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂ ⠂⠄⠄⠂☆
═════════════•°• Código en ARM64 Assembly •°•═════════════ */

.data
header:     .ascii "Tabla del 2\n"
header_len = . - header

line_start: .ascii "2 × "
line_start_len = . - line_start

line_mid:   .ascii " = "
line_mid_len = . - line_mid

newline:    .ascii "\n"
newline_len = . - newline

buffer:     .fill 16, 1, 0  // Buffer para conversión numérica

.text
.global _start
.balign 4

_start:
    // Imprimir encabezado
    mov x0, #1              // stdout
    adr x1, header          // texto
    mov x2, header_len      // longitud
    mov x8, #64             // syscall write
    svc #0

    // Inicializar contador (i = 1)
    mov x19, #1             // contador

main_loop:
    cmp x19, #10
    b.gt exit_program

    // ---- Imprimir "2 × " ----
    mov x0, #1              // stdout
    adr x1, line_start
    mov x2, line_start_len
    mov x8, #64             // syscall write
    svc #0

    // ---- Convertir e imprimir multiplicador (i) ----
    mov x0, x19             // número a convertir
    bl int_to_ascii
    // x1 = buffer, x2 = length
    mov x20, x0             // guardamos file descriptor
    mov x0, x20             // restauramos file descriptor
    mov x8, #64             // syscall write
    svc #0

    // ---- Imprimir " = " ----
    mov x0, #1              // stdout
    adr x1, line_mid
    mov x2, line_mid_len
    mov x8, #64             // syscall write
    svc #0

    // ---- Calcular e imprimir resultado (2*i) ----
    lsl x0, x19, #1         // x0 = x19 * 2
    bl int_to_ascii
    mov x20, x0             // guardamos file descriptor
    mov x0, x20             // restauramos file descriptor
    mov x8, #64             // syscall write
    svc #0

    // ---- Imprimir nueva línea ----
    mov x0, #1              // stdout
    adr x1, newline
    mov x2, newline_len
    mov x8, #64             // syscall write
    svc #0

    // Incrementar contador
    add x19, x19, #1
    b main_loop

exit_program:
    // Salir
    mov x0, #0              // status 0
    mov x8, #93             // syscall exit
    svc #0

// Función: int_to_ascii
// Convierte un entero en su representación ASCII
// Entrada: x0 = número a convertir
// Salida:  x0 = file descriptor (1 para stdout)
//          x1 = puntero al buffer
//          x2 = longitud del string
int_to_ascii:
    mov x5, x0              // guardamos el número original
    mov x0, #1              // file descriptor (stdout)
    
    adr x1, buffer          // x1 = puntero al buffer
    add x1, x1, 15          // empezamos al final del buffer
    mov x3, #10             // divisor (base 10)
    mov x4, #0              // contador de dígitos

convert_loop:
    udiv x6, x5, x3         // x6 = cociente
    msub x7, x6, x3, x5     // x7 = residuo (x5 - x6*x3)
    add x7, x7, #48         // convertir a ASCII
    strb w7, [x1], #-1      // almacenar byte y decrementar puntero
    add x4, x4, #1          // incrementar contador de dígitos
    mov x5, x6              // actualizar cociente
    cbnz x5, convert_loop   // continuar si cociente ≠ 0

    // Ajustar puntero y calcular longitud
    add x1, x1, #1          // corregir puntero
    mov x2, x4              // longitud = número de dígitos
    
    ret