【问题标题】:Byte in x86 intel assembly padded with NOPs?x86 英特尔程序集中的字节填充了 NOP?
【发布时间】:2017-08-20 17:24:45
【问题描述】:

使用单字节时,是否应考虑 4 字节对齐?

英特尔 x86 伪代码。在 4096 字节页面的开头:

PAGEADDRESS:
    01
    NOP NOP NOP <- 3 NOPs necessary?
    cmp byte ptr [PAGEADDRESS], 01
    je ADDRESS
    ...

【问题讨论】:

  • 您需要考虑哪些对齐适用,哪些不适用。然后你的问题就自己回答了。
  • 代码实际上是在显示数据后代码的对齐方式,这是一个不同的问题

标签: assembly x86 intel memory-alignment


【解决方案1】:

cmp byte ptr [PAGEADDRESS], 01 指令只处理 PAGEADDRESS 处的一个字节。后续字节填充什么并不重要。这些是 NOP 的事实不会影响 cmp 指令。

  • 内存中的双字应从 4 字节对齐的地址开始。
  • 单词只有在跨越这样一个 4 字节对齐的边界时才会出现对齐错误。
  • 字节永远不能错位。

【讨论】:

  • 你从哪里得到单词的 4 字节边界?这是来自 P5 的原子性保证吗?
  • 汇编/编译器编码规则 46(英特尔优化手册)说:“对齐 16 位数据以包含在对齐的 4 字节字中。”
  • 然后在下一段中,他们说您应该避免跨越 16 字节边界。 (这对于使用银行 L1D 缓存的 Sandybridge/Ivybridge 来说是有意义的)。这个优化建议完全依赖于 uarch。这没有错或不好,只是可能过于具体或限制。阅读英特尔的优化手册时,请始终记住,它经过了很长时间的演变,其中大量内容是 P4 特有的,与 P6 / SnB 系列无关。
  • @PeterCordes 您指的是“只要 16 字节边界(和缓存行)从未跨越,自然对齐就不是绝对必要的”?
  • 我想如果我必须推荐一些要记住的东西,我会说“不要跨越 8B 界限”,因为我认为 Bulldozer 家族关心这一点(至少在原子性方面)。这对英特尔来说绰绰有余。但是,是的,我知道将事情简化为您始终可以遵循的规则很有用,即使这意味着有时会在填充上浪费一些缓存占用空间。我会说尽可能自然地对齐一切,因为这总是好的。 (并且 16B 对齐数组的开头,这样您就可以在没有缓存行拆分的情况下进行矢量化)。
猜你喜欢
  • 2013-11-01
  • 2018-10-15
  • 2017-03-04
  • 2012-02-25
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多