2015-03-19 40 views
0

我目前傳遞的外部參數由C使用以下到ASM指令:大會「DEC」的XMM

myFunction proc myVar:qword 
    public myFunction 

    movdqu xmm3,oword ptr myVar 
myFunction endp 

最後,我想類似以下,但首先需要的東西,以確定如何在我可以解壓縮和交錯變量之前減少myVar,以便在通過之後使用它。我無法想出減少/減少XMM來完成這項工作的正確方法。

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

任何幫助將不勝感激!

回答

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的」對於字節值來說,這樣傳遞更清晰(或者將其作爲雙字傳遞,取決於32位或64位目標平臺):

myFunction proc myVar:qword  ; 64 bit 
    public myFunction 

    movq xmm3, qword ptr myVar ; 64 bit 
myFunction endp 
+0

確定qword實際上可以是雙字,並且'dec myVar'之後有效。這篇文章確實讓我重新考慮了我需要的一些東西。謝謝! – user2379150 2015-03-19 21:27:55

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