Variables 如何获取存储在堆栈中的变量?

Variables 如何获取存储在堆栈中的变量?,variables,memory,operating-system,stack,Variables,Memory,Operating System,Stack,在编程时(例如,在C语言中),许多变量保存在堆栈中。 堆栈是FIFO数据结构,我们只能弹出堆栈的顶部值 假设堆栈中存储了100个变量,我想得到其中一个变量的值,它不在堆栈的顶部。 我怎么得到它?操作系统是否会弹出堆栈中所有较新的变量,直到获得所需的变量,然后将它们全部推回堆栈中? 或者操作系统是否有不同的方式来处理堆栈中的变量 谢谢。操作系统不会直接处理变量 二,。不要将堆栈视为物理堆栈(原因过于简单:它不是物理堆栈)。堆栈的元素可以直接访问,编译器会生成执行此操作的代码。谷歌“堆栈指针相对寻址

在编程时(例如,在C语言中),许多变量保存在堆栈中。 堆栈是FIFO数据结构,我们只能弹出堆栈的顶部值

假设堆栈中存储了100个变量,我想得到其中一个变量的值,它不在堆栈的顶部。 我怎么得到它?操作系统是否会弹出堆栈中所有较新的变量,直到获得所需的变量,然后将它们全部推回堆栈中? 或者操作系统是否有不同的方式来处理堆栈中的变量


谢谢。操作系统不会直接处理变量


二,。不要将堆栈视为物理堆栈(原因过于简单:它不是物理堆栈)。堆栈的元素可以直接访问,编译器会生成执行此操作的代码。谷歌“堆栈指针相对寻址”。

I.操作系统不会直接处理变量

二,。不要将堆栈视为物理堆栈(原因过于简单:它不是物理堆栈)。堆栈的元素可以直接访问,编译器会生成执行此操作的代码。谷歌“堆栈指针相对寻址”。

在C等语言中使用的堆栈不是典型的后进先出。它被称为堆栈,因为它的使用方式类似于后进先出:当调用一个过程时,一个新的帧被推到堆栈上。框架通常包含局部变量和簿记信息,如返回到哪里。类似地,当一个过程返回时,它的帧从堆栈中弹出

这没什么神奇的。编译器(而不是操作系统)分配一个寄存器用作-让我们称之为
SP
。按照惯例,
SP
指向下一个空闲堆栈字的内存位置:

+----------------+ (high address)
|   argument 0   |
+----------------+
|   argument 1   |
+----------------+
| return address |
+----------------+
|    local 0     |
+----------------+
|    local 1     |
+----------------+                  +----+    
|    free slot   |  <-------------- | SP |
+----------------+ (low address)    +----+
其中符号
[SP]
被读取为“SP指向的存储单元的内容”。一些体系结构,特别是x86,提供了一条执行存储和减法的
push
指令。要弹出(并丢弃)堆栈上的n个顶部值,我们只需将n添加到
SP
*

现在,假设我们想要访问上面的
local0
字段。如果我们的CPU有一个寻址模式,那就很容易了!假设
SP
指向上图中的空闲插槽

 LOAD R0, [SP+2] ; load "local 0" into register R0
请注意,我们不需要首先从堆栈中弹出
local 0
,因为我们可以使用任何字段相对于堆栈指针的偏移量来引用它

根据编译器和机器架构的不同,可能会有另一个寄存器指向局部变量和参数之间的区域(或大约)。该寄存器(通常称为a)在堆栈指针移动时保持固定

我想强调一个事实,通常情况下,操作系统根本不参与堆栈操作。内核分配初始堆栈,并可能监视其增长,但将值的推送和弹出留给用户程序

*为简单起见,我假设机器字的大小为1字节,这就是为什么我们从SP中减去1。在32位机器上,将一个字推到堆栈上意味着减去(至少)4个字节。

在C等语言中使用的堆栈不是典型的后进先出。它被称为堆栈,因为它的使用方式类似于后进先出:当调用一个过程时,一个新的帧被推到堆栈上。框架通常包含局部变量和簿记信息,如返回到哪里。类似地,当一个过程返回时,它的帧从堆栈中弹出

这没什么神奇的。编译器(而不是操作系统)分配一个寄存器用作-让我们称之为
SP
。按照惯例,
SP
指向下一个空闲堆栈字的内存位置:

+----------------+ (high address)
|   argument 0   |
+----------------+
|   argument 1   |
+----------------+
| return address |
+----------------+
|    local 0     |
+----------------+
|    local 1     |
+----------------+                  +----+    
|    free slot   |  <-------------- | SP |
+----------------+ (low address)    +----+
其中符号
[SP]
被读取为“SP指向的存储单元的内容”。一些体系结构,特别是x86,提供了一条执行存储和减法的
push
指令。要弹出(并丢弃)堆栈上的n个顶部值,我们只需将n添加到
SP
*

现在,假设我们想要访问上面的
local0
字段。如果我们的CPU有一个寻址模式,那就很容易了!假设
SP
指向上图中的空闲插槽

 LOAD R0, [SP+2] ; load "local 0" into register R0
请注意,我们不需要首先从堆栈中弹出
local 0
,因为我们可以使用任何字段相对于堆栈指针的偏移量来引用它

根据编译器和机器架构的不同,可能会有另一个寄存器指向局部变量和参数之间的区域(或大约)。该寄存器(通常称为a)在堆栈指针移动时保持固定

我想强调一个事实,通常情况下,操作系统根本不参与堆栈操作。内核分配初始堆栈,并可能监视其增长,但将值的推送和弹出留给用户程序


*为简单起见,我假设机器字大小为1字节,这就是为什么我们从SP中减去1。在32位机器上,将一个字推到堆栈上意味着减去(至少)4个字节。

为什么要这样做?对于你的问题,可能还有另一个更好的解决办法。至少是后进先出法。你为什么要这样做?对于你的问题,可能还有另一个更好的解决办法,至少是后进先出法。