【问题标题】:Where in the CPU is the Assembly Stack located?汇编堆栈位于 CPU 中的哪个位置?
【发布时间】:2016-07-03 03:02:25
【问题描述】:

我正在用这张图片学习汇编:

在Assembly 中,您将通过以下命令使用堆栈:

push EAX
pop EBP
sub esp, 4
...

这个堆栈到底在哪里?从图片上看,唯一可能的地方是Memory,但肯定不是这样,对吧?这不会减慢整个周期吗?

【问题讨论】:

  • 是的,它在内存中。堆栈指针本身esp 是寄存器文件中的一个寄存器。堆栈本身位于内存中esp 指向的地址处。由于缓存,它不是很慢。
  • 指令也在内存中,也会影响事情的速度。
  • 绝大多数数据也在内存中。寄存器文件中的空间量很小。一切都在内存中——指令、堆栈、堆、静态数据等等。内存访问肯定是一个瓶颈,但是将堆栈放在内存中并不会减慢速度,就像将代码和其余数据放在内存中一样。
  • 感谢store-forwarding,在 Intel SnB 系列 CPU 上,往返内存(存储和重新加载)大约需要 5 个周期。 IIRC,Skylake 将其缩短为 4c,因此它与 L1 缓存加载使用延迟一样短。不幸的是,Agner Fog 的表格对如何划分存储和加载之间的延迟做出了任意决定,即使您可以通过指针追踪测试自行测量加载延迟。 (这就是我们知道 SnB 系列 L1 缓存是 4c 延迟的原因。)无论如何,这就是为什么最好使用 mov ebp, eax 而不是 push eax / pop ebp

标签: memory assembly x86 stack x86-64


【解决方案1】:

它不在 CPU 中。实际上,堆栈在内存中。然而,堆栈指针是 CPU 中的一个寄存器,用于保存堆栈顶部的地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2014-05-20
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    相关资源
    最近更新 更多