汇编——内存

📅 2026/7/10 3:14:56
汇编——内存
内存基础定义内存主存临时存放程序运行数据、代码的存储硬件纠正内存不在 CPU 内部CPU 内部极小高速存储单元叫寄存器内存条是独立硬件通过总线和 CPU 通信寄存器短板CPU 内置寄存器数量极少EAX/EBX/ESP 等十几个容量极小放不下程序全部数据内存核心作用大容量临时存储弥补寄存器数量、容量不足程序运行时代码、变量、栈、堆全都放在内存里32 位进程虚拟内存4GB 独立空间虚拟地址空间32 位系统下每一个进程独占一套完整 4GB 虚拟内存地址进程之间互相隔离互不干扰虚拟内存 空头支票这 4GB 只是逻辑地址编号不是实打实的物理内存条空间。多个进程的 4GB 虚拟地址可以映射到同一块物理内存也可以一部分放硬盘分页文件内存映射机制进程读写某块虚拟地址时操作系统MMU 内存管理单元自动把虚拟地址翻译成真实物理内存地址没分配物理空间时会触发缺页异常系统再分配物理内存载入数据学习分层基础阶段只需要记住每个32 位程序都有独立 4GB 虚拟地址虚实地址转换、分页、置换属于进阶内容内存地址与寻址规则内存地址内存每个最小存储单元1 字节分配唯一数字编号这个编号就是内存地址用来定位读写位置地址宽度32 位 CPU 地址总线宽度 32bit地址只能用 32 位二进制数字表示32 位寻址上限○ 总地址数量2324294967296○ 一个地址对应 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、81. 形式一直接数值寻址绝对地址格式[常数]原理中括号里数字直接当作内存地址mov eax, dword ptr [0x401000] ; 读取地址0x401000处4字节数据送入EAXmov byte ptr [0x1234], 0x0F ; 向地址0x1234写入1字节0x0F2. 形式二寄存器间接寻址格式[基址寄存器]原理寄存器内部存储的值 目标内存地址可用全部 8 个 32 位通用寄存器EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESPmov esi, 0x5000mov ebx, dword ptr [esi] ; 取ESI值(0x5000)对应的内存数据给EBX3. 形式三寄存器 立即偏移格式[寄存器 常数] / [寄存器 - 常数]原理地址 寄存器数值 ± 立即数偏移栈、局部变量最常用mov eax, dword ptr [ebp - 0x18] ; 读取栈上局部变量mov edx, dword ptr [esp 0x10] ; 读取栈参数4. 形式四变址 × 比例因子格式[寄存器 × 比例值]规则比例值只能是 1/2/4/8适配字节、字、双字、64 位数据数组; 数组每个元素4字节下标存在ECXmov eax, dword ptr [ecx * 4]; 等价地址ECX的值×45. 形式五基址 变址 × 比例因子最完整复合寻址格式[基址寄存器 变址寄存器 × 比例值]可额外叠加立即偏移[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指明操作宽度