汇编——内存

内存基础定义

  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指明操作宽度
相关推荐
tachibana21 小时前
hot100 翻转二叉树(226)
java·数据结构·算法·leetcode
lbb 小魔仙2 小时前
MuMu 模拟器 6.0 硬核测评:这次升级确实不一样
java·开发语言·模拟器·mumu·硬核测评
r_oo_ki_e_2 小时前
Java 线程池
java·开发语言
生戎马2 小时前
高光谱拼接算法(七)USAC
算法
杜子不疼.2 小时前
【Qt初识】信号槽(二):自定义信号函数与槽函数
开发语言·qt
PhotonixBay2 小时前
共聚焦成像核心原理:针孔、PSF与三维形貌测量技术
人工智能·测试工具·算法
秋田君3 小时前
Qt_QVariant
开发语言·qt
江华森3 小时前
Python 实现高德地图找房(三):地图可视化与高德 JS API
开发语言·javascript·python
weixin_471383033 小时前
args,...args与Parameters<T>
开发语言·前端