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

assembly - x86 堆栈指针指向哪里?

例如,如果我推 ax 是 [SP] 指向我的 ax 值还是 ax 后面的单词?它也不同于实模式和保护模式吗?我问这个是因为汇编艺术书说明并解释了 sp 指向最后推送的数据,并且在此页面上OSDev Wiki - Stack它说明了它指向最后推送数据后的空字。

0 投票
2 回答
15953 浏览

assembly - pushl/popl %esp 的汇编级表示是什么?

我试图了解推送和弹出堆栈指针寄存器的行为。在美国电话电报公司:

请注意,它们将计算值存储回%esp.

我正在独立考虑这些指令,而不是按顺序考虑。我知道存储在其中的值%esp始终是递增/递减之前的值,但我怎么能用汇编语言来表示行为呢?到目前为止,这是我想出的。

对于pushl %esp(忽略 FLAGS 和对临时寄存器的影响):

对于popl %esp

它是否正确?如果没有,我哪里错了?

0 投票
4 回答
818 浏览

x86 - How does the stack pointer register work

Well, how does the stack work? For example the instruction:

is equal to:

where sp is a stack pointer. Is that right?

My question is - what's the point of subtracting 4 from the sp register if a moment later I change it to the whole different value?

0 投票
1 回答
414 浏览

c++ - Boost 异常导致堆栈指针损坏(运行时检查失败 #0 ...)

在一个小项目中,我使用了几个 boost 包(asio、property_tree、文件系统等),我不得不注意到,一切正常,直到在 boost 包中的某个地方抛出异常。它发生在所有这些包中,但我现在能够将其归结为以下最小程序:

异常抛出正常,但是当程序终止时我得到

我尝试对此进行调试(我在 Visual Studio 2010 Express 中使用 boost 1.49.0,crt 静态链接)但是当所有可见代码都已执行时出现问题。我可以看到 std:exception 析构函数没有通过,但在那之后(“在”我的程序的 return 语句中)消息框被触发。

编辑:一些附加信息:

  • 在上面的最小程序中,boost 仅用于 headers
  • 不涉及其他库文件
  • 程序只加载ntdll.dll和kernel32.dll
  • 没有创建额外的线程
  • 当我动态链接到 CRT 时,问题也出现了

EDIT2:再次更多信息:

  • 在上面的程序中添加了包含
  • 问题也出现了,当我抛出 runtime_error 时
  • 当我用 (...) 或 (std::exception) 捕获异常时,问题就消失了
  • 当我重新抛出异常时,问题甚至仍然得到解决
0 投票
2 回答
9766 浏览

assembly - x64 程序集中的堆栈对齐

如何从以下计算中28h减去(十进制 40)的值:rsp

来自:http ://www.japheth.de/JWasm/Win64_1.html

据我了解,我只需要减去20h,因为我使用的每个值都需要 8 个字节到 4 is 20h。那么为什么28h要减去,这如何导致 16 字节对齐?

另请参阅是否需要为少于四个参数的函数保留堆栈空间?

0 投票
2 回答
4052 浏览

x86 - 我可以从堆栈中弹出一个值,但把它放在 NASM 组装中的任何地方吗?

NASM 程序集,Ubuntu,32 位程序。

通常,当从堆栈中弹出一个值时,我会这样做

写入寄存器或变量。但有时,我根本不想把它放在任何地方——我只想摆脱堆栈中的下一个元素。正在做

就这样行不通。

我有一个解决方法是制作一个我根本不使用的 4 字节变量并将其转储POP到其中。有没有更好的方法来实现这一目标?

0 投票
2 回答
449 浏览

c++ - 为什么编译器只为 int 保留 0x10 位?

我有以下代码:

我使用 编译它g++,然后使用反汇编它objdump -Mintel -d,我得到以下主要功能:

现在,堆栈中的保留空间是 16 位(0x10,在第 8048739 行),而 int 是(在我的机器上)32 位。这不可能是因为优化,因为数字 0x123456 不适合 16 位。那么为什么编译器没有预留足够的空间呢?

0 投票
8 回答
50290 浏览

c - 打印堆栈指针的值

如何在 Linux(Debian 和 Ubuntu)中打印出 C 中堆栈指针的当前值?

我尝试了谷歌但没有找到任何结果。

0 投票
2 回答
122 浏览

assembly - 平衡堆栈

如果我像这样设置堆栈

我需要吗

或仅

?

0 投票
1 回答
166 浏览

x86 - 将 esp 作为 32 位操作系统上的变量的参考,而 rbp 在英特尔机器上的 64 位操作系统上的原因?

下面的程序在 32 位和 64 位机器上给出不同的输出。当我检查编译器生成的汇编代码时,我发现 32 位机器上的变量引用是 esp,而在 64 位操作系统上它是 rbp。

在我看来,ebp 必须是变量的参考,因为它在一个函数中保持不变。

不使用 ebp 作为变量的参考是否有任何具体原因?

在 64 位操作系统上,这两行打印了 6 次

在 32 位操作系统上无限次(直到它幸运地得到 0)打印两行,因为 eax 是对变量的引用。