dd, định nghĩa double 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 26 trên 45.
dw tạo ra 2 byte dữ liệu. Nhưng đôi khi bạn cần các số lớn hơn nữa. Khi đó, bạn dùng dd: Khai báo từ kép.
Một từ kép trong hợp ngữ x86 có kích thước 4 byte (32 bit).
Cú pháp:
label dd valueVí dụ:
section .data
myNumber dd 50000 ; 4 byte, giá trị 50000
bigNum dd 4000000 ; 4 byte, giá trị 4 triệu
max32 dd 4294967295 ; Giá trị 32-bit lớn nhấtBả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 |
Cách dùng một từ kép trong code của bạn:
section .data
myNumber dd 50000
section .text
mov eax, [myNumber] ; Nạp giá trị vào eax
add eax, 10000 ; eax trở thành 60000
mov [myNumber], eax ; Lưu lạiQuy tắc quan trọng:
| Quy tắc | Giải thích |
|---|---|
Dùng eax để nạp hoặc lưu | eax là thanh ghi 32 bit |
Thử thách
DễTạo một từ kép có tên distance với giá trị 125000 trong phần .data.
Tự làm thử
%include "data.asm"
section .data
msg db 'distance = '
msg_len equ $ - msg
newline db 0xa
section .bss
buffer resb 32
section .text
global _start
_start:
; Nạp giá trị double word vào eax
mov eax, [distance]
; Chuyển eax thành chuỗi thập phân
mov rsi, buffer
add rsi, 31 ; Di chuyển đến cuối buffer
mov byte [rsi], 0 ; Ký tự kết thúc null
mov ecx, 10 ; Số chia để chuyển sang hệ thập phân
convert_loop:
xor edx, edx ; Xóa edx trước phép chia
div ecx ; Chia eax cho 10, eax = thương, edx = số dư
add dl, '0' ; Chuyển số dư thành ASCII
dec rsi
mov [rsi], dl ; Lưu chữ số
cmp eax, 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, 31
sub r9, rsi ; r9 = số chữ số
; In ra thông báo
mov rax, 1
mov rdi, 1
mov rdx, msg_len
mov rsi, msg
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