首页
社区
课程
招聘
[旧帖] [原创]vc编译器一般把c函数编译成这样子的。 0.00雪花
发表于: 2010-3-3 09:41 1883

[旧帖] [原创]vc编译器一般把c函数编译成这样子的。 0.00雪花

2010-3-3 09:41
1883
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调用约定的函数编译后就是这样子的了。。

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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我来支持mm的帖子
debug模式下还有
cmp esp.ebp
call _chkesp
这点可不要忘了,因为有好多程序在debug版本下崩溃,release版本下却正常执行,就是因为它。
2010-3-3 09:51
0
雪    币: 2308
活跃值: (2200)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
3
新人过来学习的
2010-3-3 10:02
0
雪    币: 15
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
虽然用过VC 的cl.exe,但是这些内部的本质的东西  还是应该看看的.
2010-3-3 10:14
0
雪    币: 119
活跃值: (10)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
5
学习一下!LZ最近学习的热情很高,加油!
2010-3-3 10:59
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习一下喽,加油
2010-3-3 12:41
0
游客
登录 | 注册 方可回帖
返回
//