2015-03-19 2 views
0

Я в настоящее время прохождения внешнего параметра из C в ASM с помощью следующего:Ассамблея «Декабрь» инструкция для XMM

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

Вы можете использовать простой Вычитание одной операции в любое время в приведенном выше коде, т.е.

.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 
+0

Определено, что qword действительно может быть древом и что после этого 'dec myVar' был действительным. Это сообщение действительно заставило меня пересмотреть те битки, которые мне нужны. Благодаря! – user2379150

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