内存到寄存器的 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]挑战
写一行汇编代码,将内存地址 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这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Assembly 在线编辑器