15得票2回答
栈指针和程序计数器有什么区别?

众所周知,微处理器执行任务的过程就是逐个从内存中执行二进制指令,并且有一个程序计数器,它保存着下一条指令的地址。如果我没记错,这就是处理器执行任务的方式。但是,还有另外一个指针叫做栈指针,其作用几乎与程序计数器相同。我的问题是,为什么我们需要一个栈指针来指向内存(栈)的地址?有人能告诉我栈指针...

142得票2回答
RBP寄存器在x86_64汇编语言中的作用是什么?

我正在努力学习一点汇编语言,因为我在计算机体系结构课上需要用到它。我写了一些程序,比如打印斐波那契数列。 我意识到每当我写一个函数时,我都会使用这三行代码(我是通过比较由gcc生成的汇编代码和对应的C代码学到的): pushq %rbp movq %rsp, %rbp subq ...

15得票5回答
函数调用跳转到错误的函数

我正在使用VS2008编译一个C++静态库,在解决方案中也有一个启动项目,它使用该库,而且运行良好。 但是,在另一个解决方案中使用该库时,出现了运行时检查失败的问题。 “ESP的值在函数调用跨度过程中没有得到正确保存。” 通过代码逐步执行,我发现函数foo()在崩溃之前会跳转到bar()。所...

13得票2回答
“pushl/popl %esp”的汇编级表示是什么?

我正在尝试理解推送和弹出堆栈指针寄存器的行为。在AT&T格式中: pushl %esp 并且 popl %esp 请注意,它们将计算出的值存回到%esp中。 我独立考虑这些指令,而不是按顺序。我知道存储在%esp中的值始终是增量/减量之前的值,但我该如何用汇编语言表示这种...

12得票3回答
pop或者add esp, 4?有什么区别?

我看到这个问题,但在其中没有找到我的答案。 那么,为什么我更喜欢使用add esp, 4或add esp, 8而不是使用pop一次或两次?是否完全没有差别(性能、安全等),还是只是个人选择的问题?

144得票5回答
x86汇编中使用push/pop指令对寄存器的作用是什么?

阅读有关汇编语言的文章时,经常遇到人们写道他们将处理器的某个寄存器“push”一下,然后稍后再“pop”回来以恢复其先前的状态。 这是什么意思呢?如何将寄存器“push”起来?它被推到哪里去了?为什么需要这样做? 这是否简化为单个处理器指令,还是更加复杂?

13得票1回答
x86汇编:弹出一个值但不存储它

在x86汇编中,是否有可能在不将其存储的情况下从堆栈中移除一个值?例如pop word null之类的东西?我当然可以使用add esp,4,但也许有一个好看且干净的cisc助记符我错过了吗?

12得票3回答
15得票5回答
在ESP以下编写代码是否有效?

32位Windows应用程序可否在未明确减少ESP的情况下使用ESP以下的堆栈内存作为临时交换空间?考虑一个将浮点值返回到 ST(0)的函数。 如果我们的值当前位于EAX中,我们可以:PUSH EAX FLD [ESP] ADD ESP,4 // or POP EAX, et...

7得票1回答
GCC为什么会生成奇怪的移动栈指针方法

我观察到GCC的C++编译器生成了以下汇编代码: sub $0xffffffffffffff80,%rsp 这相当于 add $0x80,%rsp 例如,从堆栈中删除128字节。 为什么GCC生成第一个减法变体而不是加法变体?与利用下溢相比,加法变体对我来说似乎更自然...