问题标签 [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.
pointers - 为什么ESP引用堆栈中的地址每次跳转4h?
为什么扩展堆栈指针 (ESP) 在每个 PUSH 或 POP 操作中不跳转 1h?
c - 在 Mac OS X Lion 上获取 C 中的堆栈指针
在尝试获取 C 中的当前堆栈指针(使用内联 ASM)时,我遇到了一些奇怪的行为。代码如下所示:
如果我使用标准 gcc 选项编译代码:
它生成以下程序集:
如果我运行生成的二进制文件,它会因 SIGILL(非法指令)而崩溃。但是,如果我在编译中添加一些优化:
生成的程序集要简单得多:
并且代码运行良好。那么问题来了;是否有更稳定的方法可以从 Mac OS X 上的 C 代码中获取堆栈指针?相同的代码在 Linux 上没有问题。
assembly - 如何阻止 ESP 在 __fastcall 中损坏?
我试图在汇编中编写一个函数,将一块内存设置为指定值,就像 memset(),但是,当我从堆栈中取出第三个参数时(它使用 fastcall 调用约定),寄存器 ECX 得到一些乱码值。
通过使用内联汇编将代码放入 Visual Studio,我看到调用函数时 ESP 发生了显着变化。前两个参数被放入 ECX 和 EDX 没有任何问题,只是第三个引起了麻烦。
我知道代码有效,当我在 VS 中调试时手动设置寄存器中的值时,内存块填充了正确的值。
我对汇编比较陌生,所以我的代码可能有点狡猾,但有人知道如何解决这个问题吗?
代码如下:
assembly - ESP寄存器和SS寄存器有什么区别?
我只是汇编语言的初学者。据我所知,ESP 和 SS 都指的是堆栈寄存器,但不太了解它们之间的区别。
windows - ESP 的值未正确保存....和 C/C++ 调用约定
我正在使用 OpenCV 库、Boost 库和我从这个LINK下载的一段代码编写一个应用程序。我已经在与 Thunk32 相同的解决方案下创建了一个项目,并且我有以下文件:
主项目.cpp
窗口.h
和Window.cpp
现在,当我运行它时,如果我不在窗口内移动鼠标,没关系,回调已成功传递给 cvSetMouseCallback 函数。cvSetMouseCallback 函数有三个参数 1. 窗口名称, 2. CvMouseCallback 和 NULL 字符。CvMouseCallback 定义为
而 CV_CDECL 只是 _cdecl 调用约定的重新定义。
现在,我的 mouseHandler 函数是一个类成员函数,我假设它符合 _thiscall 调用约定。
我的问题是,当我将鼠标放在窗口上时,如果它至少成功进入该方法一次,为什么会出现以下错误?我猜我的鼠标在窗口内移动的第二个瞬间就会发生变化。任何人都可以帮助我吗?
这是我正在做的图像:
c - 这种用于堆栈切换的 inline-asm 方法可以吗?
对于某些功能,我需要切换堆栈以使原始堆栈保持不变。为此,我编写了两个宏,如下所示。
这里temp_sp和saved_sp是线程局部变量。temp_sp指向我们使用的临时堆栈。对于我想要不修改其原始堆栈的函数,我将 SAVE_STACK 放在开头,将 RESTORE_STACK 放在底部。例如,像这样。
现在我的问题是这种方法是否可行。在 x86(64 位)上,通过rbp寄存器访问局部变量和参数,并在函数序言中相应地减去rsp,直到在函数尾声中添加它以使其恢复到原始值时才被触及。因此,我认为这里没有问题。
我不确定,如果这在上下文切换和信号存在的情况下是正确的。(在 Linux 上)。此外,如果函数是内联的,或者是否应用了尾调用优化(使用jmp而不是call ) ,我也不确定这是否正确。你觉得这种方法有什么问题或副作用吗?
assembly - 为什么“push ebp”会改变ebp的值?
我有一个简单的代码:
我省略了 func2 和 main 的实现,因为它们无关紧要。然后我用windbg来跟踪汇编,下面是执行“func2()”时汇编代码的输出:
我们可以看到,在执行push ebp之前,esp = 0012fe98, and ebp=0012ff68,但是执行完push ebp之后,esp=0012fdc8, ebp=0012fe94?,所以我有两个问题: 1. 大概push代码应该只影响esp,为什么ebp也改变了?2. 推测push ebp 会push 4 bytes 入栈,所以esp 的值应该减少4,但是我们看到这里esp 的值减少了208 bytes?为什么?
assembly - 基指针和栈指针
鉴于这段代码:
(这只是方法。之前我们将第一个和第二个参数压入堆栈。)
我的问题是:为什么我们将 8 添加到 Base Pointer 以获取第一个参数的地址,然后 12 ?
我知道它们是双字,所以它们每个都是 4 个字节..所以从 ebp + 8 到 ebp + 12 是有意义的。但是为什么第一个是 ebp + 8 ?因为如果ESP指向栈顶,mov ebp,esp表示EBP指向栈顶。然后我们将 4 个值压入堆栈:eax、ebx、ecx 和 edx。为什么 EBP + 8 指向第一个参数?
assembly - 为什么在使用 PUSH 或 POP 指令时不鼓励使用 ESP 寄存器?
我正在查看 C 代码,其中我必须找出在特定程序跟踪中使用的寄存器数量。每当遇到推送或弹出命令时,代码都会忽略存储 ESP 寄存器。我还提到了 X86 指令,它写在那里“ESP,堆栈指针,不应该使用”。为什么?
assembly - 为什么在这个函数的代码的序言中从堆栈指针中减去 0x20?
汇编代码:
我知道按 16 字节对齐,
但是在 main() 中,int c(=4 byte) + 1(4byte) + 2(4byte) in function(1 ,2)
调用语句。
所以总和是12字节。但通过内存对齐,我认为是 16 字节。
为什么要分0x20, %esp
?