我目前正在尝试在汇编中编写函数,我想将位于rdx
中存储的内存地址的128位字符串移动到xmm1
寄存器中。
如果我使用movdqa xmm1, [rdx]
,我会在阅读位置0xFFFFFFFFFFFFFFFF
时收到访问冲突异常。
如果我尝试使用movdqu xmm1, [rdx]
,我不会得到例外。问题是如果我使用movdqu,则位的顺序会反转。
所以我不知道为什么在使用movdqa
时会出现异常,但在使用movdqu
答案 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 已签名的内存位置。 (后一种情况通常会更快,但我认为你不必在现阶段担心这种情况。)