GNU/Linux xterm bash 96 views

📌 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