Инструкция по сборке "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
Другие вопросы по тегам