【发布时间】: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