问题标签 [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 回答
2825 浏览

linux - 为什么 %rbp 不指向任何内容?

%rsp指向栈帧的顶部,% rbp指向栈帧的底部。然后我不明白为什么 %rbp在这段代码中是 0x0 :

如果它没有指向任何东西,为什么它会“保存”(推送)%rbp到堆栈?

0 投票
2 回答
85 浏览

java - 扩展 ArrayList - 易碎基类

检查 Java 中的最佳实践,我们发现避免继承是一个很好的做法。原因之一可能在以下问题中得到说明:

这里我们有一个子类“Stack”扩展了“ArrayList”

假设我们要使用push()前面代码中定义的方法添加到堆栈中,然后我们要使用clear()基类 - 即 ArrayList-来清除堆栈

  • 这里的问题是

代码成功编译,但由于基类不知道堆栈指针的任何信息,因此 Stack 对象现在处于未定义状态。对 push() 的下一次调用将新项目放在索引 2 处(stack_pointer 的当前值),因此堆栈实际上包含三个元素 - 底部的两个是垃圾。

所以我的问题是,为什么

基类对堆栈指针一无所知

换句话说,堆栈指针的状态在哪里被保留?

来源:为什么扩展是邪恶的

0 投票
1 回答
5014 浏览

cpu-registers - 为什么堆栈帧中存在已保存的帧指针?

我读到 SFP 用于将 EBP 恢复到以前的值。为什么 EBP 需要回到它的初始值?

0 投票
1 回答
282 浏览

gcc - $sp 寄存器在函数开始时不变

链接到:如何获取调用堆栈回溯?(GCC,MIPS,无帧指针) 我通过使用汇编代码和用户堆栈迭代函数来重现调用堆栈(更多详细信息在上面的链接中)。我必须为每个函数找到以前的 $sp,大多数函数都以以下指令开头:

addiu sp, sp, -80

我可以很容易地从操作码中总结出之前的 $sp 。问题是我发现即使它们使用堆栈也永远不会更改 $sp 的函数,似乎调用此类函数的函数在堆栈上使用相同的激活帧,换句话说,永远不会更改 $sp。在这种情况下如何重现以前的 $sp ?

0 投票
5 回答
6575 浏览

c - 在C语言中,我可以通过堆栈指针访问另一个函数中主函数的局部变量吗?

我需要访问在 main 函数中定义的变量 a 的值,而不将其作为参数传递。

我怎样才能做到这一点?

0 投票
1 回答
667 浏览

debugging - Windbg 上的“dds esp”

我不确定我是否正确理解了原始输出dds esp或其 64 位对应项dqs rsp。当我看到堆栈中的条目列表时,我倾向于假设无论我在哪里看到返回地址,这些都是由尚未返回的代码进行的调用。IOW,将它们串在一起应该形成一个很好的调用堆栈。(让我们暂时不要打扰k*Windbg 命令组。)情况并非总是如此吗?

因为有一些第三方扩展,它们对 esp/rsp 输出进行操作,并将条目串在一起,形成看起来像调用堆栈的东西,但我似乎无法将该顺序与我在源代码中看到的相匹配(嗯,无论我有什么来源。)甚至还有很久以前返回的函数条目。

我错过了什么?

更新:

好的——我使用的第三方扩展确实说:

Dumps (dps) from the stack limit the base only showing items that include the ! followed by +0x

那么,问题就变成了那个条目是什么?我以为是某个函数的返回地址正在修复以调用另一个函数?

0 投票
3 回答
2414 浏览

assembly - 在 x86 程序集的过程中调用 ret 指令的位置是否重要

我目前正在学习 x86 汇编。但是,在将堆栈用于函数调用时,我仍然不清楚。我知道调用指令将涉及将返回地址压入堆栈,然后将程序计数器加载到要调用的函数的地址。ret 指令将该地址加载回程序计数器。

我的困惑是,在过程/函数中调用 ret 指令是否重要?它会始终找到存储在堆栈中的正确返回地址,还是堆栈指针当前必须指向存储返回地址的位置?如果是这样,我们不能只使用 push 和 pop 而不是 call 和 ret 吗?

例如,下面的代码可能是第一个进入函数的代码,如果我们将不同的寄存器压入堆栈,则必须仅在寄存器以相反的顺序弹出后调用 ret 指令,以便在 pop %ebp 指令之后,堆栈指针将指向返回地址所在的堆栈上的正确位置,还是无论在哪里调用它都会找到它?提前致谢

0 投票
3 回答
694 浏览

pointers - 使用 avr 编译汇编程序

为什么我们需要在AVR汇编编程的程序开始时初始化堆栈指针

必须点击链接

0 投票
1 回答
1161 浏览

assembly - x86-CPU 上的堆栈指针到底指向哪里(!)?到顶部元素还是在它后面?

在一些教程中,据说堆栈指针指向堆栈的顶部元素:

在其他情况下,据说它指向它的右侧,因此指向当堆栈增长时可以写入的第一个内存地址。

在这个德国维基百科网站 https://de.wikipedia.org/wiki/Register_(Computer)#Stapelregister 上,据说这两个版本都存在并且它取决于 CPU 架构。

我的问题是,它在 x86-CPU 上怎么样?它还取决于操作系统吗?

0 投票
1 回答
4554 浏览

assembly - x86 程序集:弹出一个值而不存储它

在 x86 汇编中,是否可以从堆栈中删除一个值而不存储它?类似的东西pop word null?我显然可以使用add esp,4,但也许我缺少一个漂亮而干净的 cisc 助记符?