Oggi ho preso la briga di scrivere un "semplice" gioco con il noto linguaggio di programmazione Assembly.
Per chi non sapesse l'assembly è un linguaggio di programmazione a basso livello che viene utilizzato per scrivere codice che viene eseguito direttamente dalla CPU di un computer. A differenza dei linguaggi di programmazione ad alto livello come C++ o Python, che vengono compilati in codice eseguibile per poi essere eseguiti dalla CPU, l'assembly viene scritto in forma di istruzioni che possono essere eseguite direttamente dalla CPU senza alcun passaggio intermedio.
Il codice scritto in assembly viene generalmente utilizzato per scrivere parti di un programma che richiedono un controllo molto fine o per ottenere prestazioni ottimali, poiché il codice in assembly viene eseguito direttamente dalla CPU senza alcuna interpretazione o compilazione. Tuttavia, l'assembly è un linguaggio di programmazione difficile da imparare e scrivere, poiché richiede una conoscenza approfondita dell'architettura del computer e dell'instruction set della CPU in uso, anche la sintassi non è che sia una delle migliori...
Il gioco si basa sulle probabilità:
; gioco semplice in assembly per x86
.data
message db 'Indovina il numero (1-10): ', 0
win_message db 'Hai vinto!', 0
lose_message db 'Hai perso :(', 0
.bss
number resb 2 ; il numero da indovinare
guess resb 2 ; il tentativo dell'utente
.text
.global _start
_start:
; genera un numero casuale compreso tra 1 e 10
xor eax, eax ; azzera eax
mov al, 10 ; carica 10 in al
call rand ; genera un numero casuale compreso tra 0 e 9
add al, 1 ; aggiungi 1 per ottenere un numero compreso tra 1 e 10
mov [number], al ; salva il numero generato
; chiedi all'utente di fare un tentativo
mov eax, 4 ; codice per la chiamata del sistema 'write'
mov ebx, 1 ; stdout
mov ecx, message ; indirizzo del messaggio da scrivere
mov edx, 21 ; lunghezza del messaggio
int 0x80 ; esegui la chiamata del sistema
; leggi il tentativo dell'utente
mov eax, 3 ; codice per la chiamata del sistema 'read'
mov ebx, 0 ; stdin
mov ecx, guess ; indirizzo della variabile dove verrà salvato il tentativo
mov edx, 2 ; lunghezza del tentativo (2 byte per l'input di un intero)
int 0x80 ; esegui la chiamata del sistema
; confronta il tentativo dell'utente con il numero generato
mov al, [guess]
cmp al, [number]
jne lose ; vai al blocco 'lose' se il tentativo non è corretto
; se arriva qui, l'utente ha indovinato il numero
mov eax, 4 ; codice per la chiamata del sistema 'write'
mov ebx, 1 ; stdout
mov ecx, win_message ; indirizzo del messaggio di vittoria
mov edx, 10 ; lunghezza del messaggio
int 0x80 ; esegui la chiamata del sistema
; esci dal programma
mov eax, 1 ; codice per la chiamata del sistema 'exit'
xor ebx, ebx ; uscita con stato 0 (successo)
int 0x80 ; esegui la chiamata del sistema
lose:
; se arriva qui, l'utente ha perso
mov eax, 4
Non chiedetemi perché l'abbia fatto... Nel dubbio per creare giochi, anche banalmente così stupidi ci sono linguaggi di programmazione mooolto più comodi esempio Python, C, C++, Java ecc...
Diciamo che questo era più un test.😁