Skip to content

Instantly share code, notes, and snippets.

@pepinisillo
Created April 11, 2025 05:45
Show Gist options
  • Select an option

  • Save pepinisillo/30c22e22e18ab5446642cfcad8103f03 to your computer and use it in GitHub Desktop.

Select an option

Save pepinisillo/30c22e22e18ab5446642cfcad8103f03 to your computer and use it in GitHub Desktop.
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment