内存基础定义

  1. 内存(主存):临时存放程序运行数据、代码的存储硬件;纠正:内存不在 CPU 内部,CPU 内部极小高速存储单元叫寄存器,内存条是独立硬件,通过总线和 CPU 通信
  2. 寄存器短板:CPU 内置寄存器数量极少(EAX/EBX/ESP 等十几个),容量极小,放不下程序全部数据
  3. 内存核心作用:大容量临时存储,弥补寄存器数量、容量不足;程序运行时代码、变量、栈、堆全都放在内存里

32 位进程虚拟内存(4GB 独立空间)

  1. 虚拟地址空间:32 位系统下,每一个进程独占一套完整 4GB 虚拟内存地址,进程之间互相隔离,互不干扰
  2. 虚拟内存 = 空头支票:这 4GB 只是逻辑地址编号,不是实打实的物理内存条空间。多个进程的 4GB 虚拟地址可以映射到同一块物理内存,也可以一部分放硬盘分页文件
  3. 内存映射机制:进程读写某块虚拟地址时,操作系统(MMU 内存管理单元)自动把虚拟地址翻译成真实物理内存地址;没分配物理空间时会触发缺页异常,系统再分配物理内存载入数据
  4. 学习分层:基础阶段只需要记住每个32 位程序都有独立 4GB 虚拟地址;虚实地址转换、分页、置换属于进阶内容

内存地址与寻址规则

  1. 内存地址:内存每个最小存储单元(1 字节)分配唯一数字编号,这个编号就是内存地址,用来定位读写位置
  2. 地址宽度:32 位 CPU 地址总线宽度 32bit,地址只能用 32 位二进制数字表示
  3. 32 位寻址上限:
    ○ 总地址数量:232=4294967296
    ○ 一个地址对应 1 字节,整体最大空间刚好 4GB
  4. 地址书写习惯:二进制太长,汇编全部用十六进制简写;1 位十六进制 = 4 位二进制,32 位地址正好写成 8 位十六进制(例:0x00401000)

汇编 MOV 指令内存读写规则

三种合法基础读写格式

  1. 立即数 → 内存MOV BYTE PTR [地址], 0x12 ;给指定内存字节写入常数
  2. 寄存器 → 内存MOV DWORD PTR [ESI], EAX ;把 EAX32 位数据存入 ESI 指向的内存
  3. 内存 → 寄存器MOV EBX, WORD PTR [0x123400] ;读取内存 16 个字放进 BX
    必须标注宽度 BYTE/WORD/DWORD PTR,告诉 CPU 读写 1/2/4 字节
    硬性限制:普通 MOV不支持内存直接→内存
  4. 错误写法:MOV [addr1], [addr2],汇编直接报错
  5. 标准中转方案:必须借寄存器过渡
    MOV EAX, [addr2] ; 内存2→寄存器
    MOV [addr1], EAX ; 寄存器→内存1
  6. 特例:串指令MOVSB/MOVSW/MOVSD属于特殊硬件串操作,允许内存到内存批量搬运,不属于普通 MOV 规则

内存地址寻址格式

总公式
有效地址 EA = 基址寄存器 + 变址寄存器 × 比例因子 + 偏移立即数
比例因子仅允许:1、2、4、8

1. 形式一:直接数值寻址(绝对地址)

格式:[常数]
原理:中括号里数字直接当作内存地址
mov eax, dword ptr [0x401000] ; 读取地址0x401000处4字节数据送入EAX
mov byte ptr [0x1234], 0x0F ; 向地址0x1234写入1字节0x0F

2. 形式二:寄存器间接寻址

格式:[基址寄存器]
原理:寄存器内部存储的值 = 目标内存地址;可用全部 8 个 32 位通用寄存器(EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESP)
mov esi, 0x5000
mov ebx, dword ptr [esi] ; 取ESI值(0x5000)对应的内存数据给EBX

3. 形式三:寄存器 + 立即偏移

格式:[寄存器 + 常数] / [寄存器 - 常数]
原理:地址 = 寄存器数值 ± 立即数偏移,栈、局部变量最常用
mov eax, dword ptr [ebp - 0x18] ; 读取栈上局部变量
mov edx, dword ptr [esp + 0x10] ; 读取栈参数

4. 形式四:变址 × 比例因子

格式:[寄存器 × 比例值]
规则:比例值只能是 1/2/4/8(适配字节、字、双字、64 位数据数组)
; 数组每个元素4字节,下标存在ECX
mov eax, dword ptr [ecx * 4]
; 等价地址=ECX的值×4

5. 形式五:基址 + 变址 × 比例因子(最完整复合寻址)

格式:[基址寄存器 + 变址寄存器 × 比例值]
可额外叠加立即偏移:[EBX + ESI*4 + 0x20]
适用场景:结构体、二维数组
; 基址EBX存数组首地址,ECX是下标,元素4字节
mov eax, dword ptr [ebx + ecx * 4]
; 带偏移拓展
mov edx, dword ptr [edi + eax * 2 + 0x10]

关键约束

  1. 比例因子固定仅支持 1、2、4、8
  2. 参与寻址的寄存器都是 32 位通用寄存器
  3. 所有格式外层必须加[],代表访问内存;不加[]代表取寄存器本身的值
  4. 读写内存必须搭配BYTE/WORD/DWORD PTR指明操作宽度
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐