day13.内存地址的五种形式



第13节:内存地址的五种形式

上节课讲了内存相关知识,那么我们一起回顾一下。
读取内存的值,比如例子:
MOV EAX,DWORD PTR DS:[0x13FFC4]
以上的代码意思从内存中取出四个字节的数据,那么我们是怎么知道是四个字节的呢?有两个地方知道,一是从EAX寄存器知道它是32位寄存器,还有从数据的宽度DWORD知道。在上节课看到这种MOV指令前后两个指令操作数的宽度要一样,否则会报错在看上面的例子中的[0x13FFC4]内存地址编号,它指向了某一个内存单元,这个内存单元有多大呢?实际上是八位一个字节,那么我们知道是每一个内存编号都对应着一个字节。那么这种形式,在我们真正看汇编的时候还会有其他的形式出现吗?答案是有的,而且不仅仅是立即数这一种情况,我们来看一段C语言代码:

int x=1; //全局变量
int main()
{
    x = 2;
    int y = 3;  //局部变量
    int z[] ={0};  //数组
    for(int i=0;i<10;i++) //循环语句
    {
        z[i]=i;  //输出数组值
    }
}

我们想了解C语言的某些特性,学习某些语法之类的,其实是很容易的。比如上面的代码我们不知道是什么意思的时候,如果你会汇编的话,通过切换到汇编的情况下,就一目了然了。所以大家不知道上面的代码什么意思,不要紧,现在讲的是汇编。比如来看x = 2汇编代码的形式是:
dword ptr[x(00424d8c)],2

以上是将2的数存到00424d8c的内存地址里面,x加上中括号是为了让我们更直观看懂代码的意思,也就是说它想告诉我们这是一个内存编号,是有x进行生成的,也就是x的内存编号,这并不是标准的写法,标准的写法是:
dword ptr ds:[0x00424d8c],2
如果指令是mov dwrod ptr[ebp-4],3的形式的时候,是将3存到ebp-4的内存编号里面。
如果指令是dword ptr [ebp+ecx* 4-8],edx,这个内存地址又是多少呢?其实是ebp+ecx* 4-8的内存编号给edx。我想告诉大家的是我们知道了[00424d8c]只有这种立即数方式后,还有其他的写法方式。这节课主要来了解一下内存地址的五种形式,就是内存编号有五种表示形式,只有这五种形式,没有第六种,如果五种都掌握以后在看汇编里有涉及到这五种形式你都能看的懂,好的我来介绍着五种形式:

1) MOV DWORD PTR DS:[0x123FFFD4],EAX
这种形式也是我们之前学过的形式在中括号里面直接写一个数值,这个数值就代表内存的地址。

2) MOV DWORD PTR DS:[reg]
reg代表32位寄存器,这个怎么用,我们们打开olldebug工具在反汇编窗口中输入:
MOV DWORD PTR DS:[18FFF8],0x12345678
还可以将寄存器中的EAX改成0018FFF8,在MOV指令里面不写立即数了直接写[EAX],最终的结果是:
MOV DWORD PTR DS:[EAX].0x12345678
这样的结果是和立即数的方式是一样的,有人会说这个有意义吗?其实是有意义的,我们前面演示了当我们将一个C语言转换成汇编,然后看汇编代码的时候,你怎么保证编译器按照你的要求方式生成汇编呢?我能保证的是无论你生成什么样的汇编,都能看的懂,所以大家要弄清楚我们为什么要学这个里面地址编号的五种形式。

3) [reg+立即数]
我们在反汇编窗口中输入MOV EAX,DWORD PTR DS:[ECX+4],那么ECX是0取得ECX+4的值,首先我们将ECX寄存器的值改成18FFF4,如果ECX=18FFF4内存编号在加4,那么取得的结果就是18FFF8的值,然后在把这个值传给EAX里,根据第2种形式中的值得到输出是EAX=12345678。(注意:这只是一个例子在你们的机子上用olldebug工具演示的话值是不一样的。)

4)[reg+reg*{1,2,4,8}]
表示一个32位寄存器加上另一个32位寄存器乘以一个值,这个值只有是1、2、4、8。举个例子:
 MOV EAX,13FFC4
 MOV ECX,2
 MOV EDX,DWORD PTR DS:[EAX+ECX* 4]
 最终的结果是:13FFC4+2 * 4=13FFCC 在将这个值给EDX
 
5)[reg +reg*{1,2,4,8}+立即数]
例子:
MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX*{1,2,4,8}+4]

这就是内存地址的五种形式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随行之旅

python国产化自动化

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值