首页
社区
课程
招聘
[求助]关于参数在堆栈存放地址的问题
发表于: 2008-11-25 23:08 5357

[求助]关于参数在堆栈存放地址的问题

2008-11-25 23:08
5357
在第二章中29页中的这三段代码:
00401341        mov ebp,[esp+0C]         ;将参数从栈中传给ebp(用户名cName指针)


00401347        mov edi,[esp+18]        ;将参数从堆栈中传给edi (len参数的值)


00401386        mov eax,[esp+1C]        ;将参数从堆中传给eax(序列号cCode 指针)

为什么,cName,len,cCode 的指针在堆栈中的位置是这样子的呢?
GenRegCode(TCHAR *rCode,TCHAR *name ,int len)
通过这个函数把三个参数添加到堆栈中,那也是len 比 name 先入栈,为什么地址却比他们大呢?

参数的地址在堆栈中到底是怎么存放的

想了半天不明白

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
stdcall約定的話就是從右到左傳參
GenRegCode(TCHAR *rCode,TCHAR *name ,int len)
按順序依次 push len     push *name     push *rCode 址址是len最大,*name其次,*rCode最小

上面的例子是用ESP定位參數的,ESP在有PUSH或POP操作時,值會改變,所以定位同一個參數,在不同的地方偏移也可能不一樣
00401341  mov ebp,[esp+0C]   ;将参数从栈中传给ebp(用户名cName指针)

中間有PUSH指令

00401347  mov edi,[esp+18]  ;将参数从堆栈中传给edi (len参数的值)

中間有PUSH指令

00401386  mov eax,[esp+1C]  ;将参数从堆中传给eax(序列号cCode 指针)
2008-11-26 07:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
从头分析:
push ebx   ;int len           k
lea ....
push edx   ;*name          k-4
push eax   ;*rCode         k-8
call             ;GenRegCode()  k-0C

push ebp   k-10h
mov ebp,[esp+0C]

此时esp 应该是k-14h, esp+0Ch =k-8;
它对应的是rCode呀,而不是*name
还有四个字节我一直想不通去哪儿了
2008-11-26 12:51
0
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你看错了,esp是k-10
2008-11-29 11:40
0
游客
登录 | 注册 方可回帖
返回
//