GNU/Linux xterm bash 91 views

📌 Demostración: Imprimir los números pares comprendidos entre 1 a 50 en ARM64 Assembly

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

🎯 Descripción

Este programa imprime los números pares del 1 al 50.
La implementación se realiza en:

Assembly ARM64 para RaspbianOS en Raspberry Pi

🔧 Compilación en Raspberry Pi (ARM64)

as pares_1al50.s -o pares_1al50.o  
ld pares_1al50.o -o pares_1al50

▶️ Ejecución

./pares_1al50

👀 Código fuente

🔗 Código fuente en Gist: Programa 37 Muestra los numeros pares del 1 al 50 mostrando resultado en terminal 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/10                                                         |
| • Descripción: Programa que muestra los numeros pares del 1 al 50           |
|   en Rust y Assembly ARM64 para RaspbianOS.                                 |
| • Demostración:                                                             |
|   https://asciinema.org/a/714632                                            |
| • Compilación (Raspberry Pi ARM64):                                         |
|     as pares_1al50.s -o pares_1al50.o                                       |
|     ld pares_1al50.o -o pares_1al50                                         |
| • Ejecución: ./pares_1al50                                                  |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

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

fn main() {
    for num in (2..=50).step_by(2) {
        println!("{}", num);
    }
}

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

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

// Definiciones de constantes
.equ STDOUT, 1
.equ SYS_WRITE, 64
.equ SYS_EXIT, 93

.section .data
buffer:     .ascii "  "    // Buffer para almacenar los dígitos (2 bytes)
newline:    .ascii "\n"

.section .text
.global _start

_start:
    mov x19, 1             // Comenzamos con el número 1
    mov x20, 50            // Límite superior (50)

loop:
    // Verificar si el número es par
    tst x19, #1            // Testear el bit menos significativo
    b.ne next              // Si no es cero (impar), saltar a 'next'

    // Si es par, imprimirlo
    mov x0, x19            // Cargar el número a convertir
    bl number_to_ascii     // Llamar a la rutina de conversión

    // Escribir el número
    mov x0, STDOUT         // Descriptor de archivo (stdout)
    adr x1, buffer         // Dirección del buffer
    mov x2, 2              // Longitud (2 dígitos)
    mov x8, SYS_WRITE      // Número de llamada al sistema (write)
    svc 0                  // Llamar al sistema

    // Escribir nueva línea
    mov x0, STDOUT
    adr x1, newline
    mov x2, 1
    mov x8, SYS_WRITE
    svc 0

next:
    add x19, x19, 1        // Incrementar en 1 para el siguiente número
    cmp x19, x20           // Comparar con el límite
    b.le loop              // Si es menor o igual, repetir el bucle

exit:
    // Salir del programa
    mov x0, 0              // Código de salida 0
    mov x8, SYS_EXIT       // Número de llamada al sistema (exit)
    svc 0

// Rutina para convertir un número a su representación ASCII de 2 dígitos
// Entrada: x0 = número a convertir (0-99)
// Salida: buffer actualizado con los dígitos ASCII
number_to_ascii:
    mov x1, 10             // Divisor
    udiv x2, x0, x1        // x2 = x0 / 10 (dígito de las decenas)
    msub x3, x2, x1, x0    // x3 = x0 % 10 (dígito de las unidades)

    // Convertir dígitos a ASCII
    add x2, x2, '0'        // Convertir decenas a ASCII
    add x3, x3, '0'        // Convertir unidades a ASCII

    // Almacenar en buffer
    adr x4, buffer         // Dirección del buffer
    strb w2, [x4]          // Almacenar decenas
    strb w3, [x4, 1]       // Almacenar unidades

    ret                    // Retornar