首页
社区
课程
招聘
[旧帖] 如何理解mov ecx,[esp+4] 0.00雪花
发表于: 2012-6-18 16:13 10790

[旧帖] 如何理解mov ecx,[esp+4] 0.00雪花

2012-6-18 16:13
10790
收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 166
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
假设,ESP寄存器的值0012FF10,里面存的内容是0000FFFF,而地址0012FF14的内容是EEEE0000。
有了上面的这段假设,那么mov ecx,[esp +4]的值就好理解了。
首先esp=0012FF10,esp+4=0012FF14,[esp+4]的意思是去这个地址里的内容,所以[esp+4]=EEEE0000
不知道你看明白没有。
希望楼主先补下汇编语言的基础。
2012-6-18 16:20
0
雪    币: 40
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=地精锁匠;1080890]假设,ESP寄存器的值0012FF10,里面存的内容是0000FFFF,而地址0012FF14的内容是EEEE0000。
有了上面的这段假设,那么mov ecx,[esp +4]的值就好理解了。
首先esp=0012FF10,esp+4=0012FF14,[esp+4]的意思是去这个地址里的内容...[/QUOTE]

很久没学给忘记了
2012-6-18 16:28
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个应该就是汇编的变址寻址吧!
都忘完了!  看来要好好复习啊!
2012-6-18 17:11
0
雪    币: 184
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
把内存地址esp+4中的数据放到ecx
esp+4为当前堆栈指针+4
[]表示内存地址里的数据
2012-6-18 22:07
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
相当于才语言中的
ecx = esi[4]

ecx寄存器可理解为变量,esi可理解为指针,整个合起来可以理解为

将esi值+4所指向的内存中的值赋给(mov)寄存器ecx
2012-6-20 13:30
0
雪    币: 52
活跃值: (39)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mov是移动   后面从右往左  就是把内存地址门牌号为esp+4  里面的值移交给ecx
2012-7-5 21:38
0
雪    币: 5
活跃值: (179)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这个我也不理解
2012-7-7 07:40
0
雪    币: 4031
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
按照IAD来讲,在debug编译模式下,传入函数参数使用基于ESP的正向地址存储,函数局部变量使用ESP的负向地址存储,ESP+4有可能是传入函数的第一个参数所在的地址;ESP即是堆栈的基地址指针,楼上几位也讲到;mov ecx,[ESP+4]就是把ESP+4地址处的变量内容拷贝到ecx寄存器
2012-7-7 10:24
0
雪    币: 449
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
是C++的类函数吧,[ESP+4]是this指针,放到ecx中吧?
2012-7-7 10:42
0
雪    币: 4031
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
如果传递的是对像的地址,应该就是this,
2012-7-7 11:02
0
雪    币: 45
活跃值: (51)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
你要学习下 识别函数栈帧 方面的知识.
2012-7-7 12:29
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
对于esp+4

先要知道:有个堆栈的东东,
假设就是那种装书的盒子,只能一本一本的放进去。但是有时我们拿一个盒子来,其实是想过里面要放什么的,所以当一本一本放好后,我们最起马,一段时间内是知道从最底下的那一本到最上面的一本是那些书,最上面那本你肯定能看到,那就是esp指向的。

下一步你要知道堆栈的方向和内存方向相反,
栈顶的地址小,也就是说:esp-4是放书进去
那esp+4很显然就是拿书出来,对吧

再下一步,你可能就会却的不是刚才说过堆栈只能一本一本的放,只能从上面一本一本的拿出来吗?
怎么现在又可以一下拿到下面的书呢?
这就要转换思想了,esp是永远指向栈顶的地址。在你给的语句中,esp没有变化,所以还是该指那指那,只是作为一个参照。
但是堆栈也是内存地址,所以可以通过一般的读内地址方式进行读取,所以这时的esp+4其实就是一个普通的地址,只是刚好指向堆栈区而已,一般我们都说不要随便破坏堆栈中的数据,不然会引发不可知的异常。但是你只是读取,相当于copy,没多大影响。
2012-7-10 11:08
0
雪    币: 399
活跃值: (214)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
14
上边的回复都没有说到点子上。

如果一个函数比较复杂,编译后会有以下操作:
push    ebp
mov     ebp, esp
.........
mov     esp, ebp
pop     ebp
retn

此时函数会用ebp作为传递参数的指针。
[ebp+4]为函数的返回后执行的下一行的地址
[ebp+8]为第一个参数。

如果是个简单函数,则不执行以上push ebp操作,如此:
[esp]为函数的返回后执行的下一行的地址
[esp+4]为函数的第一个参数地址。
2012-7-10 11:52
0
雪    币: 411
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
不知道你问的是什么意思,若是指在进入函数后,没有做任何其它的PUSH和POP之类的操作,此时esp+4中存放的数据是上层的第一个参数,以4为单位,依次递增,若是做了其它操作,就这能这样计算了
2012-7-10 13:30
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
嗯,说的搜有理。受教了。
2012-7-10 13:43
0
游客
登录 | 注册 方可回帖
返回
//