Menu
CoddyTech

寄存器到寄存器的 MOV

本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 16 课,共 45 课。

现在你已经知道如何将数字直接放入寄存器(MOV 立即数),也可以在寄存器之间复制值。

语法:

mov destination_register, source_register

source 寄存器中的值会被复制到 destination 寄存器中。source 寄存器保持不变。

示例:

mov rax, 5      ; rax = 5
mov rbx, rax    ; rbx = 5(从 rax 复制)

执行这两条指令后,rax 和 rbx 中都存有 5。

重要:源寄存器(rax)仍保留它的值。MOV 会复制,不会剪切或移动。

另一个示例:

mov rax, 7      ; rax = 7
mov rcx, 3      ; rcx = 3
mov rdx, rcx    ; rdx = 3(从 rcx 复制)
mov rbx, rax    ; rbx = 7(从 rax 复制)

执行这些指令后:

寄存器值
rax7
rcx3
rdx3
rbx7

为什么这很重要:

  • 在更改原始值之前,你可以先将它复制到另一个寄存器中来保存它
  • 你可以重复使用这些值,而无需再次从内存中加载
  • 这是大多数汇编操作的基础
challenge icon

挑战

编写汇编代码来完成以下任务:

  1. 将数字 4 放入 rax
  2. 将 rax 中的值复制到 rbx 中
  3. 将 rbx 中的值复制到 rcx 中

执行完代码后,这三个寄存器都应包含 4。

亲手试试

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"
    
    ; 保存值
    mov r12, rax
    mov r13, rbx
    mov r14, rcx
    
    ; 打印 "rax = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_rax
    mov rdx, msg_rax_len
    syscall
    
    ; 打印 rax 的值
    mov rax, r12
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; 打印 "rbx = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_rbx
    mov rdx, msg_rbx_len
    syscall
    
    ; 打印 rbx 的值
    mov rax, r13
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; 打印 "rcx = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_rcx
    mov rdx, msg_rcx_len
    syscall
    
    ; 打印 rcx 的值
    mov rax, r14
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; 退出
    mov rax, 60
    mov rdi, 0
    syscall
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Assembly 在线编辑器