я следующее, который работает отлично:разыменовывать 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
Как это сделать?
Я понимаю, что это может быть невозможно. – IamIC
Я не думаю, что вы хотите 'lea' здесь, из моего понимания вы должны просто использовать' mov', поскольку 'ref byte *' маршалируется так же, как 'byte **'. Должно быть что-то вроде 'mov rax, qword ptr [rcx]' (Не нужно ничего тестировать на работе) –
Это сработало, спасибо. Пожалуйста, отправьте ответ. – IamIC