Menu
Coddy logo textTech

dq - Quad Word Tanımlama

Coddy'nin Assembly Journey'sinin Temel Bilgiler bölümünün bir parçası. Ders 27 / 45.

dd 4 bayt veri oluşturur. Ancak bazen daha da büyük sayılara veya bellek adreslerine ihtiyaç duyarsın. Bunun için dq kullanırsın: Quad Word Tanımla.

x86 assembly'de bir quad word 8 bayttır (64 bit).

Sözdizimi:

label dq value

Örnekler:

section .data
    myNumber dq 10000000000     ; 8 bayt, değer 10 milyar
    bigNum   dq 123456789012    ; Çok büyük sayı
    address  dq msg             ; "msg" etiketinin bellek adresi

Karşılaştırma tablosu:

YönergeBoyutAralıkKullanılacak yazmaç
db1 bayt0 to 255al
dw2 bayt0 to 65,535ax
dd4 bayt0 to 4,294,967,295eax
dq8 baytÇok büyük (2⁶⁴-1)rax

Kodunuzda bir quad word nasıl kullanılır:

section .data
    myNumber dq 5000000000

section .text
    mov rax, [myNumber]    ; Değeri rax'a yükle
    add rax, 1000000000    ; rax 6 milyar olur
    mov [myNumber], rax    ; Geri sakla

Özel kullanım: adresleri depolama

dq bellek adreslerini (işaretçileri) depolamak için de kullanılır:

section .data
    message db 'Hello', 0
    pointer dq message      ; message'in adresini saklar

Önemli kural:

KuralAçıklama
Yükleme veya depolama için rax kullanınrax 64 bitlik yazmaçtır
challenge icon

Görev

Kolay

.data bölümünde 13800000000 değerine sahip universe_age adlı bir quad word oluşturun.

Kendin dene

%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:
    ; Quad word değerini rax'a yükle
    mov rax, [universe_age]
    
    ; rax'ı ondalık dizeye dönüştür
    mov rsi, buffer
    add rsi, 63          ; buffer'ın sonuna git
    mov byte [rsi], 0    ; Null sonlandırıcı
    
    mov rcx, 10          ; Ondalık dönüşüm için bölen

convert_loop:
    xor rdx, rdx         ; Bölme için rdx'i temizle
    div rcx              ; rax'ı 10'a böl, rax = bölüm, rdx = kalan
    add dl, '0'          ; Kalanı ASCII'ye dönüştür
    dec rsi
    mov [rsi], dl        ; Basamağı sakla
    cmp rax, 0
    jnz convert_loop

    ; Basamak işaretçisini ve uzunluğunu üzerine yazılmadan ÖNCE kaydet
    mov r8, rsi          ; r8 = ilk basamağa işaretçi
    mov r9, buffer
    add r9, 63
    sub r9, rsi          ; r9 = basamak sayısı
    
    ; Mesajı yazdır
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, msg_len
    syscall
    
    ; Sayıyı yazdır
    mov rax, 1
    mov rdi, 1
    mov rsi, r8
    mov rdx, r9
    syscall
    
    ; Yeni satır yazdır
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; Çıkış
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Temel Bilgiler bölümündeki tüm dersler

Kendi başına pratik yap: Assembly playground