2015-02-09 64 views
2

我有以下,其完美地工作一C#通过参考指针:解除引用在asm 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); 

我无法弄清楚如何在这种情况下正确获取ary(RCX)的地址。我尝试过lea,但它不起作用:

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

我该怎么做?

+0

我知道这可能是不可能的。 – IamIC 2015-02-09 09:09:20

+1

我不认为你想'lea'在这里,从我的理解你应该只使用'mov',因为'ref byte *'与'byte **'是相同的。应该像'mov rax,qword ptr [rcx]'(在工作时没有任何东西需要测试) – 2015-02-09 09:21:28

+0

工作,谢谢。请作为答复发布。 – IamIC 2015-02-09 09:29:05

回答

1

我不认为你想lea这里,从我的理解,你应该只使用movref byte *被编组一样byte**

应该是这样的:

mov rax,qword ptr [rcx] 

仅供参考我搜索的内容正是lea,虽然它是由引用数组中的东西它并没有真正进入那些仅仅计算不会忽略时使用。这stackoverflow答案是有益的,我的理解:What's the purpose of the LEA instruction?