Menu
CoddyTech

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 value

Ví 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ất

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

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ại

Quy tắc quan trọng:

Quy tắcGiải thích
Dùng eax để nạp hoặc lưueax là thanh ghi 32 bit
challenge icon

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
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