汇编——内存
内存基础定义
- 内存(主存):临时存放程序运行数据、代码的存储硬件;纠正:内存不在 CPU 内部,CPU 内部极小高速存储单元叫寄存器,内存条是独立硬件,通过总线和 CPU 通信
- 寄存器短板:CPU 内置寄存器数量极少(EAX/EBX/ESP 等十几个),容量极小,放不下程序全部数据
- 内存核心作用:大容量临时存储,弥补寄存器数量、容量不足;程序运行时代码、变量、栈、堆全都放在内存里
32 位进程虚拟内存(4GB 独立空间)
- 虚拟地址空间:32 位系统下,每一个进程独占一套完整 4GB 虚拟内存地址,进程之间互相隔离,互不干扰
- 虚拟内存 = 空头支票:这 4GB 只是逻辑地址编号,不是实打实的物理内存条空间。多个进程的 4GB 虚拟地址可以映射到同一块物理内存,也可以一部分放硬盘分页文件
- 内存映射机制:进程读写某块虚拟地址时,操作系统(MMU 内存管理单元)自动把虚拟地址翻译成真实物理内存地址;没分配物理空间时会触发缺页异常,系统再分配物理内存载入数据
- 学习分层:基础阶段只需要记住每个32 位程序都有独立 4GB 虚拟地址;虚实地址转换、分页、置换属于进阶内容
内存地址与寻址规则
- 内存地址:内存每个最小存储单元(1 字节)分配唯一数字编号,这个编号就是内存地址,用来定位读写位置
- 地址宽度:32 位 CPU 地址总线宽度 32bit,地址只能用 32 位二进制数字表示
- 32 位寻址上限:
○ 总地址数量:232=4294967296
○ 一个地址对应 1 字节,整体最大空间刚好 4GB - 地址书写习惯:二进制太长,汇编全部用十六进制简写;1 位十六进制 = 4 位二进制,32 位地址正好写成 8 位十六进制(例:0x00401000)
汇编 MOV 指令内存读写规则
三种合法基础读写格式
- 立即数 → 内存MOV BYTE PTR [地址], 0x12 ;给指定内存字节写入常数
- 寄存器 → 内存MOV DWORD PTR [ESI], EAX ;把 EAX32 位数据存入 ESI 指向的内存
- 内存 → 寄存器MOV EBX, WORD PTR [0x123400] ;读取内存 16 个字放进 BX
必须标注宽度 BYTE/WORD/DWORD PTR,告诉 CPU 读写 1/2/4 字节
硬性限制:普通 MOV不支持内存直接→内存 - 错误写法:MOV [addr1], [addr2],汇编直接报错
- 标准中转方案:必须借寄存器过渡
MOV EAX, [addr2] ; 内存2→寄存器
MOV [addr1], EAX ; 寄存器→内存1 - 特例:串指令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、2、4、8
- 参与寻址的寄存器都是 32 位通用寄存器
- 所有格式外层必须加[],代表访问内存;不加[]代表取寄存器本身的值
- 读写内存必须搭配BYTE/WORD/DWORD PTR指明操作宽度
更多推荐


所有评论(0)