![]() |
1
6
局部变量的偏移量作为常量“烘焙”到机器代码中。在编译器完成时,程序中称为局部变量的内容将替换为编译器指定的固定内存偏移量。 假设您声明了三个局部变量:
编译器将偏移量分配给这些变量:
此处唯一更改的值是
|
![]() |
2
2
前言:以下文本使用x86体系结构作为示例。其他体系结构的处理方式确实不同。
很接近了。 它是通过将它们放入内存来实现的 上 堆栈[当前进程的] . 每一个 过程 有自己的堆栈。因此,对于每个上下文切换 堆叠框架 改变了吗?它也改变了 局部变量(堆栈上) .
通常(!)本地定义的变量相对于
堆叠框架
已保存并存在于
较新的编译器可以节省寄存器
所以要回答你的主要问题
流程跟踪其
堆叠框架
(其中包含
局部变量
),但不是他们的
局部变量
他们自己以及
堆叠框架
每项更改
过程开关
. 这个
局部变量
仅相对于
堆栈帧指针
登记在册
|
![]() |
3
1
编译器负责记忆偏移量。这些偏移量只是硬编码的。若要加载变量以注册(例如,到eax),编译器将生成以下内容
此外,某些平台上的堆栈可能会反转,因此偏移量将为正。 |
![]() |
velenos14 · zgemv与dgemv/sgemv的算术强度? 1 年前 |
|
MagicRacoon · TSO和存储转发保证 1 年前 |
|
ugo_capeto · gcc使用“lea”而不是“add”` 1 年前 |
![]() |
platelet · Skylake有环流探测器吗? 1 年前 |
![]() |
vengy · 显示如何发现zenbleach的组装说明 1 年前 |
![]() |
Christian Bouwense · 进程如何跟踪其局部变量 7 年前 |