使用x86 MASKMOVDQU
指令时,目标是否总是有16字节的可写内存,即使某些掩码位为零也是如此?
例如,我们说我使用0x12345FFC
写信地址MASKMOVDQU
。 0x12345000
处的页面是有效内存,但0x12346000
处的页面不是。如果掩码寄存器为0x00000000'00000000'00000000'FFFFFFFF
,这个MASKMOVDQU
是否一直有效,或者是否会发生异常?
英特尔手册中提到了关于全零掩码的以下内容,但并未提及我所说的边缘情况:
掩码为全0的行为如下:
•没有数据 写到记忆中。
•断点(代码或数据)的信令不是 保证;不同的处理器实现可以发信号通知 发出这些断点的信号。
•与寻址相关的例外情况 内存和页面错误仍可能发出信号(实现 依赖性)。
•如果目标内存区域映射为UC或WP, 对这些内存类型执行相关语义不是 保证(即保留)并且是特定于实现的。
答案 0 :(得分:3)
见第三点。具体说即使所有掩码都为零,仍可能发生异常。当然,这意味着可能会为屏蔽写入生成异常。
事实上,AMD手册在这个问题上更加明确:
未选择存储的元素的异常和陷阱行为 内存依赖于实现。例如,一个给定的 实现可能会发出数据断点或页面错误信号 这是零屏蔽而不是实际写入的。