汇编_读写内存

【本节目标】

  1. 了解如何访问函数的内存
  2. 记住内存修改与字长
  3. 分清楚内存读和写的方式

1. 函数内存的访问

每一个函数都有一个堆栈,函数放在ESP(栈顶)和EBP(栈底)之间(要在调试状态下才可看到内存)

2. 内存修改与字长

这里我们可以直接手动修改 内存里面对应的数据,通过观察修改的位数,我们可以发现字长在内存中的关系。

上图内存中我们使用的都是十六进制数,一个十六进制位代表4个二进制位,上图中我们修改了4个1,也就是4个十六进制位,相当于二进制的16位;所以一个字相当于二进制的16位,相当于两个字节

总结 :32位是4个字节,4个字节相当于两个字,由此说明,一个字是两个字节,一个字节是8位(位都☞二进制)
类推:内存是有宽度的(计算机是有宽度的),32位是4个字节,64位是8个字节

3. 内存寻址基础

[ ]我们代表的是内存 (memory),也就是访问内存时,用 [ 寄存器 ] 我们就可以访问相应的内存了!

前面两个都是寄存器,可以随便用。三个表达式可以单独也可以共同存在。

3.2 数据类型与内存存储

(无符号类型)

dword------>4个字节(对应三十二位寄存器 FFFF FFFF)

word ------>2个字节(对应十六位寄存器 FFFF)

byte ------>1个字节(对应八位寄存器 FF)

注意:内存 里面的数据 读起来是反着来的,是从右边到左边(小端存储->低位在低地址),比如下图中:0012FF80地址对应的数据C0 FF 12 00,我们读的时候是要00 12 FF C0这样读的

上图指令分析:

3.3 内存读取

注意:读内存时,宽度与寄存器大小要匹配!!!

上图中:

byte是访问一个字节,对应的是八位寄存器(al...),如果没有对应那就是错的,world对应的是十六进制寄存器,假设写成:mov AX,byte那就是错的,因为AX是十六进制寄存器,byte对应的的是八位寄存器,二者不匹配!

注意一个混淆点:

地址是从低位到高位

内存是从高位到低位

3.4 内存赋值

那么现在我要改变读取的大小,怎么修改呢?结果会发生什么变化呢?

🤔🤔思考:如果想要修改0x0012FF84的内存怎么办呢??

写内存时我们有好多种方法,如下图:

相关推荐
Lost of 程序猿几秒前
命令模式实战:把“下单后的动作“打包成可执行的任务
后端·设计模式·c#·asp.net·命令模式
sunburn-2 分钟前
Java 排序算法详细教学:从冒泡排序到快速排序
java·开发语言·数据结构·ide·算法
鹤卿1235 分钟前
「iOS」GCD
开发语言·ios·objective-c
我是小白呀7 分钟前
编排还是事件协作?用 AcmeFlow 讲清企业 Workflow 的控制权
java·开发语言
ACP广源盛1392462567310 分钟前
接口适配方案选型|GSV6125@ACP HDMI2.0 转 Type‑C/DP1.4 桥接芯片工程评估
大数据·c语言·开发语言·硬件架构·硬件工程·国产芯片
淡海水14 分钟前
16-01-C#数据结构源码-附录A-术语表
unity·c#·游戏引擎·il2cpp
小羊没烦恼!25 分钟前
【译】利用Asp.net MVC处理文件的上传下载
开发语言·缓存·c#·word·powerpoint·.net
时间的拾荒人32 分钟前
Qt 信号与槽机制详解(二):连接方式详解与面试指南
开发语言·qt·面试
霸道流氓气质35 分钟前
LangGraph式图编排引擎Java实现:状态机模型、Checkpoint恢复与生产级落地实战
java·开发语言·数据库
2601_9622186141 分钟前
C++ AVL树概念与实现详解
开发语言·c++