dq - Quad Word Tanımlama
Coddy'nin Assembly Journey'sinin Temeller bölümünün bir parçası — ders 27 / 45.
dd 4 baytlık veri oluşturur. Ancak bazen daha büyük sayılara veya bellek adreslerine ihtiyaç duyarsınız. Bunun için dq — Define Quad Word kullanırsınız.
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 adresiKarşılaştırma tablosu:
| Yönerge | Boyut | Aralık | Kullanılacak yazmaç |
|---|---|---|---|
db | 1 bayt | 0 ile 255 arası | al |
dw | 2 bayt | 0 ile 65.535 arası | ax |
dd | 4 bayt | 0 ile 4.294.967.295 arası | eax |
dq | 8 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'e yükle
add rax, 1000000000 ; rax 6 milyar olur
mov [myNumber], rax ; Geri kaydetÖzel kullanım: adresleri saklama
dq ayrıca bellek adreslerini (pointer'ları) saklamak için de kullanılır:
section .data
message db 'Hello', 0
pointer dq message ; message'ın adresini saklarÖnemli kural:
| Kural | Açıklama |
|---|---|
Yüklemek veya depolamak için rax kullanın | rax 64-bitlik register'dır |
Görev
Kolay.data bölümünde 13800000000 değerine sahip universe_age adında 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:
; rax içine quad word değerini yükle
mov rax, [universe_age]
; rax değerini ondalık dizeye dönüştür
mov rsi, buffer
add rsi, 63 ; Tamponun sonuna git
mov byte [rsi], 0 ; Boş sonlandırıcı (Null terminator)
mov rcx, 10 ; Ondalık dönüşüm için bölen
convert_loop:
xor rdx, rdx ; Bölme işlemi için rdx'i temizle
div rcx ; rax'i 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 bozulmadan Ö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
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Temeller bölümündeki tüm dersler
4Veri Tanımlama
.data Bölümüdb - Byte Tanımlamadw - Word Tanımlamadd - Double Word Tanımlamadq - Quad Word Tanımlamadb ile Stringler$ SembolüÖzet: data.asm Dosyasını Derleme