我正在使用以下内容将外部参数从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
非常感谢任何帮助!
答案 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