📌 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