Menu
CoddyTech

寄存器到内存的 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 指令。

challenge icon

挑战

写两行汇编代码来完成以下操作:

  1. 将数字 9 放入 al 寄存器
  2. 将 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
quiz icon自我测试

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

基础知识中的所有课

自己练习: Assembly 在线编辑器