能力值:
(RANK:1324 )
|
-
-
2 楼
啊?PUSH不是用的堆栈么
|
能力值:
( LV5,RANK:70 )
|
-
-
3 楼
编译器有标准吗?
push ebp 是堆栈吧?
像 mov ecx,xxx ,lea ecx 这类才是用ecx传递参数吧?
|
能力值:
( LV12,RANK:340 )
|
-
-
4 楼
OD跟踪时,ebp的值是2,明显是个参数。
我的意思是在这段代码的调用者那里,ebp被赋值,然后这段代码使用ebp传递进来的参数。
跟实际情况有些出入,大致意思不变。
实际情况是,这段代码是个类成员函数,this通过ecx传递进来,另外还有一个参数。是某控件的id。
而ebp正好是这个参数的备份,粗略的看下这段代码就能发现,该函数被编译时并没有框架指针(Frame Pointer Omission优化?)所以ebp寄存器可以空闲出来留作它用。
如果以c++来表达这个函数的话,应该是下面这样的:
int __thiscall func(int id);
或者
int ClsXX::func(int id);
但是我分析时发现在这段代码里使用那个id参数时,有2种方式:
一种是传统的栈寻址[esp+XX],因为没有框架指针所以是esp寻址。
另一种就是直接push ebp。
|
能力值:
( LV5,RANK:70 )
|
-
-
5 楼
你说的是不是这个?,VC的/Oy选项。
5c7K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3y4F1j5X3I4G2k6%4y4Q4x3X3g2U0L8$3#2Q4x3V1k6S2N6%4m8S2N6s2m8Q4x3V1k6S2M7X3y4Z5K9i4k6W2i4K6u0r3x3U0l9H3z5g2)9J5c8U0p5I4i4K6u0r3x3o6c8Q4x3V1j5I4y4e0V1#2z5e0R3^5i4K6u0W2K9s2c8E0L8l9`.`.
Frame Pointer Omission 我觉得翻译为“栈帧指针删减”好一点.
这样也只是把ebp作为普通寄存器而已,push ebp跟push eax没什么不同。都是把寄存器的值放到堆栈而已。
子函数访问参数时仍是访问堆栈。
如果ebp的值在调用中没有发生改动的话,可能会被再次利用,这个只有编译器才知道了。
传统的参数访问是用 ebp +- xxxx,
用了这个选项之后,ebp留作他用,改用 esp 寻址。
|
能力值:
( LV13,RANK:388 )
|
-
-
6 楼
肯定是fpo优化了
未优化的代码,ebp是栈帧基址,用来局部变量寻址,一般函数体内值都不会动
开了fpo,ebp就跟几个通用寄存器一样了
里面放个临时变量很正常
|
能力值:
( LV12,RANK:340 )
|
-
-
7 楼
我觉得好像也是这样~
|
|
|