📌 Demostración: Simulador de lanzamiento de moneda en ARM64 Assembly
💻 Lenguajes de Interfaz en TECNM Campus ITT
👨💻 Autor: Alejandro Suarez Sandoval
📅 Fecha: 2025/04/10
🎯 Descripción
Este programa simula el lanzamiento de una moneda, mostrando si salió cruz o cara.
La implementación se realiza en:
✅ Assembly ARM64 para RaspbianOS en Raspberry Pi
🔧 Compilación en Raspberry Pi (ARM64)
as moneda.s -o moneda.o
ld moneda.o -o moneda
▶️ Ejecución
./moneda
👀 Código fuente
🔗 Código fuente en Gist: Programa 32 Simulación de lanzado de una moneda, muestra resultado en la 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 simula el lanzamiento de una moneda |
| y muestra el resultado en Rust y Assembly ARM64 para RaspbianOS. |
| • Demostración: |
| https://asciinema.org/a/714463 |
| • Compilación (Raspberry Pi ARM64): |
| as moneda.s -o moneda.o |
| ld moneda.o -o moneda |
| • Ejecución: ./moneda |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂ ⠂⠄⠄⠂☆
═════════•°• Demostración Código en lenguaje Rust •°•═══════
use rand::Rng;
fn main() {
match rand::thread_rng().gen_range(0..2) {
0 => println!("Cara"),
1 => println!("Cruz"),
_ => unreachable!()
}
}
════════════════════•°• ☆ •°•══════════════════════════════
/*
/* ⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂⠁⠁⠂⠄⠄⠂ ⠂⠄⠄⠂☆
═════════════•°• Código en ARM64 Assembly •°•═════════════ */
.data
cara: .asciz "Cara\n"
cruz: .asciz "Cruz\n"
dev_urandom: .asciz "/dev/urandom"
.text
.global _start
_start:
// --- Abrir /dev/urandom (file descriptor en x19) ---
mov x0, #-100 // AT_FDCWD
ldr x1, =dev_urandom
mov x2, #0 // O_RDONLY
mov x8, #56 // syscall openat
svc #0
mov x19, x0 // Guardar fd en x19
// --- Leer 4 bytes aleatorios (alineando el stack) ---
sub sp, sp, #16 // ¡Alineación a 16 bytes!
mov x0, x19 // fd
mov x1, sp // buffer (stack alineado)
mov x2, #4 // leer 4 bytes
mov x8, #63 // syscall read
svc #0
// --- Cerrar archivo ---
mov x0, x19
mov x8, #57 // syscall close
svc #0
// --- Decidir cara/cruz con el byte leído ---
ldr w0, [sp] // Carga el valor aleatorio
add sp, sp, #16 // Restaura el stack
and w0, w0, #1 // Aísla el último bit
cmp w0, #0
b.eq print_cruz
print_cara:
mov x0, #1 // stdout
ldr x1, =cara
mov x2, #5 // Longitud de "Cara\n"
mov x8, #64 // syscall write
svc #0
b exit
print_cruz:
mov x0, #1 // stdout
ldr x1, =cruz
mov x2, #5 // Longitud de "Cruz\n"
mov x8, #64 // syscall write
svc #0
exit:
mov x0, #0 // status 0
mov x8, #93 // syscall exit
svc #0