MOV từ thanh ghi 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 16 trên 45.
Bây giờ bạn đã biết cách đặt trực tiếp một số vào thanh ghi (MOV immediate), bạn cũng có thể sao chép giá trị giữa các thanh ghi.
Cú pháp:
mov destination_register, source_registerGiá trị từ thanh ghi nguồn được sao chép vào thanh ghi đích. Thanh ghi nguồn vẫn giữ nguyên.
Ví dụ:
mov rax, 5 ; rax = 5
mov rbx, rax ; rbx = 5 (sao chép từ rax)Sau hai lệnh này, cả rax và rbx đều chứa giá trị 5.
Quan trọng: thanh ghi nguồn (rax) vẫn giữ giá trị của nó. MOV sao chép, không cắt hoặc di chuyển.
Một ví dụ khác:
mov rax, 7 ; rax = 7
mov rcx, 3 ; rcx = 3
mov rdx, rcx ; rdx = 3 (sao chép từ rcx)
mov rbx, rax ; rbx = 7 (sao chép từ rax)Sau các câu lệnh này:
| Thanh ghi | Giá trị |
|---|---|
| rax | 7 |
| rcx | 3 |
| rdx | 3 |
| rbx | 7 |
Vì sao điều này quan trọng:
- Bạn có thể lưu một giá trị bằng cách sao chép nó sang thanh ghi khác trước khi thay đổi giá trị ban đầu
- Bạn có thể dùng lại các giá trị mà không cần tải lại từ bộ nhớ
- Đây là nền tảng của hầu hết các thao tác trong hợp ngữ
Thử thách
Viết code assembly để thực hiện các nhiệm vụ sau:
- Đưa số 4 vào
rax - Sao chép giá trị từ
raxvàorbx - Sao chép giá trị từ
rbxvàorcx
Sau khi chạy code, cả ba thanh ghi đều phải chứa giá trị 4.
Tự làm thử
section .data
msg_rax db 'rax = '
msg_rax_len equ $ - msg_rax
msg_rbx db 'rbx = '
msg_rbx_len equ $ - msg_rbx
msg_rcx db 'rcx = '
msg_rcx_len equ $ - msg_rcx
section .bss
digit resb 1
section .text
global _start
_start:
%include "solution.asm"
; Lưu các giá trị
mov r12, rax
mov r13, rbx
mov r14, rcx
; In ra "rax = "
mov rax, 1
mov rdi, 1
mov rsi, msg_rax
mov rdx, msg_rax_len
syscall
; In ra giá trị của rax
mov rax, r12
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; In ra "rbx = "
mov rax, 1
mov rdi, 1
mov rsi, msg_rbx
mov rdx, msg_rbx_len
syscall
; In ra giá trị của rbx
mov rax, r13
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; In ra "rcx = "
mov rax, 1
mov rdi, 1
mov rsi, msg_rcx
mov rdx, msg_rcx_len
syscall
; In ra giá trị của rcx
mov rax, r14
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
3Lệnh đầu tiên: MOV
MOV là gì?MOV với giá trị tức thờiMOV từ thanh ghi sang thanh ghiMOV từ bộ nhớ sang thanh ghiMOV từ thanh ghi vào bộ nhớLEA: nạp địa chỉMOV với các kích thước khác nhauLuyện tập: hoán đổi thanh ghiÔn tập: thử thách MOVTự luyện tập: Playground Assembly