dq – Quad Word definieren
Teil des Abschnitts Grundlagen der Assembly-Journey von Coddy. Lektion 27 von 45.
dd erstellt 4 Byte an Daten. Manchmal benötigst du jedoch noch größere Zahlen oder Speicheradressen. Dafür verwendest du dq: Define Quad Word.
Ein Quadword in der x86-Assembly ist 8 Byte (64 Bit) groß.
Syntax:
label dq valueBeispiele:
section .data
myNumber dq 10000000000 ; 8 Bytes, Wert 10 Milliarden
bigNum dq 123456789012 ; Sehr große Zahl
address dq msg ; Speicheradresse des Labels "msg"Vergleichstabelle:
| 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 |
dq | Sehr groß (2⁶⁴-1) | 8 Bytes | rax |
So verwendest du ein Quadword in deinem Code:
section .data
myNumber dq 5000000000
section .text
mov rax, [myNumber] ; Lade Wert in rax
add rax, 1000000000 ; rax wird 6 Milliarden
mov [myNumber], rax ; Speichere zurückSpezielle Verwendung: Adressen speichern
dq wird auch verwendet, um Speicheradressen (Zeiger) zu speichern:
section .data
message db 'Hello', 0
pointer dq message ; Speichert die Adresse von messageWichtige Regel:
| Regel | Erklärung |
|---|---|
Verwende rax zum Laden oder Speichern | rax ist das 64-Bit-Register |
Aufgabe
EinfachErstelle im Abschnitt .data ein Quadword namens universe_age mit dem Wert 13800000000.
Probier es selbst
%include "data.asm"
section .data
msg db 'universe_age = '
msg_len equ $ - msg
newline db 0xa
section .bss
buffer resb 64
section .text
global _start
_start:
; Lade den Quad-Word-Wert in rax
mov rax, [universe_age]
; Konvertiere rax in einen Dezimalstring
mov rsi, buffer
add rsi, 63 ; Gehe zum Ende des Buffers
mov byte [rsi], 0 ; Null-Terminator
mov rcx, 10 ; Divisor für die Dezimalumwandlung
convert_loop:
xor rdx, rdx ; rdx für die Division löschen
div rcx ; Teile rax durch 10, rax = Quotient, rdx = Rest
add dl, '0' ; Rest in ASCII umwandeln
dec rsi
mov [rsi], dl ; Ziffer speichern
cmp rax, 0
jnz convert_loop
; Ziffernzeiger und Länge speichern, BEVOR sie überschrieben werden
mov r8, rsi ; r8 = Zeiger auf die erste Ziffer
mov r9, buffer
add r9, 63
sub r9, rsi ; r9 = Anzahl der Ziffern
; Nachricht ausgeben
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msg_len
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