GNU/Linux xterm bash 95 views

📌 Demostración: Mostrar los números impares comprendidos entre 5 y 75 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 impares comprendidos entre 5 y 75.
La implementación se realiza en:

Assembly ARM64 para RaspbianOS en Raspberry Pi

🔧 Compilación en Raspberry Pi (ARM64)

as impares_5al75.s -o impares_5al75.o  
ld impares_5al75.o -o impares_5al75

▶️ Ejecución

./impares_5al75

👀 Código fuente

🔗 Código fuente en Gist: Programa 38 Muestra los numeros impares del 5 al 75 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 impares del 5 al 75         |
|   en Rust y Assembly ARM64 para RaspbianOS.                                 |
| • Demostración:                                                             |
|   https://asciinema.org/a/714649                                            |
| • Compilación (Raspberry Pi ARM64):                                         |
|     as impares_5al75.s -o impares_5al75.o                                   |
|     ld impares_5al75.o -o impares_5al75                                     |
| • Ejecución: ./impares_5al75                                                  |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

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

fn main() {
    for num in (5..=75).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 2 dígitos
newline:    .ascii "\n"

.section .text
.global _start

_start:
    mov x19, 5             // Comenzamos con el primer número impar (5)
    mov x20, 75            // Límite superior (75)

loop:
    // Convertir el número a ASCII
    mov x0, x19            // Cargar el número a convertir
    bl number_to_ascii     // Llamar a 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

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

    // Incrementar de 2 en 2 (siguiente número impar)
    add x19, x19, 2
    cmp x19, x20           // Comparar con el límite
    b.le loop              // Si ≤ 75, continuar

exit:
    // Salir del programa
    mov x0, 0              // Código de salida 0
    mov x8, SYS_EXIT
    svc 0

// Rutina para convertir número a ASCII de 2 dígitos
number_to_ascii:
    mov x1, 10             // Divisor
    udiv x2, x0, x1        // Dígito de decenas
    msub x3, x2, x1, x0    // Dígito de unidades (x0 % 10)

    // Convertir a ASCII
    add x2, x2, '0'
    add x3, x3, '0'

    // Almacenar en buffer
    adr x4, buffer
    strb w2, [x4]          // Decenas
    strb w3, [x4, 1]       // Unidades
    ret