社区
C语言
帖子详情
为什么VS下一个int总是从ebp-8开始,ebp-4对应的4个字节干吗用了?
dpdp_2012
2012-10-10 05:11:30
RT
...全文
425
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 简单无视他,就是不用
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
恢复...
关于编译型语言函数的调用(二)
接上文: http://blog.csdn.net/prsniper/article/details/40652451 上文中提到的局部变量的地址,第
一个
是[
ebp
-4],由于32位内存对齐的原因,第二个是[
ebp
-8],对于VC7以上的版本,这个地址可能会不一样 比如第
一个
可能是[
ebp
-8],第二个飞到[
ebp
-14],这是
VS
.NET的VC编译器在每个局部变量前后都加
一个
DW
c语言编程对齐输出,C语言
字节
对齐
什么是
字节
对齐?现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的
一个
接
一个
的排放,这就是对齐。为什么要
字节
对齐?
字节
是否对齐关系到CPU访问数据时的效率问题,假设
一个
CPU每次
总是
从内存中取出4个
字节
,从内存编号为0的地方开...
对于ESP、
EBP
寄存器的理解
esp是栈指针,是cpu机制决定的,push、pop指令会自动调整esp的值;
ebp
只是存取某时刻的esp,这个时刻就是进入
一个
函数内后,cpu会将esp的值赋给
ebp
,此时就可以通过
ebp
对栈进行操作,比如获取函数参数,局部变量等,实际上使用esp也可以;既然使用esp也可以,那么为什么要设定
ebp
呢?答案是为了方便程序员。因为esp在函数运行时会不断的变化,所以保存
一个
一进入某个函数的esp到...
栈帧
ebp
,esp详解
栈帧%
ebp
,%esp详解 分类专栏: 汇编 首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的
一个
栈帧,这个栈帧中维持着所需要的各种信息。寄存器
ebp
指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(地址地)。下图为典型的存取器安排,观察栈在其中的位置 入栈操作:push eax; 等价于 esp=esp-4,eax->[es...
C语言
69,371
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章