问题标签 [stack-pointer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
85 浏览

stack - 是否有可能使用堆栈指针在 llvm 堆栈上定位/索引局部变量?

我正在尝试修改 llvm X86 后端以使用 rsp 来定位/索引局部变量而不是 rbp。问题是局部变量和rsp的偏移量不固定,只能自己计算。如果通过这些指令修改了 rsp 的位置,则很容易处理,如下所示:

在这些情况下,我可以在编译时知道偏移量。但现在我陷入了一个问题。我发现 rsp 不仅被前面提到的这些指令所修改。例如:

该指令将像这样修改 rsp ,我不知道编译时的偏移量。

是否可以使用 llvm 生成使用堆栈指针定位局部变量的执行文件?

0 投票
2 回答
224 浏览

c - 如果变量离开作用域,为什么 C 不递减堆栈指针?

我认为运行它会两次输出相同的东西。当它声明第一个变量时,它会增加堆栈指针,然后离开范围,因此它会减少它,然后第二次重复该过程,因此两次int x都会占用堆栈上的相同内存位置。

但事实并非如此。堆栈指针不会递减,并且int x在这两种情况下都占用堆栈中的不同位置。事实上,第一个int x仍然可以到达,即使它的范围已经消失了。

为什么是这样?我有什么误解?

0 投票
1 回答
172 浏览

assembly - 为什么在移动堆栈指针时出现分段错误?

使用汇编代码并想知道为什么指令 subl $8, %esp 出现段错误?

subl $8 上的段错误,%esp

0 投票
1 回答
208 浏览

c++ - 为什么我们在这里将 0 添加到双 void 指针?

对于上下文,这是从应该引导到主应用程序的引导加载程序调用的代码。此片段来自一个函数,该函数带有一个参数,该参数uintptr_t address指定了主应用程序的写入地址。我相信sppc分别是堆栈指针和程序计数器。

这是代码:

完整的上下文在这里

然后我去打印了地址、sp和pc,发现如下:

这让我很困惑。我不确定为什么这sp条线有一个+ 0。该sp行是否可以重写为:

并做同样的事情?

我的理解是该地址已被静态转换为双空指针,然后sp被赋予地址的取消引用值(0x08010000),pc并被赋予地址的取消引用值(0x08010001)。然后,在我的 printf 语句中,显示的这些值是这些地址的取消引用值。

我的理解在这里正确吗?

0 投票
0 回答
115 浏览

c - 汇编中的堆栈指针

我有一个 C 练习从程序集中调用一个函数。“计算三角形的周长”。

我这里有一个汇编代码

我知道“a”将放入 [HL]。但我不知道为什么 b 存储在 [HL+8] 中。谁能帮助我*我正在使用 RL78G14 瑞萨和 cubesuit+ 编译器

0 投票
0 回答
157 浏览

c++ - 如何调试 arm 二进制文件中的“stp”指令上发生的分段错误?

我的应用程序随机且很少因分段错误信号而崩溃。当在 GDB 中打开 coredump 时,可以看到以下内容:

  • 导致崩溃的 arm 指令是:

    0x7f8ea08130 fd 7b b7 a9 stp x29, x30, [sp,#-144]!

  • 当在 GDB 中浏览崩溃帧的代码时,断点在打开函数的花括号时停止:
  • 检查“sp”寄存器给出以下输出:
  • 堆栈跟踪似乎很好并且没有损坏
  • 堆栈中大约有 300 帧,堆栈大小限制设置为 8192K

UPD:系统中的pagesize为4k:

我还能检查什么来调试这个问题?

0 投票
0 回答
155 浏览

c - __libc_init_array 在设置堆栈指针之前使用堆栈指针进行写入

问题:当我使用 GCC 为裸机 RISC-V 环境编译 C 程序时,该函数__libc_init_array在设置堆栈指针之前使用堆栈指针写入内存。堆栈指针设置在还初始化寄存器的汇编文件中。

如果使用该参数,则该__libc_init_array函数不包含在创建的二进制文件中-nostartfiles,但这会导致某些程序停止工作(我不知道究竟是什么问题,但我想避免修改程序)。

据我了解,导致问题的函数初始化了一些内存,并且当时有一种方法可以使用__attribute__eg执行代码void __attribute__ ((constructor)) premain()。这不是我尝试过的确切功能,但我现在找不到其他功能。尽管如此,在__libc_init_array.

似乎有一种方法可以设置初始化优先级,但这仅适用于 C++,例如Some_Class A __attribute__ ((init_priority (2000)));

我也使用参数-pedantic-ffreestanding.

任何帮助是极大的赞赏!

0 投票
2 回答
137 浏览

assembly - RISC-V ISA 中的任何假设阻止堆栈增长而不是下降?

我想知道 ISA 中的任何内容是否会使堆栈长大(push 增加 sp,pop 减少它)性能降低或以其他方式不明智?我知道这不是当今工具的工作方式,包括 Linux 和 GCC 端口,但是除了“这将是一个疯狂的工作量”之外,还有什么根本原因吗?

0 投票
0 回答
264 浏览

assembly - x86 或类似程序集中的内存分配

背景:我正在设计自己的处理器和指令集作为学习练习。

我试图了解低级汇编程序如何知道它可以访问哪些内存地址。即使我们假设我们在没有虚拟内存或操作系统保护的情况下运行并且所有 RAM 都是可自由写入的,我们必须确保我们不会意外覆盖我们自己的指令,因为它操作的程序数据存储在相同的地址空间。

正如我所看到的,我们在这个级别上有三种类型的内存。

  • 静态内存:这将在汇编程序的 DATA 部分中以符号方式声明。不知何故,这被神奇地转化为可用的地址。
  • 堆栈内存:一旦设置了堆栈寄存器,我们就可以愉快地 push 和 pop。但是我们怎么知道最初把栈底放在哪里呢?
  • 堆内存:用户模式程序将通过系统调用请求这个,操作系统将处理所有困难的事情。我们只是在返回值中得到一个地址并使用它。但是,如果我们正在编写内核而不是用户模式程序,则不存在这样的概念。

我的问题归结为以下几点:

  1. 静态数据声明如何以及何时转换为实际地址?
  2. 对于将由操作系统加载的用户模式程序,它如何知道将堆栈放在哪里?
  3. 对于作为操作系统的内核模式程序,如何知道可以将哪些内存用于内核数据结构、分配给进程等?所有东西都必须预先声明为静态的吗?

随意给出任何架构/操作系统实现的例子,我只是想弄清楚这到底是怎么可能的。

0 投票
0 回答
103 浏览

assembly - 如果没有它仍然可以工作,我是否需要在 NASM 汇编函数中添加行 'mov ebp, esp'?

在我的一个类示例中,一个接收 int 参数整数的函数开始如下:

但在另一个类示例中,一个接收 int 参数num的函数开始如下:

在什么情况下需要mov ebp, esp指令?请用C、java或举例说明。而且我不是在寻找 ESP 寄存器的基本定义