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

时间:2015-02-09 09:01:29

标签: c# assembly unmanaged freepascal calling-convention

我有以下内容,完美无缺:

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

我该怎么做?

1 个答案:

答案 0 :(得分:1)

我认为您不希望lea来自我的理解,根据我的理解,您应该使用mov,因为ref byte *的编组方式与byte**相同。< / p>

应该是这样的:

mov rax,qword ptr [rcx]

作为参考,我搜索了lea的确切内容,虽然在引用数组中的内容时使用了它,但它并不能真正访问计算地址的任何内容。这个stackoverflow答案对我的理解很有用:What's the purpose of the LEA instruction?