Menu
CoddyTech

dq, định nghĩa quad word

Thuộc phần Kiến thức nền tảng trong hành trình Assembly của Coddy. Bài học 27 trên 45.

dd tạo ra 4 byte dữ liệu. Nhưng đôi khi bạn cần những số lớn hơn hoặc địa chỉ bộ nhớ. Khi đó, bạn dùng dq: Định nghĩa từ bốn byte.

Từ quad trong hợp ngữ x86 có kích thước 8 byte (64 bit).

Cú pháp:

label dq value

Ví dụ:

section .data
    myNumber dq 10000000000     ; 8 byte, giá trị 10 tỷ
    bigNum   dq 123456789012    ; Số rất lớn
    address  dq msg             ; Địa chỉ bộ nhớ của nhãn "msg"

Bảng so sánh:

Chỉ thịKích thướcPhạm viThanh ghi cần dùng
db1 byte0 đến 255al
dw2 byte0 đến 65,535ax
dd4 byte0 đến 4,294,967,295eax
dq8 byteRất lớn (2⁶⁴-1)rax

Cách dùng một từ quad trong code:

section .data
    myNumber dq 5000000000

section .text
    mov rax, [myNumber]    ; Nạp giá trị vào rax
    add rax, 1000000000    ; rax thành 6 tỷ
    mov [myNumber], rax    ; Lưu lại

Cách dùng đặc biệt: lưu trữ địa chỉ

dq cũng được dùng để lưu trữ địa chỉ bộ nhớ (con trỏ):

section .data
    message db 'Hello', 0
    pointer dq message      ; Lưu địa chỉ của message

Quy tắc quan trọng:

Quy tắcGiải thích
Dùng rax để tải hoặc lưurax là thanh ghi 64 bit
challenge icon

Thử thách

Dễ

Tạo một từ quad có tên universe_age với giá trị 13800000000 trong phần .data.

Tự làm thử

%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:
    ; Nạp giá trị 64 bit vào rax
    mov rax, [universe_age]
    
    ; Chuyển rax thành chuỗi thập phân
    mov rsi, buffer
    add rsi, 63          ; Di chuyển đến cuối buffer
    mov byte [rsi], 0    ; Ký tự kết thúc null
    
    mov rcx, 10          ; Số chia để chuyển sang hệ thập phân

convert_loop:
    xor rdx, rdx         ; Xóa rdx trước khi chia
    div rcx              ; Chia rax cho 10, rax = thương, rdx = số dư
    add dl, '0'          ; Chuyển số dư thành ký tự ASCII
    dec rsi
    mov [rsi], dl        ; Lưu chữ số
    cmp rax, 0
    jnz convert_loop

    ; Lưu con trỏ đến chữ số và độ dài TRƯỚC KHI chúng bị ghi đè
    mov r8, rsi          ; r8 = con trỏ đến chữ số đầu tiên
    mov r9, buffer
    add r9, 63
    sub r9, rsi          ; r9 = số chữ số
    
    ; In ra thông báo
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, msg_len
    syscall
    
    ; In ra số
    mov rax, 1
    mov rdi, 1
    mov rsi, r8
    mov rdx, r9
    syscall
    
    ; In ra ký tự xuống dòng
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; Thoát
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Playground Assembly