【问题标题】:Can moving memory to 32 bit register be unaligned access in NASM sometimes?将内存移动到 32 位寄存器有时可​​以在 NASM 中进行非对齐访问吗?
【发布时间】:2021-04-30 18:01:38
【问题描述】:

不知道是不是这样的代码中的非对齐访问:

section .text
 global _start
_start:
        mov eax, [arr + 1]

section .data
arr: db 1, 2, 3, 4, 5, 6, 7

【问题讨论】:

  • “可以”是什么意思?您是在询问是否允许,或者是否可以进行?
  • 这似乎是未对齐的。
  • 是的,当然,如果你正常构建,mov word [arr], imm16 是一个对齐的商店,就像我在你上一个问题中解释的那样。 Is there unaligned access problem in NASM?

标签: assembly x86 memory-alignment


【解决方案1】:

典型的节对齐是 1000h,至少在 PortableExecutables 中是这样。当你的程序链接并加载到内存时,section .data的虚拟地址会对齐,所以第一个数据arr也会对齐。

当然,从地址 mov eax, [arr + 1] 加载寄存器是不对齐的,但无论如何它都会起作用,尽管速度不如 mov eax, [arr] 快​​。

【讨论】:

  • 它在最新的 Intel/AMD 内核上一样快,只要它是
  • @HansPassant:自从 Nehalem for Intel(以及最近的 AMD)以来,只要您没有缓存行拆分,任何访问大小都不会受到性能损失。因此,在 Skylake(或 Zen 2)上,vaddps ymm1, ymm0, [rdi + 30](一个缓存行中间的 32 字节负载,假设 RDI 按 64 对齐)没有缺点。我认为一些早期的 AMD 在更窄的边界(如 16 或 32 字节)上具有某种性能影响。 (和/或缓存行内跨越 16 字节边界的存储的非原子性,而英特尔确实保证了缓存留置权内 8 字节加载/存储的原子性。)
猜你喜欢
  • 2015-12-26
  • 2020-11-21
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 2015-06-25
  • 2018-02-18
  • 1970-01-01
相关资源
最近更新 更多