Menu
Coddy logo textTech

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:

ArgomentoRegistroA cosa serveEsempio
Descrittore di filerdiDove scrivere (1 = schermo)mov rdi, 1
Indirizzo del bufferrsiDove si trova il testo in memoriamov rsi, message
Numero di byterdxQuanti byte stamparemov 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 stampare

Per 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:

  1. La CPU salta nel kernel Linux
  2. Il kernel vede: "write syscall"
  3. Legge rdi (dove scrivere), rsi (dove si trova il testo) e rdx (quanti byte)
  1. Stampa il testo sullo schermo
  2. 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
    syscall

Questo programma stampa Hello e poi termina.

challenge icon

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
    syscall
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti

Esercitati da solo: Playground Assembly