MOV 立即数
本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 15 课,共 45 课。
MOV 最简单的形式是 MOV immediate。“Immediate”表示值直接写在指令本身中。
语法:
mov register, value值会被复制到寄存器中。
示例:
| 指令 | 作用 |
|---|---|
mov rax, 5 | 将数字 5 复制到 rax |
mov rbx, 100 | 将数字 100 复制到 rbx |
mov rcx, 0 | 将数字 0 复制到 rcx |
这段代码不会产生任何可见效果(目前还没有输出),但它成功地将数字放入了寄存器。
注意:在后续课程中学习打印或调试时,你会看到这些 MOV 指令的效果。现在只要知道数字已存储在寄存器中即可。
重要规则:
| 规则 | 说明 |
|---|---|
| 值必须能放入寄存器 | rax 可以存放非常大的数字(最大为 2⁶⁴-1) |
| 值会被复制,而不是移动 | 原始数字仍然存在(它只是一个数字) |
| 寄存器在左侧 | mov rax, 5 是正确的。mov 5, rax 是错误的 |
挑战
为每个任务写一行汇编代码:
- 将数字 5 放入
rax寄存器。 - 将数字 7 放入
rbx寄存器。 - 将数字 3 放入
rcx寄存器。
亲手试试
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 在线编辑器