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

assembly - 我可以使用 rsp 作为通用寄存器吗?

有人告诉我,如果我将rsp其用作通用寄存器,操作系统可能会将寄存器转储到它在中断情况下指向的位置,从而导致有问题的行为。

这是真的吗,如果不是,如果我不需要堆栈,我可以rsp用作通用寄存器吗?

编辑:在用户空间中运行。

0 投票
1 回答
444 浏览

assembly - 递增 %esp 和 CDECL

我一直在阅读 x86 堆栈和 CDECL 约定,并阅读了一些让我感到困惑的东西。

列出的调用者的职责包括弹出参数、使用它们或简单地增加 %esp 以删除它们。

最后一部分是如何工作的?

例如,假设 %esp 的初始值为 0x105000,并且您将当前堆栈帧的值减少 $0x1c。您分配了一些数据,然后将其递增回来 - 在这种情况下,这些数据不会仍然在内存中浮动吗?内存是怎么清除的?访问 0x104FF4 会导致分段错误,如果是,是什么清除了那里的数据?

0 投票
2 回答
43974 浏览

assembly - push 和 pop 如何在装配中工作

我对pop组装中的实际作用感到困惑。是否pop将值ed 最后移到堆栈上(这意味着如果我们在最后一个元素 ed 之后的值PUSH不适用),或者它只是弹出堆栈上最后一个值(因此,同时适用于and ),或者确实它弹出堆栈指针指向的任何值?考虑以下代码:MOVPUSHMOVPUSH

那么在这段代码中,弹出的值ebp是 4、5,还是 指向的未知值esp

0 投票
4 回答
2837 浏览

assembly - 为什么调用函数时需要递减栈指针

我已经学习了一段时间的汇编,并且开始掌握它,但是我似乎无法理解的一件事是为什么我们需要递减堆栈指针以离开本地漫游变量,看看这段代码:(使用 64 位 GNU 编译器编译的代码,AT&T 语法)

在这个小程序中,我可以想象在不需要将 esp 递减 48 的情况下完成所有这些操作。我可以使用基指针将值从堆栈移入堆栈,并让 esp 指向准备弹出 ebp 的相同位置并返回。有人可以澄清为什么有必要为局部变量留出“空间”。谢谢!!如果这似乎是一个愚蠢的问题,我深表歉意

0 投票
3 回答
914 浏览

assembly - 使用 esp 寄存器

我试图了解如何将堆栈与程序集一起使用,并且在尝试中,我在 SO 中的一个问题中遇到了以下代码,即:

在这种情况下,ecx,持有一个数字,作者通过(如果我错了,请纠正我!)首先将堆栈指针移动到 ecx,然后通过将 48 添加到 ecx 所在的内存地址将数字转换为 ascii 字符是指点。他能通过“pop ecx”做同样的事情,然后转换成ascii吗?我不太明白作者为什么要这样写。任何帮助,将不胜感激。

0 投票
1 回答
64 浏览

c++ - 矢量、sfml 和“esp 的值未在函数调用中正确保存”错误

我有一个结构“Layer”和类“LayerHandler”。图层仅包含一个纹理、精灵和两个构造函数——一个是默认的,一个是带有参考参数的。LayerHandler 类是一个处理我们拥有的所有图层的绘制的类。我将图层添加到这个类,然后我使用 win.draw(layerhandler_object) 来绘制所有内容。LayerHandler 继承自 Drawable 来执行此操作,它覆盖了 virtual void draw()。

层处理程序.h:

层处理程序.cpp:

和 main.cpp:

我认为这并不复杂,而且我做的一切都很好,但是我得到了这个“ESP 的值没有在函数调用中正确保存”错误。我不知道为什么会收到此错误。我知道这可能是由不匹配的调用约定引起的,但我在我的代码中没有看到类似的东西......我不得不说这是我第一次遇到这个错误,我完全出局了想法如何处理它。有什么帮助吗?

0 投票
2 回答
1364 浏览

assembly - “add esp, 0FFFFFFF8h”的序言

我对我的 MASM 有点生疏,所以我真的不记得在这里做什么(如果有什么需要做的话)。我有一个如下所示的 MASM (X86) 例程。它有两个局部变量,总共占用 5 个字节:

当我检查拆卸时,我看到:

我相信add esp, 0FFFFFFF8h是另一种说法sub esp, 08h

正如 Joshua 指出的那样,anadd esp和之间的区别在于sub esp操作后的标志。汇编器的混淆或指令选择可能是基于汇编器没有看到RDRAND上下文的事实。相反,它只看到jmpbased on CY,并且汇编器认为标志状态不佳。

add为什么 MASM 会生成依赖于无符号整数换行的非直觉?更重要的是,它好吗?


我使用更广泛的机器字执行了到 MASM64/ML64 的路由端口。它产生相同的代码(模机器字长):

0 投票
2 回答
1849 浏览

assembly - 了解摩托罗拉 68k 中的用户与系统堆栈指针

我正在尝试以汇编语言(摩托罗拉 68k)了解堆栈的使用和实现。

我知道 MC 68k 有 8 个地址寄存器,A7 是特殊的。由于它是两个堆栈指针,因此共享“系统堆栈指针”的名称。

我们有两种状态用户状态和主管状态。在哪里:

supervisor state-

现在我不确定如何回答这两个问题:

为什么68000有两个硬件堆栈指针?

写代码到

  • 将寄存器 D1、D3、A2-A6 的长字值保存在运行时堆栈上。

    /li>

这是正确的吗?

在这里,我不确定所谓的“运行时堆栈”是什么,我不确定 (SP) 和 (A7) 的真正区别是什么。任何帮助将非常感激。

0 投票
0 回答
305 浏览

assembly - esp如何注册移动?

我有一段这样的代码:

我使用 gdb 来显示 ESP 寄存器的值以及它是如何通过在xxx(1234);c=b;line 处设置断点来工作的。

运行程序并在第一个断点处停止,使用i r espand x/x $esp。它表明 esp 指向例如:0xbbbbefff,并且该地址包含杂项值,例如:0xbb33bb33。继续到第二个断点,我重复上面的两个命令来检查地址 0xbbbbefff 的值,它显示 0x000004d2(十进制的 1234)。

我知道 ESP 指向堆栈的顶部,然后如果我们将一个值压入堆栈,它会移动到较低的地址并将该值放入该地址的内存中。例如,如果在第一个断点处 ESP 指向地址 0xbbbbefff,那么在第二个断点处,ESP 必须指向 0xbbbbefff-4=0xbbbbeffa 并包含 0x000004d2 ,而 0xbbbbefff 处的内存仍包含 0xbb33bb33 。但是我在 gdb 中看到 0xbbbbefff 中包含的 0x000004d2 值(调用 xxx 函数之前的上一个顶部堆栈)。

我对堆栈的理解有误吗?

0 投票
0 回答
47 浏览

function - C调用栈使用“ebp”访问变量,那么“esp”显得多余?

C 函数使用调用堆栈(堆栈帧)在函数调用之前/之后推送/弹出寄存器。如果 ebp 是用于访问堆栈上所有变量的帧指针,那么似乎 esp 是多余的?

那么为什么在函数调用的 prolog/epilog 中,我们同时操作 esp 和 ebp 呢?如果我只用一个寄存器来做这项工作,有什么不方便的地方吗?

谢谢。