反汇编中计算局部变量内存地址

编译环境:Windows 10 + VS2015

1、问题

上一篇文章C++函数调用过程解析第3部分执行函数中,说到计算局部变量x和y的地址。在VC6中计算方式分别为[ebp-4]和[epb-8],然而在VS2015中计算方式为[ebp-4-4]和[epb-8-8]。为什么每次计算变量地址时第一个变量需要额外上移4 Byte地址,第二个变量开始需要额外上移8Byte地址?

先做两次实验进行验证。

2、第一次实验

在子函数g_fun中定义6个int类型。分别为x,y,z,h,k,l他们在内存中的地址如图1所示,变量与基地址之间有4Byte间隔区域,变量与变量之间有8Byte间隔区域。

图1

3、第二次实验

在子函数g_fun中定义3个int类型,1个long long类型和1个long类型变量。分别为x,y,z,h,k,l他们在内存中的地址如图2所示,变量与基地址之间有4Byte间隔区域,变量与变量之有8Byte间隔区域间有8Byte间隔区域。

图2

4、结论

变量与函数基地址之间(固定长度为4Byte),以及变量与变量之间有间隔区域(固定长度为8Byte),这个间隔区域与函数的间隔区域功能类似,用来防止相互影响存储的数据。

posted @ 2021-03-31 18:11  钟齐峰  阅读(315)  评论(0编辑  收藏  举报