2015-02-09 3 views
2

я следующее, который работает отлично:разыменовывать C# по реф указателя в ассемблерный DLL

procedure ShuffleAry16(var Ary16: TByteAry; MaskLow, MaskHigh: Int64); cdecl; assembler; 
asm 
    movdqu  xmm0, [rcx]    // unaligned load Ary16 
    movq   xmm1, rdx 
    pinsrq  xmm1, r8, 1 
    pshufb  xmm0, xmm1 
    movdqu  qword ptr [rcx], xmm0 // unaligned save Ary16 
end; 

C#:

public static unsafe extern void ShuffleAry16(byte* ary, ulong maskLow, ulong maskHigh); 

У меня есть еще один случай, когда мне нужно передать указатель байт по ссылке. Давайте держать текущий метод в качестве примера:

public static unsafe extern void ShuffleAry16(ref byte* ary, ulong maskLow, ulong maskHigh); 

Я не могу понять, как правильно получить адрес Ары (RCX) в этом случае. Я попробовал lea, но это не помогло:

lea   rax, [rcx] 
    movdqu  qword ptr [rax], xmm0 

Как это сделать?

+0

Я понимаю, что это может быть невозможно. – IamIC

+1

Я не думаю, что вы хотите 'lea' здесь, из моего понимания вы должны просто использовать' mov', поскольку 'ref byte *' маршалируется так же, как 'byte **'. Должно быть что-то вроде 'mov rax, qword ptr [rcx]' (Не нужно ничего тестировать на работе) –

+0

Это сработало, спасибо. Пожалуйста, отправьте ответ. – IamIC

ответ

1

Я не думаю, что вы хотите lea здесь, от моего понимания, вы должны просто использовать mov, как ref byte * маршалируется так же, как byte**.

Должно быть что-то вроде:

mov rax,qword ptr [rcx] 

Для справки я искал то, что было именно lea и в то время как это сделано, чтобы использовать при обращении вещи в массиве не действительно доступа ничего просто вычислить АДРЕСА. Этот ответ stackoverflow был полезен для моего понимания: What's the purpose of the LEA instruction?