Phần .data
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 23 trên 45.
Trong chương 2, bạn đã tải các giá trị từ bộ nhớ và lưu các giá trị vào bộ nhớ. Nhưng bộ nhớ đó đến từ đâu? Ai đã tạo ra num1, num2 và result?
Đáp án là phần .data. Đây là nơi bạn tạo dữ liệu của riêng mình trong bộ nhớ.
Phần .data là gì?
Phần .data là một phần trong chương trình assembly, nơi bạn định nghĩa dữ liệu sẽ được lưu trong bộ nhớ trước khi chương trình chạy.
Cú pháp:
section .data
; Đặt các định nghĩa dữ liệu ở đâyLý do bạn cần phần này:
| Không có phần .data | Có phần .data |
|---|---|
| Bạn không có dữ liệu để xử lý | Bạn có thể tạo số, chuỗi và biến |
| Không biết địa chỉ bộ nhớ | Bạn có thể dùng các nhãn như myNumber hoặc message |
| Bạn không thể kiểm tra code của mình | Bạn có thể tải và lưu dữ liệu do mình tạo |
Một ví dụ đơn giản:
section .data
age db 25 ; Tạo một byte tên là "age" có giá trị 25
price dw 1000 ; Tạo một word tên là "price" có giá trị 1000
name db 'Bob' ; Tạo một chuỗi tên là "name" gồm các ký tự B, o, bVị trí của chúng trong các tệp:
Hãy nhớ lại mẫu hai tệp trong chương 0:
| Tệp | Nội dung |
|---|---|
data.asm | section .data cùng các định nghĩa dữ liệu của bạn |
main.asm | %include "data.asm" theo sau là section .text cùng code của bạn |
Điều gì xảy ra khi chương trình chạy:
- Hệ điều hành tải chương trình vào bộ nhớ
- Hệ điều hành đọc phần
.datavà đặt dữ liệu tại các địa chỉ bộ nhớ cụ thể
- Các nhãn của bạn (
age,price,name) trở thành địa chỉ - Giờ đây, code của bạn có thể truy cập các địa chỉ này bằng
[age],[price],[name]
Quy tắc quan trọng:
| Quy tắc | Giải thích |
|---|---|
| Giữ dữ liệu cùng nhau | Bạn có thể mở section .data nhiều lần (trình hợp dịch sẽ ghép các phần lại), nhưng chỉ dùng một phần trong data.asm sẽ dễ đọc hơn |
| Các nhãn phải là duy nhất | Bạn không thể có hai nhãn age |
| Dữ liệu được tạo trước khi code chạy | Dữ liệu sẵn sàng để sử dụng khi _start bắt đầu |
Trong các bài học tiếp theo, bạn sẽ học cách định nghĩa những kiểu dữ liệu khác nhau bằng db, dw, dd và dq
Thử thách
Viết code trong tệp data.asm để:
- Tạo phần
.data - Tạo một byte có tên
countvới giá trị 5
Tự làm thử
%include "data.asm"
section .text
global _start
_start:
; Nạp giá trị từ count vào al
mov al, [count]
; Lưu giá trị đó để in ra
mov r12, rax
; Chuyển sang ASCII và in ra (chỉ từ 0 đến 9)
add al, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; Thoát
mov rax, 60
mov rdi, 0
syscall
section .bss
digit resb 1Bà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