- 16
- 0
- 约 8页
- 2016-08-10 发布于重庆
- 举报
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++编译得到obj,C#也没办法链接这个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#代码中。
剩下的就不多说了,直接上代码吧!
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.IO;
namespace ConsoleApplication19
{
class GPIO
{
#region 属性
private Int32 _Offset;
/// summary选择位移/summary
public Int32 Offset { get { return _Offset; } set { _Offset = value; } }
private Int32 _Bit;
/// summary选择位/summary
public Int32 Bit { get { return _Bit; } set { _Bit = value; } }
#endregion
#region 构造
private GPIO(Int32 offset, Int32 bit)
{
Offset = offset;
Bit = bit;
}
private GPIO(Int32 gpio)
{
Offset = gpio / 16;
Bit = gpio % 16;
}
#endregion
#region 预定义针脚
public static GPIO Pin2 = new GPIO(0, 6);
public static GPIO Pin3 = new GPIO(0, 7);
public static GPIO Pin4 = new GPIO(2, 1);
public static GPIO Pin5 = new GPIO(2, 4);
public static GPIO Pin6 = new GPIO(1, 0);
public static GPIO Pin7 = new GPIO(1, 4);
public static GPIO Pin8 = new GPIO(3, 3);
public static GPIO Pin9 = new GPIO(3, 4);
public static GPIO IO6 = new GPIO(6);
public static GPIO IO7 = new GPIO(7);
public static GPIO I
您可能关注的文档
- 如何成为一名优秀的软件开发工程师.docx
- 河南2014会计从业资格考试试题.doc
- NaH2PO4和Na2HPO4混合液中各组分含量测定2.doc
- CAD常见问题全面解答.doc
- CAD文字乱码无法显示解决办法(图片指导).doc
- 河南专升本管理学真题2010.doc
- 如何利用GMAT阅读真题备考.docx
- 天锐绿盾信息安全管理软件功能介绍.pptx
- nanos2综述.doc
- 河南专升本管理学近三年真题带答案.doc
- 广东省广州省实验中学教育集团2025-2026学年八年级上学期期中考试物理试题(解析版).docx
- 广东省广州大学附属中学2025-2026学年八年级上学期奥班期中物理试题(解析版).docx
- 广东省广州市第八十六中学2025-2026学年八年级上学期期中物理试题(含答案).docx
- 广东省广州市第八十九中学2025-2026学年八年级上学期期中考试物理试题(解析版).docx
- 广东省广州市第二中学2025-2026学年八年级上学期期中考试物理试题(含答案).docx
- 广东省广州市第八十六中学2025-2026学年八年级上学期期中物理试题(解析版).docx
- 广东省广州市第八十九中学2025-2026学年八年级上学期期中考试物理试题(含答案).docx
- 广东省广州市第二中学2025-2026学年八年级上学期期中考试物理试题(解析版).docx
- 2026《中国人寿上海分公司营销员培训体系优化研究》18000字.docx
- 《生物探究性实验教学》中小学教师资格模拟试题.docx
原创力文档

文档评论(0)