-
-
[旧帖]
[原创]vc编译器一般把c函数编译成这样子的。
0.00雪花
-
发表于:
2010-3-3 09:41
1858
-
[旧帖] [原创]vc编译器一般把c函数编译成这样子的。
0.00雪花
cl.exe是visual c++自带的编译器,在VC98\Bin目录下,一般我们都会把这个目录加入环境变量,然后就可以使用cl test.c去编译了。
简单介绍下vc的编译机制吧。
1 函数编译后
一般形式为
push ebp ;栈帧
mov ebp,esp ;ebp成为以后访问函数参数及函数局部变量的指针
sub esp, x ;局部变量实在栈上开辟的空间 这里是4的倍数 因为每次入栈出栈都是4byte
;下面这几句眼熟吧
;一般sub esp,x之后就会执行从.data段向上一句预留的栈空间复制数据的汇编语句了
mov eax,dword ptr [.data段内存地址]
mov [ebp-x],eax
mov ecx,dword ptr [.data段内存地址]
mov [ebp-y],ecx
;上面这几句 就是c语言为什么能实现函数局部变量拥有初始值的原因了
push ebx
push esi ;如果函数里面有内联汇编 一般都会生成保护ebx,esi,edi的指令
push edi
;这里就是函数内部的那些指令了。。
pop edi
pop esi ;和上面的Push对应 用来保护ebx,esi,edi寄存器
pop ebx
mov esp,ebp
pop ebp
xor eax,eax ;或者mov eax, x
ret
嗯 一般一个__cdecl调用约定的函数编译后就是这样子的了。。
[课程]Android-CTF解题方法汇总!