第十四课_读写内存

前言

今天讲讲汇编如何读写内存。

还有一件事,本id觉得,单单讲这些太无趣了,以后文章末尾加点东西,暂时叫《本id的梦话》,也想不出什么好名字了,内容不限,不过大多是生活吧,就算是记录一下自己的生活吧。

 

之前讲过第一条汇编指令,如:mov eax,0xFFFFFFFF,有自己在OD上练习的,这应该很熟悉。这个命令就是把十六进制的0xFFFFFFFF放到寄存器eax中。在汇编中我们把这种确切的数值(如这里的0xFFFFFFFF)称为立即数。

既然数能移到寄存器中,那如何移到内存中呢?也就是写到内存中。

要想写到内存,首先要找到内存。要找到内存,就要先了解内存的结构。可能大家也没有学过计算机组成原理,所以大家可以把内存理解为一辆很长很长的火车,每一节车厢可以理解为一个内存单元,我们坐火车的时候,会发现每节车厢都有一个编号(这样很方便就能找到自己的位置),内存也一样,每个内存单元也都有一个编号,例如:4G的内存,编号从0x000000000xFFFFFFFF。每个内存单元有8位(即只能存801),可以理解为每节车厢只有8个座位。(这样的比喻,不知道是否合适,但本id只能想到这个比较容易让人理解的比喻了,如果有读者有更好的比喻,欢迎分享)。

可以发现,内容编号也是一个数,在汇编中,为了和立即数区分开来,内存编号会用一个中括号“[]”括起来。[内存编号]一般被称为地址。也就是常常听人说的内存地址。

写入、读取内存的指令格式

1、写入内存例子:mov dword ptr ds:[0x12345678],0x12345678

解说:把立即数0x12345678写入到内存编号为0x12345678的内存中。

2、读取内存例子:mov eax,dword ptr ds:[0x12345678]

解说:把内存编号为0x12345678的内存中保存的值读取到寄存器eax中。

说明:

长度:因为内存是连续的(连在一起的火车厢),所以读、写内存时,要指定读、写的长度。这里面的长度可以用byte(字节)word(字)、dword(双字),忘了的可以看第十课。因为一个内存单元为8位,所以读写内存时,最小长度是byte

ptr:(pointer的缩写),也就是指针,实在不好理解,可以认为是固定格式。

ds:(data segment的缩写),也就是数据段寄存器。不理解的,可以认为是固定格式

[0x12345678]:上面讲的,用中括号括起数字,表示内存编号。

综上:可以得到确定一段内存的格式:长度 ptr ds:[内存编号]

在OD中演示读、写内存

要想在OD上练习读写内存,就要给大家讲讲寄存器ESP和堆栈的关系。先看下图,大家有没有发现什么。

可以发现ESP中存放的值就是右下角框中的黑色选中的内存地址。

在OD界面的右下角的框,就是程序运行时的堆栈。不理解什么是堆栈的,本id告诉你这就是内存,更具体的解释堆栈,以后再讲。先来看看右下角这个框,左边的是内存编号,中间那列是内存编号所指的内存存放的数值。

所以要想在OD中观察读取内存的情况,内存的编号尽量用右下角框中能看到的地址编号。当然本id还是建议大家试一试随便找一个地址来读写,看看会发生什么。注:每个程序都自己独立的4G内存空间。当然,很大几率程序会蹦到一个莫名的地方,放心,那可能是读写不让读写的内存,退出OD重来就好。

演示一:读取内存中的值到EAX中

输入指令。

看看内存中的值和EAX中的值,看看运行指令后值的改变。

可以看到内存编号所对应存放的值,被读取到EAX寄存器中了。

演示二:写入内存

输入指令。

看看内存编号所对应的值,看看运行后的结果是否改变。

可以看看数值被写入到内存编号所对应的内存中。

大家可以改变读取和写入内存的长度,(byte、worddoword),读取到8位,16位,32位寄存器中。关键是多练。

就先写到这吧。

下面是梦话时间

本id的梦话

为什么本id突然想写这个?有可能是太寂寞了吧。好像这个理由比较有说服力。别人都是在朋友圈分享生活的,本id却在自己的文章中记录自己的生活,确实是有点特别呀。本id觉得嘛,朋友圈发东西,来来去去就那么几个人熟悉的人给你点赞,久了,也就不怎么了发了。

好了,今天梦话说点什么呢?说说手机吧,周五(4月24日)某果的新手机上市了,本id原来是想买一个的,因为这台的内存确实是太小了,现在内存基本上算是用完了。现在都不敢装app了,而最近公号后台要让使用app才能看,以前都是用小程序看并且回复的。现在就只能晚上慢慢回复了。而最后没买,是考虑到自己一天敲键盘的时间比较多,没什么特殊情况,也没什么人找本id,也就对手机需求不大。而最主要的原因是,因为周五自己某个股票给我亏了6个多点,虽然某重工给了本id涨停,但是账面上亏损了。

就梦话这么多吧。也该休息了。

写于2020.4.27  0:18

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值