Menu
Coddy logo textTech

Indirizzo del buffer (rsi)

Fa parte della sezione Fondamenti del percorso Assembly di Coddy. Lezione 37 di 45.

Nella syscall write, dopo aver indicato al sistema operativo dove inviare l'output (il file descriptor in rdi), devi dirgli cosa stampare. Per farlo, passi l'indirizzo della stringa in memoria.

Il registro per l'indirizzo del buffer è rsi.

Che cos'è un buffer?

Un buffer è semplicemente un blocco di memoria che contiene dati. Nel nostro caso, il buffer è la stringa che vogliamo stampare.

Perché l'indirizzo e non il valore stesso?

La chiamata di sistema write deve sapere dove inizia la stringa in memoria. Leggerà i byte da quell'indirizzo finché non raggiunge la lunghezza che specifichi in rdx. Non invii i caratteri effettivi alla chiamata di sistema. Ne invii la posizione.

Esempio:

section .data
    msg db 'Hello', 0x0a

section .text
    mov rsi, msg        ; rsi contiene l'indirizzo di msg

Che cos'è davvero <strong>msg</strong>:

msg è un'etichetta. L'assemblatore la sostituisce con un numero: l'indirizzo di memoria in cui è memorizzata la stringa 'Hello'. Quando scrivi mov rsi, msg, stai inserendo quel numero di indirizzo in rsi.

Cosa succede se dimentichi l’indirizzo?

Se non imposti rsi, il registro contiene dati casuali che erano presenti in precedenza. Il sistema operativo proverà a leggere da un indirizzo di memoria casuale, causando probabilmente un errore di segmentazione (crash).

Esempio completo con la chiamata di sistema write:

section .data
    msg db 'Hello', 0x0a
    len equ $ - msg

section .text
    mov rax, 1          ; chiamata di sistema write
    mov rdi, 1          ; stdout
    mov rsi, msg        ; indirizzo della stringa
    mov rdx, len        ; numero di byte
    syscall
challenge icon

Sfida

Ti viene fornita una stringa chiamata greeting con il valore 'Hi' seguita da un carattere di nuova riga. Scrivi la riga di codice che carica l’indirizzo di greeting in rsi.

Scrivi solo l’istruzione mov per rsi.

Provalo tu

section .text
    global _start

_start:
    %include "solution.asm"
    
    mov rax, 1
    mov rdi, 1
    ; rsi contiene già l'indirizzo (dal codice dello studente)
    mov rdx, greetingLen
    syscall

    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