为XMM组装“dec”指令

时间:2015-03-19 04:04:35

标签: assembly masm sse2 sse

我正在使用以下内容将外部参数从C传递到ASM:

myFunction proc myVar:qword
    public myFunction

    movdqu xmm3,oword ptr myVar
myFunction endp

最终,我想要类似于下面的内容,但首先需要确定如何将myVar减少1,然后才能解压缩并交错变量,以便在传递后正确使用。我无法想出减少/减去XMM的正确方法,以使其发挥作用。

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

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

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

.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'作为字节值,所以传递它会更清晰(或者将它作为dword传递,取决于32位或64位目标平台):

myFunction proc myVar:qword     ; 64 bit
  public myFunction

  movq xmm3, qword ptr myVar    ; 64 bit
myFunction endp

答案 1 :(得分:0)

movd xmm3, myVar
pcmpeqb xmm4, xmm4 ; xmm4 = -1
pxor xmm5, xmm5 ; xmm5 = 0
pshufb xmm3, xmm5
paddb xmm3, xmm4