问题标签 [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.
c - 将 C 代码转换为 MIPS 程序集 - 使用递归的组合函数
我在将 C 代码转换为组合函数 (nCr) 的 MIPS 汇编代码时遇到问题。
nCr = (n-1Cr-1) + (n-1Cr)
当我将 int 5 用于 n 并将 3 用于 r (数字数据)时,结果必须为 10。
我想使用递归和堆栈指针,但堆栈溢出时出现错误。
我在下面有我的 MIPS 代码。
我的代码有什么问题?
我无法很好地识别问题...
linux - 在linux中,用户模式堆栈存储在哪里?
我知道内核模式堆栈与 task_struct 结构的 thread_info 结构一起存储。但是用户模式堆栈存储在哪里。我想,它将作为内存区域存储在进程地址空间中,因为在页面错误期间内核会检查错误是否是由于用户堆栈扩展造成的。我需要有关用户堆栈的更多详细信息。ss(堆栈段寄存器)的目的是什么
assembly - 汇编中的堆栈指针。ESP点总是空的空间与否?
最初,ESP 指的是内存的空白空间。
当我push 1之类的东西时,它会引用1的内存位置,还是下一个空白空间?
这是示例
另一个问题是,当我做一个空的堆栈空间时,ESP会指向哪个点?
这是示例:(每个内存位置为 4 个字节)
假设数字是内存位置地址
assembly - 组装:我不明白为什么堆栈指针似乎(!)在这里保留不足的内存
我是一个组装初学者,所以我的问题的答案对你们大多数人来说可能是完全显而易见的,但对我来说不是。请不要责备。
在 64 位系统上,此 C 代码:
产生这个汇编代码:
我希望堆栈指针至少保留 230 个字节(可能更多),以便可以将“ary”(第 3 行)存储在其中。但在第 9 行,堆栈指针仅递减 120 个字节。这会在基指针 rbp 和 [rbp-120] 之间产生一个 120 字节的缓冲区。这对于“ary”(230 字节)来说太小了。从第 10 行可以看出,ary-index '0' 存储在 [rbp-240] 处,它在基指针下方 240 字节处,因此在缓冲区下方 120 字节处,缓冲区在 [rbp- 120]。所以看起来好像'ary'的一部分存储在缓冲区之外。
当然不是编译器感到困惑,但我很困惑。所以我的问题是:我在这里误解了什么?也许在第 9 行它不是 120 字节,而是 120 * WORD(120 * 2 字节 = 240 字节,适合什么)?这意味着我们在这里混合了一个字节数(第 10 行)和一个字数(第 9 行)。那么我的问题是,如果一个数字是字节数、字数、双字数……,我怎么能在汇编中看到?当然,在第 10 行它被指定为 'BYTE',但是第 9 行呢?
谢谢你的回答!
c - 谁定义了栈指针地址
对于带有 C 启动代码的微控制器和嵌入式系统而言,C 启动代码的功能之一是初始化堆栈指针。
这个初始栈指针地址和C启动代码一般都是芯片厂商定义和提供的吗?
还是由我们作为固件/软件开发人员手动修改或创建 C 启动代码并指定堆栈指针?这部分让我感到困惑。
android - ARM 组件。使用 r13(堆栈指针)作为通用寄存器是否安全?
我正在编写一个极其优化的叶函数并使其运行得更快,我想将 R13 用作通用寄存器。在使用它之前,我通过将 R13 移动到 VFP 寄存器之一来保留 R13,在从函数返回之前,我通过将其移回来恢复它。它看起来像这样:
它有效。但是我读过一些操作系统假定 R13 总是用作堆栈指针,将它用作通用寄存器可能会导致崩溃。我还应该说这个函数只在 Android (Linux) 上运行。谢谢!
assembly - 如果 esp 指向栈顶,那么 ebp 指向哪里?
我在理解如何使用esp
和ebp
寄存器时遇到了一些麻烦。
我们为什么这样做:
在每个功能的开始?ebp
第一次推送时保持什么?
assembly - 在汇编的情况下,编程模型与程序计数器和堆栈指针之间的区别是什么?
处理器型号 I
处理器型号 II
上述两张幻灯片是在 x86/MIPS 讲座期间展示的。我没太明白。
我唯一理解的是,有两种使用堆栈调用函数的模型,以及分配/释放堆。一个使用PC,另一个使用SP。
它是在谈论两个不同处理器(x86/MIPS)的模型吗?哪个是给谁的?
任何人都可以解释一下吗?
assembly - RST 5.5 中断时的堆栈指针 (SP) 调整
在微处理器 8085 中,我们运行命令CALL 3000H。程序计数器 (PC) 等于(PC)=2000H,堆栈指针等于(SP)=4000H。在执行命令的过程中,我们有一个 RST 5.5 中断。我想定义 PC 和 SP 的新值。我还想找到堆栈的内容以及例程返回之前和之后发生的操作。
我认为由于中断发生在命令 CALL 3000H 开始之后,因此命令将完成。完成后,中断发生。程序计数器 (PC) 需要存储在堆栈中,以便程序可以返回到进行调用的点。这意味着 (SP) 被调整。程序计数器 (PC) 将在 RST 5.5 中断后取值 (PC) = 002CH。
我的方法正确吗?如果是这样,我仍然对堆栈指针(SP)和堆栈感到有些困惑。堆栈和(SP)值的调整究竟会发生什么?
c - 在 C 中释放本地定义的变量
假设我们有以下代码:
在 foo() 返回之前,C 中是否有一种(最好是可移植的)方法从运行时堆栈中释放缓冲区(类似于添加 esp,汇编中的 100) ?