寄存器到内存的 MOV
本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 18 课,共 45 课。
现在你已经知道如何将数据从内存加载到寄存器中,接下来你将学习相反的操作:将寄存器中的数据存储到内存中。
语法:
mov [address], register方括号 [ ] 的意思是:“将寄存器中的值存入这个内存地址。”
可以这样理解:
想象一下,内存地址 destination 处有一个空盒子。寄存器中存放着一个值(例如,al 中存放着数字 7)。
当你写下:
mov [destination], al你是在告诉 CPU:“取出 al 寄存器中的值(7),并把它放进名为 destination 的盒子里。”
执行这条指令后,内存地址 destination 现在包含值 7。al 中的值仍保留在那里,没有被移除。
示例:
mov al, 7 ; 把 7 放入 al 寄存器
mov [destination], al ; 将 al 中的值存入内存地址 "destination"注意:在这个练习中,内存中的数据是 1 字节(8 位)。这就是我们使用 al 的原因。它是与数据大小相匹配的 8 位寄存器。稍后你会进一步学习寄存器的大小。
重要规则:
| 规则 | 说明 |
|---|---|
| 必须加方括号 | mov destination, al 是错误的 |
| 目标必须是内存地址 | 使用像 [destination] 这样的标签 |
| 大小必须匹配 | 对于本练习,请使用 al(8 位) |
常见错误:
; 错误:缺少方括号
mov destination, al
; 正确:将值存入内存
mov [destination], al在下面的挑战中,内存地址 destination 已经为你创建好了。你将在第 3 章学习如何创建自己的数据。现在,先专注于 MOV 指令。
挑战
写两行汇编代码来完成以下操作:
- 将数字 9 放入
al寄存器 - 将
al中的值存入内存地址destination
(内存地址 destination 已经为你创建好了。)
亲手试试
section .data
msg db 'destination = '
msg_len equ $ - msg
section .bss
digit resb 1
section .text
global _start
_start:
; 这里包含了 solution.asm 文件
; 它定义了 destination 和学生编写的 MOV 指令
%include "solution.asm"
; 从内存中将存储的值加载到 al,以便打印
mov al, [destination]
; 保存它
mov r12, rax
; 打印 "destination = "
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msg_len
syscall
; 打印该值
mov rax, r12
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 在线编辑器