Indirizzo del buffer (rsi)
Fa parte della sezione Fondamenti del percorso Assembly di Coddy. Lezione 37 di 45.
Nella chiamata di sistema write, dopo aver detto al sistema operativo dove inviare l'output (il descrittore di file in rdi), devi dirgli che 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 a partire da quell’indirizzo finché non raggiunge la lunghezza specificata 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 msgChe cos'è davvero msg:
msg è un'etichetta. L'assembler la sostituisce con un numero: l'indirizzo di memoria in cui è memorizzata la stringa 'Hello'. Quando scrivi mov rsi, msg, inserisci quel numero di indirizzo in rsi.
Cosa succede se dimentichi l’indirizzo?
Se non imposti rsi, il registro contiene un valore casuale qualsiasi che era presente prima. Il sistema operativo prova a leggere la stringa da quell’indirizzo. Se l’indirizzo non è valido, la chiamata di sistema write non stampa nulla, inserisce un codice di errore in rax e il programma continua con l’istruzione successiva. Se il valore residuo è casualmente l’indirizzo di una zona di memoria leggibile, la chiamata di sistema stampa i byte memorizzati lì.
Esempio completo con 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
syscallSfida
Ti viene fornita una stringa chiamata greeting con il valore 'Hi' seguito 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
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