dd - Definire una double word
Fa parte della sezione Fondamenti del percorso Assembly di Coddy. Lezione 26 di 45.
dw crea 2 byte di dati. Ma a volte servono numeri ancora più grandi. In quel caso, si usa dd: Definisci una doppia parola.
Una doppia parola nell'assembly x86 è composta da 4 byte (32 bit).
Sintassi:
label dd valueEsempi:
section .data
myNumber dd 50000 ; 4 byte, valore 50000
bigNum dd 4000000 ; 4 byte, valore 4 milioni
max32 dd 4294967295 ; Valore massimo a 32 bitTabella di confronto:
| Direttiva | Dimensione | Intervallo | Registro da usare |
|---|---|---|---|
db | 1 byte | da 0 a 255 | al |
dw | 2 byte | da 0 a 65,535 | ax |
dd | 4 byte | da 0 a 4,294,967,295 | eax |
Come usare una parola doppia nel tuo codice:
section .data
myNumber dd 50000
section .text
mov eax, [myNumber] ; Carica il valore in eax
add eax, 10000 ; eax diventa 60000
mov [myNumber], eax ; Memorizza di nuovoRegola importante:
| Regola | Spiegazione |
|---|---|
Usa eax per caricare o memorizzare | eax è il registro a 32 bit |
Sfida
FacileCrea una doppia parola chiamata distance con il valore 125000 nella sezione .data.
Provalo tu
%include "data.asm"
section .data
msg db 'distance = '
msg_len equ $ - msg
newline db 0xa
section .bss
buffer resb 32
section .text
global _start
_start:
; Carica il valore a doppia parola in eax
mov eax, [distance]
; Converti eax in una stringa decimale
mov rsi, buffer
add rsi, 31 ; Vai alla fine di buffer
mov byte [rsi], 0 ; Terminatore nullo
mov ecx, 10 ; Divisore per la conversione decimale
convert_loop:
xor edx, edx ; Azzera edx per la divisione
div ecx ; Dividi eax per 10, eax = quoziente, edx = resto
add dl, '0' ; Converti il resto in ASCII
dec rsi
mov [rsi], dl ; Memorizza la cifra
cmp eax, 0
jnz convert_loop
; Salva il puntatore alla cifra e la lunghezza PRIMA che vengano sovrascritti
mov r8, rsi ; r8 = puntatore alla prima cifra
mov r9, buffer
add r9, 31
sub r9, rsi ; r9 = numero di cifre
; Stampa il messaggio
mov rax, 1
mov rdi, 1
mov rdx, msg_len
mov rsi, msg
syscall
; Stampa il numero
mov rax, 1
mov rdi, 1
mov rsi, r8
mov rdx, r9
syscall
; Stampa un ritorno a capo
mov rax, 1
mov rdi, 1
mov rsi, newline
mov rdx, 1
syscall
; Esci
mov rax, 60
mov rdi, 0
syscall
Questa 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-644Definizione dei dati
La sezione .datadb - Definire un bytedw - Definire una worddd - Definire una double worddq - Definire una quad wordStringhe con dbIl simbolo $Riepilogo: creare data.asm2Sistemi 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