程序集“movdqa”访问冲突

时间:2016-10-11 20:06:30

标签: assembly masm sse2

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

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

如果我尝试使用movdqu xmm1, [rdx],我不会得到例外。问题是如果我使用movdqu,则位的顺序会反转。

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

时则不会

1 个答案:

答案 0 :(得分:1)

大部分内容已在评论中说过,但让我总结一下。您的代码/问题引发了三个问题:

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

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

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