RIP 相对寻址是否需要 16 字节对齐?
Does RIP-relative addressing require 16-byte aligned?
测试时间为 64-bit/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 字节对齐的。
这是我的观察,我没有找到任何官方资料讨论这个问题。谁能告诉我
- 这个 16 字节对齐要求是否普遍适用?
- 如果是这样,那么有官方document/manual谈论这个吗?
是xorpd
指令。它会导致类型 4 的异常,当您指定没有 VEX 前缀的未对齐内存位置时会发生这种情况。 (所以 vxorpd
不会因未对齐而出错。)
然而,它不是唯一的,还有大约 106 条指令导致了同样的事情。
测试时间为 64-bit/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 字节对齐的。
这是我的观察,我没有找到任何官方资料讨论这个问题。谁能告诉我
- 这个 16 字节对齐要求是否普遍适用?
- 如果是这样,那么有官方document/manual谈论这个吗?
是xorpd
指令。它会导致类型 4 的异常,当您指定没有 VEX 前缀的未对齐内存位置时会发生这种情况。 (所以 vxorpd
不会因未对齐而出错。)
然而,它不是唯一的,还有大约 106 条指令导致了同样的事情。