在asm DLL中通过引用取消引用C#指针



我有以下功能,它可以完美地工作:

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);

在这种情况下,我不知道如何正确地获得ary(RCX)的地址。我试过lea,但没用:

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

我该怎么做?

我认为这里不需要lea,根据我的理解,您应该只使用mov,因为ref byte *的封送方式与byte**相同。

应该是这样的:

mov rax,qword ptr [rcx]

作为参考,我搜索了确切的lea,虽然它是在引用数组中的东西时使用的,但它并没有真正访问任何东西,只是计算地址。这个堆叠式的答案对我的理解很有用:LEA指令的目的是什么?

最新更新