社区
C语言
帖子详情
为什么VS下一个int总是从ebp-8开始,ebp-4对应的4个字节干吗用了?
dpdp_2012
2012-10-10 05:11:30
RT
...全文
507
5
打赏
收藏
为什么VS下一个int总是从ebp-8开始,ebp-4对应的4个字节干吗用了?
RT
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
dpdp_2012
2012-10-10
打赏
举报
回复
[Quote=引用 2 楼 的回复:]
1 我记不清了,你可以查一下vc用了防止stackoverflow 机制,在返回地址前插一个checkval。
我不确定是不是这玩意,你可以搜一下。
[/Quote]我也是在想留出这四个字节,是不是和什么缓冲区溢出有关。
大熊猫侯佩
2012-10-10
打赏
举报
回复
ebp+4是返回地址鸟
swlilike
2012-10-10
打赏
举报
回复
ebp-4 是不是存放 ret 的返回地址了?
大熊猫侯佩
2012-10-10
打赏
举报
回复
1 我记不清了,你可以查一下vc用了防止stackoverflow 机制,在返回地址前插一个checkval。
我不确定是不是这玩意,你可以搜一下。
大熊猫侯佩
2012-10-10
打赏
举报
回复
你说的是函数局部变量是吧?这个没有绝对。
因为在函数进入序言后,
ebp->old ebp
ebp+4->ret addr
ebp+8->1st parm
所以ebp-4是可以使用的,至于vc为啥不用,2种可能:
1 做vc专有用途
2 简单无视他,就是不用
从汇编到c 调用约定 堆栈原理
学习汇编的
一个
重要的方法就是将汇编代码和c代码之间进行转换练习,这样的练习做的越多,对汇编就越熟悉,同时对c代码的理解也更加深刻。很多时候,拿到
一个
程序的反汇编代码,虽然可能每一行汇编代码都知道什么意思,但却发现对于整个程序干了什么却不知道,原因在于
一个
简单的程序,翻译成汇编的代码量相对于c程序而言多了好多,而且因为汇编代码和人的思维差别比较大,所以,对于整个逻辑的理解就很困难。然而如果经常做一些将汇编翻译成c代码的练习,那么你渐渐就会发现,汇编代码其实也很都有规律,看到这一段汇编代码,你就很自然的联想到它
对应
的c代码。 下面我们就开始做一下这样的练习,首先看一下下面的汇编代码: ##### 第一段第代码 00401020 push
ebp
; 保存epb 00401021 mov
ebp
,esp ; 将
ebp
指向栈顶 00401023 sub esp,4Ch ;为局部变量分配空间,sub esp, xxx相当于多个push 00401026 push ebx ; 保存ebx 00401027 push esi ; 保存esi 00401028 push edi ; 保存edi, 上面3个寄存器在使用之前必须保存 00401029 lea edi,[
ebp
-4Ch] ; 将刚刚分配的局部空间的地址送到edi 0040102C mov ecx,13h ; ecx这里是循环次数=4ch/4h =13h 00401031 mov eax,0CCCCCCCCh ; 将4个
int
3指令放入eax 00401036 rep stos dword ptr [edi] ; 将分配的局部变量空间都用
int
3指令填充 .....
汇编,反汇编
和文档内容不同,是文档部分后续补充。。。。。。。。
关于编译型语言函数的调用(二)
接上文: http://blog.csdn.net/prsniper/article/details/40652451 上文中提到的局部变量的地址,第
一个
是[
ebp
-4],由于32位内存对齐的原因,第二个是[
ebp
-8],对于VC7以上的版本,这个地址可能会不一样 比如第
一个
可能是[
ebp
-8],第二个飞到[
ebp
-14],这是
VS
.NET的VC编译器在每个局部变量前后都加
一个
DW
函数栈帧的创建和销毁
将
ebp
压栈esp指向
ebp
这里是主函数里的
ebp
。因为都是地址所以
ebp
-8为在
ebp
地址减去8个
字节
。.将esp赋值给
ebp
,
ebp
与esp都指向
ebp
。把eax移动到
ebp
-32(20h为16进制)中。14h以十六进制打印代表20即
ebp
-20。栈空间的地址使用为先使用高地址,在使用低地址。把
ebp
-14h(
ebp
-20)传入eax中。将原来esp所指的地址加8即现在的位置。
ebp
esp两个寄存器存放的是地址。此时
ebp
-8存放的是a值为10。......
ebp
函数堆栈esp_函数参数压栈,栈帧
ebp
,esp怎样移动的?
压栈一次esp-4,
ebp
不变esp是栈顶指针寄存器,堆栈操作只和esp有关比如有
一个
函数a,有两个参数,一般是这样的PUSH 1 参数2压栈,esp-4PUSH 2 参数1压栈,esp-4CALL a 调用a:PUSH
EBP
保存
ebp
MOV
EBP
,ESP 改变栈帧,以后访问参数通过
ebp
,访问局部变量通过espSUB ESP,8 分配局部变量空间...ADD ESP,8POP
EBP
恢复...
C语言
70,040
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章