【问题标题】:Does RIP-relative addressing require 16-byte aligned?RIP 相对寻址是否需要 16 字节对齐?
【发布时间】:2015-06-04 17:59:00
【问题描述】:

测试在 64 位/x86 Ubuntu 12.04 上进行。与GCC 4.6.3.

所以基本上我正在处理一些 x64 汇编代码。我观察到RIP-relative addressing 要求绝对地址是 16 字节对齐的。

这是使用gdb进行调试时的示例:

0x40f38d <S_0x40F614+61>        xorpd  0x84d3(%rip),%xmm0   # 0x417868 <S_0x417DE0>

此内存引用地址 0x417868 失败(分段错误),因为此地址仅 8 字节对齐。

0x40f38d <S_0x40F614+61>        xorpd  0x8a4b(%rip),%xmm0   # 0x417de0 <S_0x417DE0>

这个内存引用可以工作,因为地址 0x417de0 是 16 字节对齐的。

这是我的观察,我没有找到任何官方材料讨论这个问题。谁能告诉我

  1. 这个 16 字节对齐要求是否普遍适用?
  2. 如果是这样,那么有任何官方文件/手册在谈论这个吗?

【问题讨论】:

  • xorpd指令要求内存操作数16字节对齐。

标签: assembly x86 x86-64


【解决方案1】:

这是xorpd 指令。它会导致类型 4 的异常,当您指定没有 VEX 前缀的未对齐内存位置时会发生这种情况。 (所以vxorpd 不会因为未对齐而出错。)

但是,它不是唯一的,还有大约 106 条指令会导致同样的事情。

【讨论】:

  • 传统 SSE 指令的内存操作数必须对齐(除了明显的例外),VEX 编码的指令可以采用未对齐的操作数。
  • @harold 我不知道。据此,是否有任何一般规则说明何时发生异常?
  • @user35443:非 VEX SSE 指令的每个 m128 内存操作数都必须对齐,否则会出错,但明确表示它们用于未对齐数据的指令除外。 (例如movdqu)。这就是@harold 所说的“显而易见”。 VEX 编码指令从不需要对齐,movdqa / movaps / movapd 除外。 (所以你应该始终使用movdqu,因为在新的足以支持 AVX 的 CPU 上,它与数据对齐时一样快。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 2019-03-07
  • 2015-09-22
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多