博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MSIL实用指南-位运算
阅读量:5282 次
发布时间:2019-06-14

本文共 3855 字,大约阅读时间需要 12 分钟。

C#支持的位运算是与、或、异或、取反、左移、右移,它们对应的指令是

And、Or、Xor、Not、Shl、Shr。

取反运算只需要一个操作数,生成步骤是

1.生成加载变量
2.生成取反指令
实例代码:

ilGenerator.Emit(OpCodes.Ldarg_0);ilGenerator.Emit(OpCodes.Not);

其它五个运算都需要两个参数,它们的通用步骤

1.生成加载左边变量
2.生成加载右边变量
3.生成运算指令

实例:

ilGenerator.Emit(OpCodes.Ldarg_0);ilGenerator.Emit(OpCodes.Ldarg_1);ilGenerator.Emit(OpCodes.And);

 

完整的程序如下:

using System;using System.Reflection;using System.Reflection.Emit;namespace LX1_ILDemo{    class Demo17_BitOP    {        static string binaryName = "Demo17_BitOP.exe";        static string namespaceName = "LX1_ILDemo";        static string typeName = "BitOPDemo";        static AssemblyBuilder assemblyBuilder;        static ModuleBuilder moduleBuilder;        static TypeBuilder typeBuilder;        static MethodBuilder mainMethod;        static MethodBuilder testMethod;        static void Emit_Test()        {            testMethod = typeBuilder.DefineMethod("TestOP", MethodAttributes.Public                | MethodAttributes.Static, typeof(void), new Type[] { typeof(int), typeof(int) });            var println = typeof(Console).GetMethod("WriteLine", new Type[] { typeof(int) });            var ilGenerator = testMethod.GetILGenerator();            ilGenerator.Emit(OpCodes.Ldarg_0);            ilGenerator.Emit(OpCodes.Not);            ilGenerator.Emit(OpCodes.Call, println);            ilGenerator.Emit(OpCodes.Ldarg_0);            ilGenerator.Emit(OpCodes.Ldarg_1);            ilGenerator.Emit(OpCodes.And);            ilGenerator.Emit(OpCodes.Call, println);            ilGenerator.Emit(OpCodes.Ldarg_0);            ilGenerator.Emit(OpCodes.Ldarg_1);            ilGenerator.Emit(OpCodes.Or);            ilGenerator.Emit(OpCodes.Call, println);            ilGenerator.Emit(OpCodes.Ldarg_0);            ilGenerator.Emit(OpCodes.Ldarg_1);            ilGenerator.Emit(OpCodes.Xor);            ilGenerator.Emit(OpCodes.Call, println);            ilGenerator.Emit(OpCodes.Ldarg_0);            ilGenerator.Emit(OpCodes.Ldc_I4_2);            ilGenerator.Emit(OpCodes.Shl);            ilGenerator.Emit(OpCodes.Call, println);            ilGenerator.Emit(OpCodes.Ldarg_0);            ilGenerator.Emit(OpCodes.Ldc_I4_2);            ilGenerator.Emit(OpCodes.Shr);            ilGenerator.Emit(OpCodes.Call, println);            ilGenerator.Emit(OpCodes.Ret);        }        public static void Generate()        {            InitAssembly();            typeBuilder = moduleBuilder.DefineType(namespaceName + "." + typeName, TypeAttributes.Public);            Emit_Test();            GenerateMain();            assemblyBuilder.SetEntryPoint(mainMethod, PEFileKinds.ConsoleApplication);            SaveAssembly();            Console.WriteLine("生成成功");        }        static void GenerateMain()        {            mainMethod = typeBuilder.DefineMethod("Main", MethodAttributes.Public                | MethodAttributes.Static, typeof(void), new Type[] { });            var ilGenerator = mainMethod.GetILGenerator();            ilGenerator.Emit(OpCodes.Ldc_I4,1000);            ilGenerator.Emit(OpCodes.Ldc_I4,120);            ilGenerator.Emit(OpCodes.Call, testMethod);            ilGenerator.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadKey", new Type[] { }));            ilGenerator.Emit(OpCodes.Pop);            ilGenerator.Emit(OpCodes.Ret);        }        static void InitAssembly()        {            AssemblyName assemblyName = new AssemblyName(namespaceName);            assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);            moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, binaryName);        }        static void SaveAssembly()        {            Type t = typeBuilder.CreateType(); //完成Type,这是必须的            assemblyBuilder.Save(binaryName);        }    }}
View Code

 

转载于:https://www.cnblogs.com/tkt2016/p/8675809.html

你可能感兴趣的文章
div或者p标签单行和多行超出显示省略号
查看>>
Elasticsearch 滚动重启 必读
查看>>
Hadoop基本概念
查看>>
java.util.zip压缩打包文件总结一:压缩文件及文件下面的文件夹
查看>>
浅说 apache setenvif_module模块
查看>>
MySQL--数据插入
查看>>
重新学习python系列(二)? WTF?
查看>>
shell脚本统计文件中单词的个数
查看>>
SPCE061A学习笔记
查看>>
sql 函数
查看>>
hdu 2807 The Shortest Path 矩阵
查看>>
熟悉项目需求,要知道产品增删修改了哪些内容,才会更快更准确的在该项目入手。...
查看>>
JavaScript 变量
查看>>
java实用类
查看>>
smarty模板自定义变量
查看>>
研究称90%的癌症由非健康生活习惯导致
查看>>
命令行启动Win7系统操作部分功能
查看>>
排序sort (一)
查看>>
Parrot虚拟机
查看>>
Teamcenter10 step-by-step installation in Linux env-Oracle Server Patch
查看>>