XMM 的汇编 "dec" 指令

Assembly "dec" instruction for XMM

我目前正在使用以下方法将一个外部参数从 C 传递到 ASM:

myFunction proc myVar:qword
    public myFunction

    movdqu xmm3,oword ptr myVar
myFunction endp

最终,我想要类似于下面的东西,但首先需要确定如何将 myVar 减 1,然后才能解压和交错变量,以便它在传递后可以正确使用。我想不出 decrease/subtract XMM 来完成这项工作的正确方法。

dec myVar
movd xmm3, myVar
punpcklbw xmm3, xmm3
punpcklwd xmm3, xmm3
punpckldq xmm3, xmm3
punpcklqdq xmm3, xmm3

如有任何帮助,我们将不胜感激!

您可以在上面的代码中随时使用简单的一次减法,即

.data
  ddqONE dd 01010101h,01010101h,01010101h,01010101h
.code
...
movd xmm3, myVar
punpcklbw xmm3, xmm3
punpcklwd xmm3, xmm3
punpckldq xmm3, xmm3
punpcklqdq xmm3, xmm3
psubb xmm3, oword ptr [ddqONE]   ; the DEC operation on byte values

我在您的代码中注意到的另一个可能的问题:

myFunction proc myVar:qword       ; passing 64 bit var on the stack
  public myFunction

  movdqu xmm3,oword ptr myVar     ; referencing it as 128 bit var!!!
myFunction endp

由于您仅将 'myVar' 用于字节值,因此像这样传递它会更清晰(或将其作为双字传递,具体取决于 32 位或 64 位目标平台):

myFunction proc myVar:qword     ; 64 bit
  public myFunction

  movq xmm3, qword ptr myVar    ; 64 bit
myFunction endp
movd xmm3, myVar
pcmpeqb xmm4, xmm4 ; xmm4 = -1
pxor xmm5, xmm5 ; xmm5 = 0
pshufb xmm3, xmm5
paddb xmm3, xmm4