测试是在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字节对齐的。
这是我的观察,我没有找到任何有关此问题的官方材料。有谁能告诉我
答案 0 :(得分:4)
这是xorpd
指令。它导致类型4的异常和异常,当您指定没有VEX前缀的未对齐内存位置时会发生这种情况。 (所以vxorpd
不会因未对齐而出错。)
然而,它不是唯一的,大约有106条指令导致同样的事情。