Menu
Coddy logo textTech

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 value

Beispiele:

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:

DirektiveGrößeBereichZu verwendendes Register
db1 Byte0 bis 255al
dw2 Bytes0 bis 65,535ax
dd4 Bytes0 bis 4,294,967,295eax
dqSehr groß (2⁶⁴-1)8 Bytesrax

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ück

Spezielle 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 message

Wichtige Regel:

RegelErklärung
Verwende rax zum Laden oder Speichernrax ist das 64-Bit-Register
challenge icon

Aufgabe

Einfach

Erstelle 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
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen

Übe selbstständig: Assembly-Playground