dd – Double Word definieren
Teil des Abschnitts Grundlagen der Assembly-Journey von Coddy. Lektion 26 von 45.
dw erstellt 2 Bytes an Daten. Aber manchmal benötigst du noch größere Zahlen. Dafür verwendest du dd: Define Double Word.
Ein double word in der x86-Assembly besteht aus 4 Bytes (32 Bit).
Syntax:
label dd valueBeispiele:
section .data
myNumber dd 50000 ; 4 Bytes, Wert 50000
bigNum dd 4000000 ; 4 Bytes, Wert 4 Millionen
max32 dd 4294967295 ; Maximaler 32-Bit-WertVergleichstabelle:
| Direktive | Größe | Bereich | Zu verwendendes Register |
|---|---|---|---|
db | 1 byte | 0 bis 255 | al |
dw | 2 bytes | 0 bis 65,535 | ax |
dd | 4 bytes | 0 bis 4,294,967,295 | eax |
So verwendest du ein double word in deinem Code:
section .data
myNumber dd 50000
section .text
mov eax, [myNumber] ; Wert in eax laden
add eax, 10000 ; eax wird 60000
mov [myNumber], eax ; Zurück speichernWichtige Regel:
| Regel | Erklärung |
|---|---|
Verwende eax zum Laden oder Speichern | eax ist das 32-Bit-Register |
Aufgabe
EinfachErstelle ein Doppelwort namens distance mit dem Wert 125000 im Abschnitt .data.
Probier es selbst
%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:
; Lade den Doppelwort-Wert in eax
mov eax, [distance]
; Konvertiere eax in einen Dezimalstring
mov rsi, buffer
add rsi, 31 ; Gehe zum Ende von buffer
mov byte [rsi], 0 ; Nullterminator
mov ecx, 10 ; Divisor für die Dezimalumwandlung
convert_loop:
xor edx, edx ; Lösche edx für die Division
div ecx ; Teile eax durch 10, eax = Quotient, edx = Rest
add dl, '0' ; Konvertiere den Rest zu ASCII
dec rsi
mov [rsi], dl ; Speichere die Ziffer
cmp eax, 0
jnz convert_loop
; Speichere Ziffernzeiger und Länge BEVOR sie überschrieben werden
mov r8, rsi ; r8 = Zeiger auf die erste Ziffer
mov r9, buffer
add r9, 31
sub r9, rsi ; r9 = Anzahl der Ziffern
; Nachricht ausgeben
mov rax, 1
mov rdi, 1
mov rdx, msg_len
mov rsi, msg
syscall
; Die Zahl ausgeben
mov rax, 1
mov rdi, 1
mov rsi, r8
mov rdx, r9
syscall
; Zeilenumbruch ausgeben
mov rax, 1
mov rdi, 1
mov rsi, newline
mov rdx, 1
syscall
; Beenden
mov rax, 60
mov rdi, 0
syscall
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Die Maschine
Was ist eine CPUSpeicherRegister vs. SpeicherWie Befehle funktionierenZwei-Dateien-MusterDie x86-64 Architektur4Datendefinition
Der .data-Abschnittdb – Byte definierendw – Word definierendd – Double Word definierendq – Quad Word definierenStrings mit dbDas $-SymbolZusammenfassung: data.asm erstellenÜbe selbstständig: Assembly-Playground