Syscall di scrittura (1)
Fa parte della sezione Fondamenti del percorso Assembly di Coddy. Lezione 35 di 45.
Sai già come uscire da un programma. Ma uscire senza mostrare nulla non è molto utile. Vuoi che il tuo programma stampi un output, così l'utente può vedere qualcosa.
Per farlo, ti serve la chiamata di sistema write.
Che cos'è la chiamata di sistema write?
La chiamata di sistema write dice al sistema operativo di stampare del testo sullo schermo (o di scriverlo in un file). È così che il tuo programma produce output.
Il numero di syscall per write è 1.
Come funziona write:
A differenza della chiamata di sistema exit (che richiede un solo argomento), write richiede tre argomenti:
| Argomento | Registro | A cosa serve | Esempio |
|---|---|---|---|
| Descrittore di file | rdi | Dove scrivere (1 = schermo) | mov rdi, 1 |
| Indirizzo del buffer | rsi | Dove si trova il testo in memoria | mov rsi, message |
| Numero di byte | rdx | Quanti byte stampare | mov rdx, 13 |
La syscall write in azione:
mov rax, 1 ; numero della syscall per write
mov rdi, 1 ; descrittore di file 1 = stdout (schermo)
mov rsi, msg ; indirizzo della stringa da stampare
mov rdx, 13 ; numero di byte da stampare
syscall ; chiedi al sistema operativo di stamparePer stampare un messaggio sullo schermo, ci servono 5 righe. Per prima cosa, inseriamo il numero di syscall 1 in rax per la scrittura. Poi inseriamo 1 in rdi per dire al sistema operativo di stampare sullo schermo.
Successivamente, inseriamo l’indirizzo della stringa (msg) in rsi. Dopodiché, inseriamo il numero di byte (13) in rdx. Infine, eseguiamo syscall per chiedere al sistema operativo di stampare.
Cosa succede quando esegui write:
- La CPU salta nel kernel Linux
- Il kernel vede: "write syscall"
- Legge
rdi(dove scrivere),rsi(dove si trova il testo) erdx(quanti byte)
- Stampa il testo sullo schermo
- Restituisce il controllo al tuo programma
Mettiamo tutto insieme con una stringa:
section .data
msg db 'Hello', 0x0a ; stringa con carattere di nuova riga
section .text
global _start
_start:
mov rax, 1 ; chiamata di sistema write
mov rdi, 1 ; stdout
mov rsi, msg ; indirizzo della stringa
mov rdx, 6 ; lunghezza (Hello + carattere di nuova riga = 6 byte)
syscall
mov rax, 60 ; chiamata di sistema exit
mov rdi, 0
syscallQuesto programma stampa Hello e poi termina.
Sfida
Scrivi un programma che stampi il messaggio "Hi" seguito da una nuova riga. Usa la chiamata di sistema write.
La stringa è già definita nell'ambiente di test. Devi solo scrivere la configurazione della chiamata di sistema.
Provalo tu
section .data
msg db 'Hi', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
; TODO: Configura y llama a la syscall write para imprimir msg
; Usa rax=1, rdi=1, rsi=msg, rdx=msgLen
; Finaliza el programa
mov rax, 60
mov rdi, 0
syscallQuesta lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fondamenti
1La macchina
Che cos’è la CPUMemoriaRegistri vs memoriaCome funzionano le istruzioniSchema a due fileL’architettura x86-642Sistemi numerici
Perché il binario?Numeri binariDa decimale a binarioPerché l'esadecimale?Da esadecimale a decimaleDa decimale a esadecimaleASCII ed esadecimale5Chiamata di sistema di uscita
Cos'è una chiamata di sistema?Chiamata di sistema di uscita (60)Codici di uscitaRiepilogo: uscita corretta3Prima istruzione - MOV
Che cos'è MOV?MOV immediatoMOV da registro a registroMOV da memoria a registroMOV da registro a memoriaLEA - Carica indirizzoMOV con dimensioni diverseEsercitazione: scambia i registriRiepilogo: sfida MOV6Syscall di scrittura
Syscall di scrittura (1)Descrittore di file (rdi)Indirizzo del buffer (rsi)Numero di byte (rdx)Mettere tutto insiemeStampare due stringheL'importanza della nuova rigaRiepilogo: configurazione di writeEsercitati da solo: Playground Assembly