Descrittore di file (rdi)
Fa parte della sezione Fondamenti del percorso Assembly di Coddy. Lezione 36 di 45.
Nella lezione precedente, hai usato mov rdi, 1 come parte della syscall write. Quel numero 1 è chiamato descrittore di file.
Un descrittore di file è un numero che indica al sistema operativo dove inviare i dati.
I tre descrittori di file standard in Linux:
| Descrittore di file | Nome | Dove vanno i dati |
|---|---|---|
| 0 | stdin | Input da tastiera (leggi i dati dall’utente) |
| 1 | stdout | Output sullo schermo (output normale del programma) |
| 2 | stderr | Output sullo schermo (messaggi di errore) |
Perché ci sono due output per lo schermo?
L'output normale (stdout) e l'output degli errori (stderr) vengono inviati allo stesso schermo, ma sono trattati separatamente. Questo ti permette di:
- Reindirizzare l'output normale a un file continuando a vedere gli errori sullo schermo
- Visualizzare gli errori anche quando l'output normale è nascosto
Per stampare in questo corso:
Userai sempre il descrittore di file 1 (stdout) per stampare i messaggi. Per ora non ti serve stderr.
Esempio:
mov rdi, 1 ; invia l'output a stdout (lo schermo)Cosa succede se usi il descrittore di file sbagliato?
| Se usi | Risultato |
|---|---|
| 0 (stdin) | La syscall di scrittura si aspetta un input, non un output: non andrà a buon fine o non farà nulla |
| 2 (stderr) | Funziona come stdout (stampa sullo schermo), ma è destinato agli errori |
| Qualsiasi altro numero | Il kernel non lo riconosce: la syscall non va a buon fine |
Sfida
Ti viene data una stringa chiamata message con il valore 'OK' seguito da un carattere di nuova riga. Scrivi la riga di codice che imposta il descrittore di file per stampare sullo schermo (stdout). Scrivi solo l'istruzione mov per rdi.
Provalo tu
section .data
message db 'OK', 0x0a
msgLen equ $ - message
section .text
global _start
_start:
; Lo studente imposta qui il descrittore di file
%include "solution.asm"
mov rax, 1
; rdi dovrebbe essere già stato impostato dallo studente
mov rsi, message
mov rdx, msgLen
syscall
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