Numero di byte (rdx)
Fa parte della sezione Fondamenti del percorso Assembly di Coddy. Lezione 38 di 45.
Hai detto al sistema operativo dove stampare (rdi) e cosa stampare (rsi). Ora devi dirgli quanti byte stampare.
Il registro per il conteggio dei byte è rdx.
Perché il sistema operativo ha bisogno della lunghezza?
Il sistema operativo non sa dove termina la tua stringa. Senza una lunghezza, continuerebbe a leggere la memoria all'infinito. La lunghezza indica al sistema operativo esattamente quando fermarsi.
Esempio:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rdx, msgLen ; rdx = numero di byte da stampareCosa succede se la lunghezza è sbagliata?
| Se imposti | Risultato |
|---|---|
| Troppo corta | Viene stampata solo una parte della stringa |
| Troppo lunga | Il sistema operativo continua a leggere oltre la stringa, nella memoria spazzatura: potrebbe stampare caratteri casuali o bloccarsi |
| Zero | Non viene stampato nulla |
Calcolare automaticamente la lunghezza:
Hai già imparato lo schema $ - label nel capitolo 3:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg ; msgLen = 6 (Hello + nuova riga)Questo garantisce che la lunghezza sia sempre corretta, anche se cambi la stringa.
Esempio completo:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rax, 1 ; chiamata di sistema write
mov rdi, 1 ; stdout
mov rsi, msg ; indirizzo della stringa
mov rdx, msgLen ; numero di byte
syscallSfida
Ti viene data una stringa chiamata color con il valore 'Red' seguita da un carattere di nuova riga. È già stata definita una costante chiamata colorLen usando $ - color.
Scrivi la riga di codice che imposta rdx sulla lunghezza della stringa usando la costante colorLen.
Scrivi solo l'istruzione mov per rdx.
Provalo tu
section .text
global _start
_start:
; Il codice dello studente viene eseguito per primo (imposta rdx)
%include "solution.asm"
mov rax, 1
mov rdi, 1
mov rsi, color
; rdx contiene già la lunghezza (dal codice dello studente)
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 correttaEsercitati da solo: Playground Assembly