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 valueVí 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ước | Phạm vi | Thanh ghi cần dùng |
|---|---|---|---|
db | 1 byte | 0 đến 255 | al |
dw | 2 byte | 0 đến 65,535 | ax |
dd | 4 byte | 0 đến 4,294,967,295 | eax |
dq | 8 byte | Rấ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ạiCá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 messageQuy tắc quan trọng:
| Quy tắc | Giải thích |
|---|---|
Dùng rax để tải hoặc lưu | rax là thanh ghi 64 bit |
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
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
4Định nghĩa dữ liệu
Phần .datadb, định nghĩa bytedw, định nghĩa worddd, định nghĩa double worddq, định nghĩa quad wordChuỗi với dbKý hiệu $Ôn tập: xây dựng data.asmTự luyện tập: Playground Assembly