Thanh ghi và bộ nhớ
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 3 trên 45.
Bạn đã học về hai nơi có thể lưu trữ dữ liệu bên trong máy tính:
- Thanh ghi: những ô lưu trữ nhỏ bên trong CPU
- Bộ nhớ (RAM): một lưới lớn gồm các ô được đánh số bên ngoài CPU
Nhưng tại sao lại có hai nơi? Tại sao CPU không giữ mọi thứ trong bộ nhớ?
Đáp án là tốc độ. Các thanh ghi cực kỳ nhanh vì chúng nằm bên trong CPU. Bộ nhớ chậm hơn vì nằm bên ngoài. CPU có thể truy cập thanh ghi chỉ trong một chu kỳ, nhưng truy cập bộ nhớ mất nhiều thời gian hơn.
So sánh song song:
| Đặc điểm | Thanh ghi | Bộ nhớ (RAM) |
|---|---|---|
| Vị trí | Bên trong CPU | Bên ngoài CPU |
| Tốc độ | Cực nhanh (1 chu kỳ) | Chậm hơn (nhiều chu kỳ) |
| Số lượng ô lưu trữ | Rất ít (16-32 trên x86-64) | Hàng triệu hoặc hàng tỷ |
| Kích thước mỗi ô | 8 byte (64 bit) | 1 byte |
| Cách truy cập | Bằng tên (rax, rbx, rcx...) | Bằng địa chỉ (1000, msg, buffer) |
| Dễ mất dữ liệu? | Có (dữ liệu biến mất khi tắt nguồn) | Có (dữ liệu biến mất khi tắt nguồn) |
Quy tắc quan trọng nhất trong assembly:
Một chỉ thị chỉ có thể dùng tối đa một toán hạng bộ nhớ. Để kết hợp hai giá trị đều nằm trong bộ nhớ, trước tiên hãy tải một giá trị vào thanh ghi.
Thanh ghi cũng là nơi lưu các giá trị bạn đang xử lý, vì mỗi lần truy cập bộ nhớ đều chậm.
Mẫu ba bước bạn sẽ thường xuyên sử dụng:
| Bước | Điều gì xảy ra | Ví dụ |
|---|---|---|
| 1. LOAD | Sao chép dữ liệu từ bộ nhớ vào một thanh ghi | mov rax, [count] |
| 2. WORK | Làm gì đó với thanh ghi | add rax, 5 |
| 3. STORE | Sao chép kết quả trở lại bộ nhớ (nếu cần) | mov [result], rax |
Điều gì xảy ra nếu bạn quên quy tắc này?
Nếu bạn cố cộng hai số đều nằm trong bộ nhớ, trình hợp dịch sẽ báo lỗi. CPU không thể thực hiện phép tính đó. Trước tiên, bạn phải nạp một trong hai số vào thanh ghi.
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