• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#代码中插入X86汇编

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

这两天在看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, 从而在这块内存上创建一个函数指针….

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C# 自定义控件和自定义事件发布时间:2022-07-10
下一篇:
C#操作IIS完整解析 - chenkai发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap