Menu
CoddyTech

内存到寄存器的 MOV

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

到目前为止,你已经将数字直接移入寄存器(立即数),并在寄存器之间复制了值。现在,你将学习如何将数据从内存加载到寄存器中。

为什么这很重要:

还记得第 0 章的内容吗:一条指令最多只能使用一个内存操作数,而且寄存器的速度比内存快得多,所以你要把要处理的值加载到寄存器中。具体做法如下。

语法:

mov register, [address]

方括号 [ ] 表示:“转到这个内存地址,获取其中存储的值。”

可以这样理解:

想象一下,在内存地址 number 处有一个盒子。盒子里有一个值,比如数字 5。当你写下:

mov al, [number]    ; Load the value from memory address "number" into al

你是在告诉 CPU:“找到名为 number 的盒子,取出里面的值(这里是 5),然后把它复制到 al 寄存器中。”

执行这条指令后,值 5 就存储在 al 中了。地址为 number 的盒子里原来的值仍然留在那里,没有被移除。

重要规则:

规则说明
源必须是内存地址[label] 或 [address]
必须使用方括号不加方括号时,myNumber 表示地址,而不是值
大小必须匹配如果内存中存储的是一个字节,请使用 al(而不是 rax)

常见错误:

; 错误:没有方括号时,myNumber 表示地址,而不是值。
mov al, myNumber

; 正确:加载存储在 myNumber 处的值。
mov al, [myNumber]
challenge icon

挑战

写一行汇编代码,将内存地址 value 中的值加载到 al 寄存器中。

亲手试试

section .data
    msg db 'al = '
    msg_len equ $ - msg

section .bss
    digit resb 1

section .text
    global _start

_start:
    ; 先运行你的代码(将值加载到 al 中)
    
    %include "solution.asm"
    
    ; 保存 al 中的值
    mov r12, rax
    
    ; 打印 "al = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, msg_len
    syscall
    
    ; 打印 al 中的值
    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 在线编辑器