程序集 "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对齐内存位置。 (后一种情况通常会更快,但我认为现阶段您无需为此担心。)
我目前正尝试在汇编中编写一个函数,我想将位于 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对齐内存位置。 (后一种情况通常会更快,但我认为现阶段您无需为此担心。)