x86 MASKMOVDQU指令的所有16个字节都必须是有效的内存吗?

时间:2016-03-29 18:12:22

标签: assembly x86 alignment sse

使用x86 MASKMOVDQU指令时,目标是否总是有16字节的可写内存,即使某些掩码位为零也是如此?

例如,我们说我使用0x12345FFC写信地址MASKMOVDQU0x12345000处的页面是有效内存,但0x12346000处的页面不是。如果掩码寄存器为0x00000000'00000000'00000000'FFFFFFFF,这个MASKMOVDQU是否一直有效,或者是否会发生异常?

英特尔手册中提到了关于全零掩码的以下内容,但并未提及我所说的边缘情况:

  

掩码为全0的行为如下:

     

•没有数据   写到记忆中。

     

•断点(代码或数据)的信令不是   保证;不同的处理器实现可以发信号通知   发出这些断点的信号。

     

•与寻址相关的例外情况   内存和页面错误仍可能发出信号(实现   依赖性)。

     

•如果目标内存区域映射为UC或WP,   对这些内存类型执行相关语义不是   保证(即保留)并且是特定于实现的。

1 个答案:

答案 0 :(得分:3)

见第三点。具体说即使所有掩码都为零,仍可能发生异常。当然,这意味着可能会为屏蔽写入生成异常。

事实上,AMD手册在这个问题上更加明确:

  

未选择存储的元素的异常和陷阱行为   内存依赖于实现。例如,一个给定的   实现可能会发出数据断点或页面错误信号   这是零屏蔽而不是实际写入的。