C#嵌入x86汇编——一个GPIO接口的实现
始进入工业自动化买的工控机带有GPIO接口可用于直接控制继电器。从厂家拿到接口手册一看居然是汇编直接操作端口基本上是IN/OUT指令了。接口很简单计算位移读取计算位移写入。这种接口常见有四种办法分别是四种语言实现一是直接写ASM不过要公开给C#做的应用程序调用很不容易另外三种是C/C/Delphi嵌入汇编倒是问题不大。接口实在是小不想大动干戈所以想了别的办法。第五种用C/CLI这也是一个不错的主意。但是我甚至想省掉这个接口DLL于是有了第六种办法C#嵌入x86汇编。C#是没办法像C/C/Delphi那样直接嵌入x86汇编的所以需要做点手脚。在汇编里面我们为了修改一个软件经常找一块空白区域来写汇编代码然后Jmp过去执行。不明白这一句话的可以跳过或者去看雪论坛但是显然要在C#代码里面这么做很不现实即使用C/C编译得到objC#也没办法链接这个obj。这个涉及编译的也可以跳过回头一想其实不是现在想07年就做过C#嵌入汇编其实C#也跑在x86上IL指令最终还是要编译成x86汇编指令的我们应该可以这些写汇编指令所需要的只是一块空间而已。我们可以申请一块非托管空间嘛于是有// 分配内存var ptr Marshal.AllocHGlobal(code.Length);有了空间我们就可以把二进制的汇编指令给写进去啦Marshal.Copy(code, 0, ptr, code.Length);然后呢.Net提供一个途径让我们可以把一个内存指针转为一个委托一直都说.Net的委托其实就是C/C的函数指针哈return (T)(Object)Marshal.GetDelegateForFunctionPointer(ptr, typeof (T));那么剩下的问题就是如何把汇编转为二进制了这个我们是不能像C/C/Delphi那样直接写汇编指令的所以得走点弯路。我的做法是用OD随便打开一个程序在上面直接写汇编代码然后把汇编的十六进制复制出来放到C#代码中。剩下的就不多说了直接上代码吧GPIO接口实现