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 valuelabel: tên bạn đặt cho địa chỉ bộ nhớ nàydw: chỉ thị Define Wordvalue: 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ị 499Những gì bạn có thể lưu trong một word (2 byte):
| Kiểu | Phạm vi | Ví dụ |
|---|---|---|
| Số nhỏ đến trung bình | 0 đến 65,535 | dw 32000 |
| Độ lệch bộ nhớ (16 bit) | 0 đến 65,535 | dw 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 myWordSo sánh: db và dw
| Chỉ thị | Kích thước | Phạm vi | Thanh ghi cần dùng |
|---|---|---|---|
db | 1 byte | từ 0 đến 255 | al |
dw | 2 byte | từ 0 đến 65,535 | ax |
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
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