Инструкция по сборке "dec" для XMM
В настоящее время я передаю внешний параметр из 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 ответа
Вы можете использовать простое вычитание одной операцией в любое время в приведенном выше коде, т.е.
.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
movd xmm3, myVar
pcmpeqb xmm4, xmm4 ; xmm4 = -1
pxor xmm5, xmm5 ; xmm5 = 0
pshufb xmm3, xmm5
paddb xmm3, xmm4