在SSE前缀066h(操作数大小覆盖)0F2H(REPNE)和0F3h(REPE)是操作码的一部分。

在32位(或64位)和16位操作之间的非SSE 066h开关。 0F2h0F3h用于字符串操作。它们可以被组合,使得066h0F2h(或0F3h)可以在相同的指令一起使用,因为这是有意义的。什么是在SSE指令的行为?例如,我们已经(忽略MOD / RM现在):

0f 58 - > addps

66 0f 58 - > addpd

f2 0f 58 - > addsd

f3 0f 58 - > addss

但是,这是什么?

66 f2 0f 58

和怎么样?

f2 66 0f 58

更不用说其具有两个相互冲突的REP前缀的情况如下:

f2 f3 0f 58

什么是规格为这些?

有帮助吗?

解决方案

我不记得见过你应该期望在广泛结合随机前缀的情况下,什么任何规范,所以我猜CPU行为可能是“不确定”,并可能CPU专用的。 (显然,有些事情是在例如Intel的文档说明,但并不涵盖很多情况下)。并且一些组合可以被保留以备将来使用。

我天真的假设一般会一直附加前缀是空操作,但不能保证。这似乎是合理的假设如一些优化手册通过用NOP,e.g前缀推荐多字节90h(标准地66h):

db 66h, 90h; 2-byte NOP
db 66h, 66h, 90h; 3-byte NOP
db 66h, 66h, 66h, 90h; 4-byte NOP

然而,我也知道CSDS段重载前缀已获得性新颖用作SSE2分支提示前缀(预测分支采取= 3Eh = DS覆盖;预测分支不采取= 2Eh = CS覆盖)当施加到条件跳转指令

反正我看着你的例子以上,总是设置XMM1所有0XMM7所有0FFh

pxor xmm1, xmm1    ; xmm1 <- 0s
pcmpeqw xmm7, xmm7 ; xmm7 <- FFs 

,然后将代码中的问题,与xmm1, xmm7参数。我观察到什么(Win64的系统和英特尔T7300酷睿2在32位代码)是:

1)加入addsd前缀66h没有观察到变化

db 66h 
addsd xmm1, xmm7 ;total sequence = 66 F2 0F 58 CF     

2)加入addss前缀0F2h没有观察到变化

db 0f2h     
addss xmm1,xmm7 ;total sequence = F2 F3 0F 58 CF

3)但是,我通过addpd前缀0F2h观察到变化:

db 0f2h    
addpd xmm1, xmm7 ;total sequence = F2 66 0F 58 CF

在这种情况下,结果在XMM1被0000000000000000FFFFFFFFFFFFFFFFh代替FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFh

所以我的结论是,我们不应该做任何假设和预期“不确定”的行为即可。我也不会感到惊讶,但是,如果你能找到昂纳雾的手册的一些线索。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top