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

stack - Mips 堆栈指针无法到达下一个堆栈值

我正在尝试在 mars 中执行一个程序,该程序使用 $sp 可以跳转到堆栈的下一个地址并读取值:

这只是一个来源,因为还有另一个操作(我有一个数字序列并将其保存到堆栈中),问题是在我跳转到下一个堆栈地址以达到下一个数字时 mips 说这个单元格等于零,但为什么呢?在牢房里有一个我分配的号码,对吗?但它就像是空的,为什么?谢谢你

0 投票
1 回答
800 浏览

assembly - ASM x86 中的长除法

我正在编写一个 ASM 程序,它将两个数字相除并计算 20 位小数。我的策略是用长除法计算下一个数字并将它们推入堆栈。然后获取堆栈指针,从中减去 20 位 * 8 位并从该地址写入数字,然后将 8 添加到该地址,写入该数字等。但是当我尝试它只写出零时。数字在堆栈上,因为我尝试只是“弹出”它们并且效果很好。我只需要按照它们被推动的顺序弹出它们,而不是颠倒。

我的代码:

0 投票
1 回答
919 浏览

c - 使用“jmp *%esp”时操作数类型不匹配

我的代码中有这个片段

使用 gcc 编译时

我得到这个错误。

尽管汇编指令有效,为什么这一行无法编译?

我读过 DEP(数据执行保护)。会不会是这个功能造成了这个编译错误?如果是这样,如何禁用它?

0 投票
1 回答
572 浏览

embedded - 中断/堆栈指针/PIC微控制器

我目前正在使用 PIC16F1829 微控制器。但是,我被困在中断例程适当的执行方法上。我希望中断例程退出所有函数(LED 动画)中的无限循环,这些函数在 main() 超级循环中被列为不同的开关情况。我应该使用函数在检测到中断标志后检查并更改它的全局变量,还是我可以为此目的使用堆栈指针?我目前使用堆栈指针操作编写了 ISR,但是请告诉我这是否是好方法?

0 投票
1 回答
541 浏览

c - 堆栈指针指向保留的内存

我正在调试来自 Infineon(参考汇编语言)的 Tricore TC275 上的加密实现代码。

在调用 mac 函数后,堆栈指针a[10]始终指向保留的内存区域。

0x9C0 = 2496 (base10)并且数组 accum 的长度是624,每个元素包含一个int32_t. 因此624*4 = 2496 Bytes得到分配还是什么?

但是在内存中的这个地址上,就我理解给链接器的内存映射而言,不允许写入......但是生成的汇编代码试图在第 5 行执行?

有人知道我在这里可能做错了什么吗?我还尝试使用 calloc 在堆上分配内存(而不是像上面的代码那样的堆栈,对吗?)但程序仍然崩溃。

我还将该行复制dslimb_t accum[2*DIGITS] = {0}到程序的开头,它在没有错误的情况下执行。

非常感谢您的帮助!

编辑

mac 就是这样调用的,uniform 采样一些统一的随机数

此代码在我的主机上运行,​​但在我的三核微控制器上,它在第一个 mac() 函数调用中失败。

0 投票
2 回答
7966 浏览

arm - 堆栈指针和程序计数器有什么区别?

众所周知,微处理器执行任务的过程只是从内存中逐条执行二进制指令,并且有一个程序计数器保存下一条指令的地址。因此,如果我没记错的话,这就是处理器执行其任务的方式。但是还有另一个名为 Stack Pointer 的指针,它的作用与程序计数器几乎相同。我的问题是为什么我们需要一个堆栈指针来指向内存(堆栈)的地址?有人可以告诉我堆栈指针和程序计数器之间的主要区别吗?

0 投票
1 回答
2429 浏览

arm - 在 ARM Cortex-M、MSP 或 PSP 中,哪个堆栈用于复位?

我一直在阅读 ARM 信息中心的各个部分以尝试找到我的答案,但是我发现文档让我感到困惑,所以我希望这里有人可以提供帮助。

我了解 Cortex-M 处理器中有两个堆栈:

  • MSP(主堆栈指针)
  • PSP(进程堆栈指针)

我试图弄清楚ARM内核如何使用每一个。

在讨论 Cortex-M3 时,ARM 信息中心中的文档说明如下:

主堆栈在复位时使用,并且始终在处理程序模式下使用(进入异常处理程序时)。进程堆栈指针仅在线程模式下作为当前堆栈指针可用。

好的,这告诉我在重置时使用了 MSP。但是,该文档还指出以下内容:

线程模式

用于执行应用软件。处理器退出复位后进入线程模式。

处理程序模式

用于处理异常。处理器在完成所有异常处理后返回线程模式。

好的,这就是让我感到困惑的地方。如果MSP在reset时使用,并且一直在Handler模​​式下使用,而PSP在Thread模式下使用,那么如果处理器在reset时处于Thread模式,如何在reset时使用MSP呢?

0 投票
0 回答
332 浏览

c - 内核态修改用户栈指针

我正在编写一个 char 设备,它使用 ioctl 函数指针和缓冲区指针作为输入。
我想修改用户机器上下文,以便回到用户模式,使用该缓冲区指针指向的新堆栈执行该函数。

我所做的如下:

好消息是函数被激活了,坏消息是堆栈是一样的(我用gdb测试过)。
特别是即使:regs->sp = 0;新函数在它应该崩溃时执行,因为它应该没有堆栈。
用这种方式分配堆栈指针似乎是无效的。

为什么?我应该如何正确分配堆栈指针?

linux内核版本为:3.18.106,在Virtual Box上执行。

0 投票
0 回答
75 浏览

c - 如果堆栈指针被重新分配,为什么 ASLR 会生成 SIGSEV

我正在编写一个 char 设备,它使用 ioctl 函数指针和缓冲区指针作为输入。
我想修改用户机器上下文,以便回到用户模式,使用该缓冲区指针指向的新堆栈执行该函数。
但是,如果程序在激活 ASLR 的情况下运行,则分段错误会终止程序,否则没有问题。
这是代码中有趣的部分ioctl

我的问题是为什么会发生这种情况:ASLR 每次执行时都会更改程序的虚拟地址空间,但是这种随机化如何在随后重新分配堆栈指针时产生问题?

内核版本为 4.14.68

0 投票
5 回答
1317 浏览

windows - 写在ESP下面是否有效?

对于 32 位 Windows 应用程序,在不显式减少 ESP 的情况下使用 ESP 下方的堆栈内存作为临时交换空间是否有效?

考虑一个返回浮点值的函数ST(0)。例如,如果我们的值当前在 EAX 中,我们将

或者不修改 ESP 寄存器,我们可以:

在这两种情况下都会发生同样的事情,除了在第一种情况下,我们注意在使用内存之前递减堆栈指针,然后再递增它。在后一种情况下,我们不这样做。

尽管确实需要将此值保留在堆栈上(重入问题、在PUSHing 和读回值之间的函数调用等),但是否有任何根本原因导致像这样写入 ESP 下方的堆栈无效?