问题标签 [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 - 在armv8架构中将半字值存储到堆栈内存中时出现总线错误?
我有两个要存储在堆栈上的寄存器 w1 和 w2。我想将完整的单词 w1 和 w2 的一半存储到堆栈中。这是我的实现:
在编译时,第一条指令运行良好,但第二条指令引发总线错误。我知道这是一些对齐问题,但我无法正确理解为什么会这样?
我正在为 ARMv8(64 位)架构进行编译。
c - x86_64 汇编器中 RBP 寄存器的用途是什么?
所以我正在尝试学习一点汇编,因为我需要它用于计算机体系结构课程。我写了一些程序,比如打印斐波那契数列。
我认识到,每当我编写一个函数时,我都会使用这 3 行代码(正如我从生成的汇编代码gcc
与其C
等效代码的比较中学到的那样):
我有两个问题:
- 首先,为什么我需要使用
%rbp
?使用起来不是更简单吗%rsp
,因为它的内容被移到%rbp
了第二行? - 为什么我必须从中减去任何东西
%rsp
?我的意思是它并不总是16
,当我printf
想 7 或 8 个变量时,我会减去24
or28
。
我在虚拟机(4 GB RAM)上使用 Manjaro 64 位,英特尔 64 位处理器
c - 获取 C 中 POSIX 线程的堆栈指针的当前值
我想知道是否存在一种可移植的方法来检索特定 POSIX 线程的 C 中的当前堆栈指针值,由其线程 ID 指向?获得近似堆栈指针值的唯一方法是kill
中断特定线程(使用pthread_kill
)并让被触发的信号的信号处理程序具有类似于以下函数的函数:
是否有更简洁的方法来获取特定线程的当前堆栈指针?
另外,一个附带问题,是否有任何特定范围的未使用信号可用于自定义使用?
c - 在 POSIX C 线程中上下文切换之前存储的当前堆栈指针寄存器的值在哪里
如果我要在 POSIX 环境中使用 pthread,并且即将发生上下文切换,则必须将esp
寄存器的当前值存储在某个地方,以便在上下文切换回该线程时可以检索它,因为esp
寄存器的值将是被另一个线程保存的 SP 值覆盖。我认为不可能esp
为每个线程都有单独的寄存器(如果我错了,请纠正我)。话虽如此,我想知道在上下文切换之前,当前线程的SP值存储在什么数据结构中?
我尝试查找struct pthread*
从 的值转换的 ' 值pthread_t
,但是当我调用某个函数来更改我正在测试的线程的当前 SP(即在调用测试函数之前和之后进行比较)时,什么都没有改变。
c - 在汇编中为局部变量留出空间
所以我必须编写一个调用 extern C 函数的汇编程序。所以我写了一个简单的pow
函数,我用这个 C 代码编译了我的汇编程序。一切正常。但正如我从-S
command from中看到的gcc
,编译器为局部变量留出了空间。我以为会是这样的:
我们有 3 个局部变量,所以编译器会subl $12, %esp
. 但它适用于subl $16, %esp
. 即使我在这里只留下一个数字,它仍然会减少16
. 现在我有我的代码:
main.s
:
func.c
:
它按预期工作,./main
打印出来25
。但是现在,我什么都subl
没有%esp
。我的意思是我可以添加这一行,但它不会改变任何东西。我在互联网上搜索过,我发现我的代码可能只是偶然地工作,通常我应该递减%esp
. 所以我的问题是:我应该减少什么%esp
值main
?应该是12
还是可能16
?
c - 如何操作 MIPS 代码并使用堆栈指针?
因此,我最近编写了一个代码来计算 C 代码和 MIPS 代码中二进制 1 的数量。我在 C 中通过使用余数并增加 count_one 变量来做到这一点。在 MIPS 中,我执行了相同的程序,但我移动了数字的字节,直到它计算出所有的 1。但是,我想尝试学习如何使用指针,但我似乎无法掌握这个概念。我的 MIPS 代码如下:
我得到了这个完整的 MIPS 代码,但我不确定指针在 MIPS 中是如何完全工作的,阅读后我仍然不明白。关于如何实现指针的任何建议?
stack - 堆栈指针向后移动但值未加载到寄存器文件?
当堆栈指针移回其原始位置但保存在堆栈中的值没有从内存加载回寄存器文件时会发生什么?即当堆栈指针移回时,值仍然存在于堆栈内存中。
c - 当我从程序集中调用 C 函数“退出”时,是否必须清理堆栈?
我被要求在使用 C 函数时在汇编中创建一个小程序。这样做的时候,我想知道一些具体的事情。
我知道在使用汇编时,无论我想调用一个 C 函数,我都必须将它的参数推送到堆栈中,并且在函数返回后,我必须弹出这些参数(或将 4× x添加到esp
,其中x表示推论)。
我的问题是:特别是
在调用 C 函数exit
时,我必须首先为状态推送一个参数。假设我想按 0 表示我的程序可以正常工作。
知道exit
函数不会返回并且我必须使用它并且不能自己调用退出系统中断,在这种情况下,我怎么能从堆栈中弹出那个 0?该功能是否exit
为我执行该功能?
assembly - 作为副作用影响 ESP 的 x86 指令有哪些?
我知道call
并且ret
会修改 and 的值并且esp
有许多变体,但是还有其他会影响堆栈指针的指令吗?push
pop
assembly - 为什么要在 FreeBSD 中重置堆栈指针寄存器?
我正在尝试掌握 FreeBSD 中的汇编程序。在手册的 UNIX 过滤器代码示例中,寄存器 esp 在每次系统调用后都会重置。有问题的代码是:
这与文档上一页的示例不同:
为什么这两个例子不同?为什么需要类似的东西add esp, byte 12
?系统调用没有弹出值吗?在没有在堆栈上传递参数的 64 位 FreeBSD 中这是必要的吗?我想象堆栈指针会自行处理。