程序集 "movdqa" 访问冲突

Assembly "movdqa" access violation

我目前正尝试在汇编中编写一个函数,我想将位于 rdx 中存储的内存地址处的字符串的 128 位移动到 xmm1 寄存器中。

如果我使用 movdqa xmm1, [rdx],我在读取位置 0xFFFFFFFFFFFFFFFF 时遇到访问冲突异常。

如果我尝试使用 movdqu xmm1, [rdx],我不会得到异常。问题是如果我使用 movdqu,位的顺序是颠倒的。

所以我不知道为什么我在使用 movdqa 时出现异常,但在使用 movdqu

时却没有

大部分评论里都说了,我总结一下。您的 code/question:

提出了三个问题

1) MOVDQA 要求它处理的地址(在您的情况下为 [rdx])与 16 字节边界对齐,否则将触发访问冲突。这就是你所看到的。对齐到 16 字节 (DQWORD) 边界意味着,使用您的示例,您应该从例如0xFFFFFFFFFFFFFFF0而不是0xFFFFFFFFFFFFFFFF,因为后者不能被16整除。

2) 您使用的地址 0xFFFFFFFFFFFFFFFF 几乎可以肯定是无效的。

3) 如果您使用 MOVDQA 从有效的 16 字节对齐内存位置读取,结果(在您的情况下为 xmm1)将是 IDENTICAL 到你使用 MOVDQU 的时候。两者之间唯一相关的区别是 movdqU 允许您从 Unaligned(因此是 U)内存读取,而 movdqA 需要(16 字节) ) A对齐内存位置。 (后一种情况通常会更快,但我认为现阶段您无需为此担心。)