问题标签 [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 投票
5 回答
6855 浏览

c++ - 函数调用跳转到错误的函数

我正在 vs2008 中编译一个 c++ 静态库,在解决方案中我还有一个使用该库的启动项目,并且工作正常。

但是当在另一个解决方案中使用该库时,我会遇到运行时检查失败。“ESP 的值没有在函数调用中正确保存” 单步执行代码时,我注意到函数 foo() 在崩溃之前跳转到 bar()。有问题的函数只是常规函数,没有函数指针。

任何人都有任何线索可能会发生什么,以及为什么在使用同一解决方案中的库时它会起作用?

编辑:函数(方法)是类的一部分,如果有帮助的话。

0 投票
1 回答
741 浏览

c - 如何更改处理器堆栈?

为什么这段代码不打印“测试”?

0 投票
7 回答
221799 浏览

c - 基指针和栈指针到底是什么?他们指向什么?

使用来自维基百科的这个例子,其中 DrawSquare() 调用 DrawLine(),

替代文字

(请注意,此图底部的高地址和顶部的低地址。)

谁能解释我在这种情况下是什么ebp和是什么?esp

从我所看到的,我会说堆栈指针总是指向堆栈的顶部,而基指针指向当前函数的开头?要不然是啥?


编辑:我的意思是在 Windows 程序的上下文中

编辑2:以及如何eip工作呢?

edit3:我有以下来自 MSVC++ 的代码:

它们似乎都是双字,因此每个占用 4 个字节。所以我可以看到从 hInstance 到 var_4 的差距为 4 个字节。这些是什么?我假设它是返回地址,如维基百科的图片所示?


(编者注:从迈克尔的回答中删除了一个不属于问题的长引用,但编辑了一个后续问题):

这是因为函数调用的流程是:

我的问题(最后,我希望!)现在是,从我弹出要调用的函数的参数到序言结尾的那一刻到底发生了什么?我想知道 ebp,esp 在那些时刻是如何演变的(我已经了解了 prolog 的工作原理,我只想知道在我将参数推送到堆栈之后和 prolog 之前发生了什么)。

0 投票
4 回答
528 浏览

c++ - 在 C++ (VS2005) 中使用多重继承时 ESP 无效

我一直在制作一个使用 Box2D 物理引擎的游戏,但我在堆栈指针 (ESP) 和多重继承方面遇到了一些奇怪的事情。我已经设法用最少的代码重现了它,而且似乎我声明要在多重继承中使用的类的顺序似乎决定了程序是否崩溃。

在调试模式下运行它会导致以下错误

运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是调用使用一种调用约定声明的函数和使用另一种调用约定声明的函数指针的结果。

当我进入以下代码行时:

我注意到它会进入 CScoreZone::OnAttach,而不是 CScoreZone::Collide。为什么是这样?当我更改 CScoreZone 的继承顺序时,它工作正常

我在 Windows XP 上运行 VS2005 SP2 (8.0.50727.768)。有任何想法吗?

0 投票
3 回答
15021 浏览

assembly - ret 指令是否将 4 添加到 esp 寄存器?

ret该指令是否会导致“esp”寄存器增加 4?

0 投票
5 回答
364328 浏览

assembly - x86汇编中寄存器上使用的push/pop指令的功能是什么?

在阅读有关汇编程序的信息时,我经常遇到有人写他们推送处理器的某个寄存器并稍后再次弹出它以恢复它的先前状态。

  • 你怎么能推送一个寄存器?推到哪里去了?为什么需要这个?
  • 这归结为单个处理器指令还是更复杂?
0 投票
1 回答
652 浏览

c++ - 嵌入式 asm 代码中的运行时检查失败 #0

我对汇编程序有点陌生,但我正在尝试esp使用嵌入式汇编程序代码从堆栈中的 C++ 方法中查找参数。到目前为止,我什至无法将esp指针复制到,ebp因此我可以保留堆栈(以防它发生变化)。即使是这段小代码也让我失败了:

运行此程序后,我得到:

运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是调用使用一种调用约定声明的函数和使用另一种调用约定声明的函数指针的结果。

不知道该怎么办。请帮助我,并在此先感谢。

0 投票
3 回答
15811 浏览

assembly - pop or add esp, 4 ? What is the difference?

I saw this question, but I didn't find my answer in it..

So, why would I prefer to use add esp, 4 or add esp, 8 instead of using pop one or two times? Is there any difference (performance, safety, etc.) at all or it's a matter of personal choice?

0 投票
1 回答
289 浏览

x86-16 - 在 8086 汇编中使用什么寄存器代替 FP(帧指针)?

8086 汇编中使用什么寄存器而不是 FP?我认为它是SP或ESP。我对吗?

0 投票
1 回答
197 浏览

c++ - ESP 调用约定问题 C++

对于家庭作业,我应该阅读一个文件并对字符串进行排序。为此,我使用了选择排序并且它有效。现在,在它调用 selSort 函数之后,它就崩溃了。我已经没有解决这个问题的想法了,谁能帮帮我?