Menu
Coddy logo textTech

dq - definiowanie poczwórnego słowa

Część sekcji Podstawy ścieżki Assembly w Coddy. Lekcja 27 z 45.

dd tworzy 4 bajty danych. Czasami jednak potrzebujesz jeszcze większych liczb lub adresów pamięci. Do tego służy dq: zdefiniuj quad word.

Słowo poczwórne w asemblerze x86 ma 8 bajtów (64 bity).

Składnia:

label dq value

Przykłady:

section .data
    myNumber dq 10000000000     ; 8 bajtów, wartość 10 miliardów
    bigNum   dq 123456789012    ; Bardzo duża liczba
    address  dq msg             ; Adres pamięci etykiety "msg"

Tabela porównawcza:

DyrektywaRozmiarZakresRejestr do użycia
db1 bajtod 0 do 255al
dw2 bajtyod 0 do 65,535ax
dd4 bajtyod 0 do 4,294,967,295eax
dq8 bajtówBardzo duży (2⁶⁴-1)rax

Jak używać słowa poczwórnego w kodzie:

section .data
    myNumber dq 5000000000

section .text
    mov rax, [myNumber]    ; Załaduj wartość do rax
    add rax, 1000000000    ; rax przyjmuje wartość 6 miliardów
    mov [myNumber], rax    ; Zapisz z powrotem

Specjalne zastosowanie: przechowywanie adresów

dq służy również do przechowywania adresów pamięci (wskaźników):

section .data
    message db 'Hello', 0
    pointer dq message      ; Przechowuje adres message

Ważna zasada:

ZasadaWyjaśnienie
Użyj rax, aby wczytać lub zapisaćrax to rejestr 64-bitowy
challenge icon

Wyzwanie

Łatwy

Utwórz słowo poczwórne o nazwie universe_age i wartości 13800000000 w sekcji .data.

Spróbuj swoich sił

%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:
    ; Wczytaj wartość 64-bitową do rax
    mov rax, [universe_age]
    
    ; Przekształć rax na ciąg dziesiętny
    mov rsi, buffer
    add rsi, 63          ; Przejdź na koniec bufora
    mov byte [rsi], 0    ; Znak końca ciągu
    
    mov rcx, 10          ; Dzielnik do konwersji dziesiętnej

convert_loop:
    xor rdx, rdx         ; Wyzeruj rdx przed dzieleniem
    div rcx              ; Podziel rax przez 10, rax = iloraz, rdx = reszta
    add dl, '0'          ; Przekształć resztę na znak ASCII
    dec rsi
    mov [rsi], dl        ; Zapisz cyfrę
    cmp rax, 0
    jnz convert_loop

    ; Zapisz wskaźnik na cyfrę i długość, ZANIM zostaną nadpisane
    mov r8, rsi          ; r8 = wskaźnik na pierwszą cyfrę
    mov r9, buffer
    add r9, 63
    sub r9, rsi          ; r9 = liczba cyfr
    
    ; Wyświetl komunikat
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, msg_len
    syscall
    
    ; Wyświetl liczbę
    mov rax, 1
    mov rdi, 1
    mov rsi, r8
    mov rdx, r9
    syscall
    
    ; Wyświetl znak nowej linii
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; Zakończ program
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Edytor online Assembly