Menu
CoddyTech

dw, định nghĩa 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 25 trên 45.

db tạo ra một byte dữ liệu. Nhưng đôi khi bạn cần lưu các số lớn hơn, không vừa trong một byte (0-255). Khi đó, bạn dùng dw: định nghĩa word.

Một từ trong hợp ngữ x86 có kích thước 2 byte (16 bit).

Cú pháp:

label dw value
  • label: tên bạn đặt cho địa chỉ bộ nhớ này
  • dw: chỉ thị Define Word
  • value: số cần lưu (0 đến 65,535)

Ví dụ:

section .data
    smallNum dw 1000       ; 2 byte, giá trị 1000
    bigNum   dw 65535      ; 2 byte, giá trị tối đa (tất cả bit đều là 1)
    price    dw 499        ; 2 byte, giá trị 499

Những gì bạn có thể lưu trong một word (2 byte):

KiểuPhạm viVí dụ
Số nhỏ đến trung bình0 đến 65,535dw 32000
Độ lệch bộ nhớ (16 bit)0 đến 65,535dw 0x7FFF

Nhiều từ dữ liệu trên một dòng:

section .data
    values dw 100, 200, 300, 400    ; Tạo 4 word (tổng cộng 8 byte)

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

Vì một từ có kích thước 2 byte, bạn dùng thanh ghi 16 bit ax (không phải al):

section .data
    myWord dw 1000

section .text
    mov ax, [myWord]    ; Nạp giá trị 1000 vào ax
    add ax, 500         ; ax trở thành 1500
    mov [myWord], ax    ; Lưu 1500 trở lại myWord

So sánh: db và dw

Chỉ thịKích thướcPhạm viThanh ghi cần dùng
db1 bytetừ 0 đến 255al
dw2 bytetừ 0 đến 65,535ax
challenge icon

Thử thách

Dễ

Tạo một word có tên population với giá trị 25000 trong phần .data.

Tự làm thử

%include "data.asm"

section .data
    msg db 'population = '
    msg_len equ $ - msg
    newline db 0xa

section .bss
    buffer resb 16

section .text
    global _start

_start:
    ; Nạp giá trị word vào ax
    mov ax, [population]
    
    ; Chuyển ax thành chuỗi thập phân
    mov rsi, buffer
    add rsi, 15          ; Di chuyển đến cuối buffer
    mov byte [rsi], 0    ; Ký tự kết thúc null
    
    mov cx, 10           ; Số chia để chuyển đổi sang hệ thập phân
    
convert_loop:
    xor dx, dx           ; Xóa dx trước khi chia
    div cx               ; Chia ax cho 10, ax = thương, dx = số dư
    add dl, '0'          ; Chuyển số dư thành ký tự ASCII
    dec rsi
    mov [rsi], dl        ; Lưu chữ số
    cmp ax, 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, 15
    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 chương trình
    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