MOV từ bộ nhớ sang thanh ghi
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 17 trên 45.
Đến nay, bạn đã chuyển trực tiếp các số vào thanh ghi (tức thời) và sao chép giá trị giữa các thanh ghi. Bây giờ, bạn sẽ học cách nạp dữ liệu từ bộ nhớ vào một thanh ghi.
Vì sao điều này quan trọng:
Hãy nhớ từ chương 0: một lệnh có thể dùng nhiều nhất một toán hạng bộ nhớ, và thanh ghi nhanh hơn bộ nhớ rất nhiều, vì vậy bạn tải các giá trị cần xử lý vào thanh ghi. Đây là cách bạn thực hiện.
Cú pháp:
mov register, [address]Dấu ngoặc [ ] có nghĩa là: "đi đến địa chỉ bộ nhớ này và lấy giá trị được lưu ở đó."
Hãy hình dung thế này:
Hãy tưởng tượng tại địa chỉ bộ nhớ number có một chiếc hộp. Bên trong hộp là một giá trị, chẳng hạn như số 5. Khi bạn viết:
mov al, [number] ; Load the value from memory address "number" into alBạn đang yêu cầu CPU: "Đến ô có tên number, lấy giá trị bên trong (trong trường hợp này là 5) và chép nó vào thanh ghi al."
Sau khi thực hiện câu lệnh này, giá trị 5 được lưu trong al. Giá trị ban đầu bên trong ô tại địa chỉ number vẫn ở đó. Nó không bị xóa.
Các quy tắc quan trọng:
| Quy tắc | Giải thích |
|---|---|
| Nguồn phải là địa chỉ bộ nhớ | [label] hoặc [address] |
| Bắt buộc phải có dấu ngoặc vuông | Nếu không có dấu ngoặc vuông, myNumber là địa chỉ, không phải giá trị |
| Kích thước phải khớp | Nếu bộ nhớ lưu một byte, hãy dùng al (không dùng rax) |
Lỗi thường gặp:
; Sai: không có dấu ngoặc vuông, myNumber là ĐỊA CHỈ, không phải giá trị
mov al, myNumber
; Đúng: nạp GIÁ TRỊ lưu tại myNumber
mov al, [myNumber]Thử thách
Viết một dòng assembly để tải giá trị từ địa chỉ bộ nhớ value vào thanh ghi al.
Tự làm thử
section .data
msg db 'al = '
msg_len equ $ - msg
section .bss
digit resb 1
section .text
global _start
_start:
; Đoạn code của bạn chạy trước (nạp giá trị vào al)
%include "solution.asm"
; Lưu giá trị từ al
mov r12, rax
; In ra "al = "
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msg_len
syscall
; In ra giá trị trong al
mov rax, r12
add rax, 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
syscallBà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