Menu
CoddyTech

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_register

Giá 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 ghiGiá trị
rax7
rcx3
rdx3
rbx7

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ữ
challenge icon

Thử thách

Viết code assembly để thực hiện các nhiệm vụ sau:

  1. Đưa số 4 vào rax
  2. Sao chép giá trị từ rax vào rbx
  3. Sao chép giá trị từ rbx vào rcx

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
    syscall
quiz iconTự kiểm tra

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