问题标签 [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.
assembly - x86 堆栈指针指向哪里?
例如,如果我推 ax 是 [SP] 指向我的 ax 值还是 ax 后面的单词?它也不同于实模式和保护模式吗?我问这个是因为汇编艺术书说明并解释了 sp 指向最后推送的数据,并且在此页面上OSDev Wiki - Stack它说明了它指向最后推送数据后的空字。
assembly - pushl/popl %esp 的汇编级表示是什么?
我试图了解推送和弹出堆栈指针寄存器的行为。在美国电话电报公司:
和
请注意,它们将计算值存储回%esp
.
我正在独立考虑这些指令,而不是按顺序考虑。我知道存储在其中的值%esp
始终是递增/递减之前的值,但我怎么能用汇编语言来表示行为呢?到目前为止,这是我想出的。
对于pushl %esp
(忽略 FLAGS 和对临时寄存器的影响):
对于popl %esp
:
它是否正确?如果没有,我哪里错了?
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?
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) 捕获异常时,问题就消失了
- 当我重新抛出异常时,问题甚至仍然得到解决
assembly - x64 程序集中的堆栈对齐
如何从以下计算中28h
减去(十进制 40)的值:rsp
来自:http ://www.japheth.de/JWasm/Win64_1.html
据我了解,我只需要减去20h
,因为我使用的每个值都需要 8 个字节到 4 is 20h
。那么为什么28h
要减去,这如何导致 16 字节对齐?
x86 - 我可以从堆栈中弹出一个值,但把它放在 NASM 组装中的任何地方吗?
NASM 程序集,Ubuntu,32 位程序。
通常,当从堆栈中弹出一个值时,我会这样做
写入寄存器或变量。但有时,我根本不想把它放在任何地方——我只想摆脱堆栈中的下一个元素。正在做
就这样行不通。
我有一个解决方法是制作一个我根本不使用的 4 字节变量并将其转储POP
到其中。有没有更好的方法来实现这一目标?
c++ - 为什么编译器只为 int 保留 0x10 位?
我有以下代码:
我使用 编译它g++
,然后使用反汇编它objdump -Mintel -d
,我得到以下主要功能:
现在,堆栈中的保留空间是 16 位(0x10,在第 8048739 行),而 int 是(在我的机器上)32 位。这不可能是因为优化,因为数字 0x123456 不适合 16 位。那么为什么编译器没有预留足够的空间呢?
c - 打印堆栈指针的值
如何在 Linux(Debian 和 Ubuntu)中打印出 C 中堆栈指针的当前值?
我尝试了谷歌但没有找到任何结果。
assembly - 平衡堆栈
如果我像这样设置堆栈
我需要吗
或仅
?
x86 - 将 esp 作为 32 位操作系统上的变量的参考,而 rbp 在英特尔机器上的 64 位操作系统上的原因?
下面的程序在 32 位和 64 位机器上给出不同的输出。当我检查编译器生成的汇编代码时,我发现 32 位机器上的变量引用是 esp,而在 64 位操作系统上它是 rbp。
在我看来,ebp 必须是变量的参考,因为它在一个函数中保持不变。
不使用 ebp 作为变量的参考是否有任何具体原因?
在 64 位操作系统上,这两行打印了 6 次
在 32 位操作系统上无限次(直到它幸运地得到 0)打印两行,因为 eax 是对变量的引用。