• C#代码中插入X86汇编


    这两天在看C# SIMD相关的东西, 在爆栈上面搜到一段代码, 表示很震惊, 还是得贴出来…

     1 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
     2 delegate void VectorAddDelegate(float[] C, float[] B, float[] A, int length);
     3 
     4 [DllImport("kernel32.dll", SetLastError = true)]
     5 static extern IntPtr VirtualAlloc(
     6     IntPtr lpAddress, UIntPtr dwSize,
     7     IntPtr flAllocationType, IntPtr flProtect);
     8 
     9 //This array of bytes has been produced from
    10 //the SSE assembly version – it is a complete
    11 //function that accepts four parameters (three
    12 //vectors and length) and adds the vectors
    13 
    14 byte[] sseAssemblyBytes = {
    15     0x8b, 0x5c, 0x24, 0x10, 0x8b, 0x74, 0x24, 0x0c, 0x8b,
    16     0x7c, 0x24, 0x08, 0x8b, 0x4c, 0x24, 0x04, 0x31, 0xd2,
    17     0x0f, 0x10, 0x0c, 0x97, 0x0f, 0x10, 0x04, 0x96, 0x0f,
    18     0x58, 0xc8, 0x0f, 0x11, 0x0c, 0x91, 0x83, 0xc2, 0x04,
    19     0x39, 0xda, 0x7f, 0xea, 0xc2, 0x10, 0x00 };
    20 
    21 IntPtr codeBuffer = VirtualAlloc(
    22     IntPtr.Zero, new UIntPtr((uint)sseAssemblyBytes.Length),
    23     0x1000 | 0x2000, //MEM_COMMIT | MEM_RESERVE
    24     0x40 //EXECUTE_READWRITE
    25     );
    26 
    27 Marshal.Copy(sseAssemblyBytes, 0, codeBuffer, sseAssemblyBytes.Length);
    28 
    29 VectorAddDelegate addVectors = (VectorAddDelegate)
    30     Marshal.GetDelegateForFunctionPointer(codeBuffer, typeof(VectorAddDelegate));
    31 //We can now use ‘addVectors’ to add vectors!

    这段代码里面的sseAssemblyBytes, 实际上是一段汇编代码, 他先把这段汇编代码拷贝到虚拟内存里面去, 然后设置这块内存可以被执行EXECUTE_READWRITE, 从而在这块内存上创建一个函数指针….

    虽然这代码不能移植, 但是感觉还是有一点点屌

  • 相关阅读:
    poj1966 Cable TV Network
    contesthunter#17-c 舞动的夜晚
    joyoi1957 「Poetize5」Vani和Cl2捉迷藏
    joyoi1935 「Poetize3」导弹防御塔
    luogu3629 [APIO2010]巡逻
    poj2728 Desert King
    poj1734 Sightseeing trip
    loj2003 「SDOI2017」新生舞会
    hdu2255 奔小康赚大钱 KM 算法
    POJ 1681 Painter's Problem(高斯消元+枚举自由变元)
  • 原文地址:https://www.cnblogs.com/egmkang/p/7449602.html
Copyright © 2020-2023  润新知