Sto eseguendo il porting di una funzione da assembly inline a MASM in Visual Studio 2013 e sto avendo problemi a ottenere un valore di ritorno da esso.Restituzione di un __m128d dalla procedura MASM a un chiamante C
Ecco il chiamante C e la funzione di assemblaggio del prototipo:
extern "C" void AbsMax(__m128d* samples, int len, __m128d* pResult);
__m128d AbsMax(__m128d* samples, int len)
{
__m128d absMax = { 0, 0 };
AbsMax(samples, len, &absMax);
return absMax;
}
E la funzione di montaggio:
.686 ;Target processor. Use instructions for Pentium class machines
.xmm
.model flat, c ;Use the flat memory model. Use C calling conventions
.code ;Indicates the start of a code segment.
AbsMax proc samples:PTR DWORD, len:DWORD, result:PTR XMMWORD
;; Load up registers. xmm0 is min, xmm1 is max. L is Ch0, H is Ch1.
mov ecx, [len]
shl ecx, 4
mov esi, [samples]
lea esi, [esi+ecx]
neg ecx
pxor xmm0, xmm0
pxor xmm1, xmm1
ALIGN 16
_loop:
movaps xmm2, [esi+ecx]
add ecx, 16
minpd xmm0, xmm2
maxpd xmm1, xmm2
jne _loop
;; Store larger of -min and max for each channel. xmm2 is -min.
pxor xmm2, xmm2
subpd xmm2, xmm0
maxpd xmm1, xmm2
movaps [result], xmm1 ; <=== access violation here
xor eax, eax
xor ebx, ebx
ret
AbsMax ENDP
END
quanto ho capito la convenzione per MASM, i valori sono normalmente restituiti attraverso il ritorno Registro EAX. Tuttavia, poiché sto cercando di restituire un valore a 128 bit, sto assumendo che un parametro out sia la strada da percorrere. Come si può vedere nella lista degli assiemi, l'assegnazione del parametro out (movaps [result]
) causa una violazione di accesso (posizione di lettura della violazione di accesso 0x00000000). Ho convalidato l'indirizzo del risultato nel debugger e sembra a posto.
Cosa sto sbagliando?
L'indirizzo è allineato correttamente? – Mehrdad
È possibile modificare il chiamante per restituire invece un puntatore a __m128d? – mbomb007
@ Mehrdad. Sì. '__m128d' è definito con __declspec per allinearlo correttamente e ho ricontrollato l'indirizzo nel debugger. – jaket