寄存器到寄存器的 MOV
本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 16 课,共 45 课。
现在你已经知道如何将数字直接放入寄存器(MOV 立即数),也可以在寄存器之间复制值。
语法:
mov destination_register, source_registersource 寄存器中的值会被复制到 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 复制)执行这些指令后:
| 寄存器 | 值 |
|---|---|
| rax | 7 |
| rcx | 3 |
| rdx | 3 |
| rbx | 7 |
为什么这很重要:
- 在更改原始值之前,你可以先将它复制到另一个寄存器中来保存它
- 你可以重复使用这些值,而无需再次从内存中加载
- 这是大多数汇编操作的基础
挑战
编写汇编代码来完成以下任务:
- 将数字 4 放入
rax - 将
rax中的值复制到rbx中 - 将
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这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Assembly 在线编辑器