流程如何跟踪其局部变量

Chr*_*nse 5 c assembly memory-management cpu-architecture

据我所知,当一个进程分配局部变量时,它会通过将它们作为堆栈推送到内存中来实现,但仍然可以通过使用堆栈指针的偏移来引用它们作为随机内存来引用它们(从这个线程是什么)使用堆栈为局部变量背后的想法?).

但是,它如何知道哪些变量有什么偏移?我是否以正确的方式思考这个问题?

das*_*ght 6

局部变量的偏移量作为常量"烘焙"到机器代码中.编译器完成时,程序称为局部变量的内容将被编译器分配的固定内存偏移量替换.

假设您声明了三个局部变量:

char a[8];
int b;
short c;
Run Code Online (Sandbox Code Playgroud)

编译器为这些变量分配偏移量:a偏移量0,b偏移量8,c偏移量12.假设您的代码确实如此b += c.编译器将其转换为如下所示的代码块:

LOAD    @(SP+8)
ADD     @(SP+12)
STORE   @(SP+8)
Run Code Online (Sandbox Code Playgroud)

这里改变的唯一值是SP(堆栈指针).所有偏移都是数字常量.

  • @ChristianBouwense没错,SP只会在你调用另一个函数时改变,此时当前函数处于"保持"状态.一旦另一个函数返回,`SP`将在调用之前恢复到其值,因此当前函数可以再次以其当前偏移量访问其局部变量. (2认同)