Cách lệnh hoạt động
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 4 trên 45.
Bạn biết CPU thực thi từng lệnh một. Nhưng CPU biết chạy lệnh tiếp theo bằng cách nào? Các lệnh được lưu ở đâu? Và một lệnh thực sự trông như thế nào?
Chỉ dẫn là những con số.
Đây là một sự thật cơ bản về máy tính. Mọi thứ đều là số. Dữ liệu bạn làm việc cùng (như số 42) là một con số. Địa chỉ nơi dữ liệu được lưu trữ (như 1000) là một con số. Và bản thân các chỉ thị (như mov, add, cmp) cũng là những con số.
Khi bạn viết code assembly như mov rax, 5, trình hợp dịch chuyển văn bản dễ đọc này thành một con số mà CPU hiểu được. Con số này được gọi là mã lệnh.
Các chỉ dẫn được lưu ở đâu?
Các chỉ thị được lưu trong bộ nhớ, giống như dữ liệu. Không có vùng nhớ riêng cho chỉ thị. Cùng một vùng nhớ lưu cả hai loại:
- Dữ liệu (số, ký tự, mảng)
- Chỉ thị (chính chương trình)
Bản thân các byte không cho biết chúng là lệnh hay dữ liệu. CPU xem bất cứ thứ gì ở địa chỉ bộ nhớ mà Bộ đếm chương trình trỏ đến là lệnh tiếp theo. Trên hệ thống hiện đại, hệ điều hành đánh dấu vùng bộ nhớ chứa các lệnh của chương trình là có thể thực thi, còn CPU từ chối chạy các byte trong vùng bộ nhớ không được đánh dấu như vậy, chẳng hạn như dữ liệu của chương trình. Bạn đã tìm hiểu sơ qua về PC trong Bài học 0.1. Giờ là lúc hiểu chính xác cách nó hoạt động.
Bộ đếm chương trình (còn gọi là con trỏ lệnh) là một thanh ghi đặc biệt bên trong CPU. Nhiệm vụ duy nhất của nó là lưu địa chỉ bộ nhớ của lệnh tiếp theo cần thực thi.
Chu trình nạp và thực thi:
CPU lặp lại ba bước này mãi mãi:
| Bước | Điều gì xảy ra |
|---|---|
| 1. FETCH | Đọc câu lệnh tại địa chỉ trong PC |
| 2. EXECUTE | Thực hiện câu lệnh đó |
| 3. ADVANCE | Chuyển PC đến câu lệnh tiếp theo |
Ví dụ đơn giản:
Nếu PC = 1000, CPU sẽ:
- Lấy câu lệnh tại địa chỉ 1000
- Thực thi câu lệnh đó
- Chuyển PC đến địa chỉ tiếp theo (1000 + kích thước câu lệnh)
Sau đó, nó lặp lại với giá trị PC mới.
Lệnh có dạng như sau:
Mỗi lệnh gồm hai phần:
| Phần | Tác dụng | Ví dụ |
|---|---|---|
| Opcode | Cần làm gì | mov, add, cmp |
| Toán hạng | Thực hiện thao tác với gì | rax, 5, [result] |
Một số lệnh có một toán hạng (như inc rax để cộng thêm 1). Một số lệnh có hai toán hạng (như mov rax, 5). Một số lệnh có ba toán hạng (như add rax, rbx, rcx trong một số kiến trúc).
Tự làm thử
Bài học này không có thử thách code.
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