Archive for the ‘编译器汇编代码分析’ Category

昨晚整理资料,翻出一个自己一年前写的txt,估计是当时自己闲得蛋疼的时候研究的玩意,只记录了实验数据和结论。实验就懒得重现了,只把结果在这记一下吧,供参考。

1、返回类型为结构体
结论:
1、调用函数前,先给返回的结构体预留空间,并把首地址压栈;
2、函数内部利用压栈的首地址设置返回的结构体信息;
3、函数返回值(eax)为压栈的首地址;
4、调用者把返回值(eax)指向的空间存放的结构体拷贝到栈上层的一段空间中;//第一次copy
5、调用者利用栈上层的这段空间存放的结构体信息给变量赋值。//第二次copy

2、形参类型为结构体
结论:
结构体为参数时,仿照压栈的方式,在栈上拉出结构体大小的空间并填充,作为函数参数(相当于将结构体压栈)。

我们知道VC++和gcc都支持naked函数,即所谓的“裸函数”,对于这种函数,编译器不会生成任何函数入口代码和退出代码。这种函数一般应用在与操作系统内核相关的代码中,如中断处理函数、钩子函数等。

VC++的声明语法:__declspec(naked)

gcc的声明语法:__attribute__((naked))

因为编译器不会生成入口代码和退出代码,所以写naked函数的时候要分外小心。进入函数代码时,父函数仅仅会将参数和返回地址压栈,亦即只有esp寄存器和eip寄存器会发生变化。

一般来说,使用naked函数时需要注意以下问题:(以VC++编译器为例)

Read the rest of this entry »

World Line
Time Machine
Online Tools