以下是本人根据源码与反编译的IL语法进行对比得到的结论.只供参考,如果出现思路偏差,概不负责哦!
ldstr 字符串-> 将这个字符串压入栈,字符操作前的准备工作
newobj -> 我理解为new一个对象
stloc.0 -> 从栈中取出一个值放入一号变量.stloc.1便是放入2号变量
ldarg.0 -> 我理解为:加载当前方法传入的第一个参数; ldarg.1即为加载第二个参数
br.s -> 中止到代码标签
以下是从网上搜索的一些资源整理
地址:http://www.cnblogs.com/Peter-Zhang/articles/2044794.html
感谢作者!
------------------------------------------------------------------------------
操作码 作用
add, sub, mul, div,rem 用于两个数加减乘除求模
add, or, not,xor 用于在两个值上进行二进制操作
ceq, cgt,clt 用不同的方法比较两个在栈上的值,ceq:是否相等;cgt:是否大约;clt:是否小于
box,unbox 在引用类型和值类型之间转换
ret 退出方法和返回一个值
beq, bgt, ble, blt,switch 控制方法中的条件分支,beg:如果相等就中止到代码标签;bgt:如果大于就中止到代码标签;
ble:如果小于等于就中止到代码标签;blt:如果小于就中止到代码标签;
所有的分支控制操作码都需要给出一个CIL代码标签作为条件为真的跳转目的
br.s (无条件)中止到代码标签
call 调用一个成员
nearer,newobj 在内存中创建一个新的数组或新的对象类型
主要的入栈CIL操作码 (ld 加载)
操作码 作用
ldarg(及多个变化形式) 加载方法的参数到栈中。除了泛型ldarg(需要一个索引作为参数),还有后其他很多的变化形式。
eg.有个数字后缀的ldarg操作码来指定需要加载的参数。同时还有很多ldarg的变化形式允许加载
指定的数据类型(ldarg_i4, 加载int32)和值(ldarg_i4_5 加载一个值为5的int32)
ldc(及多个变化形式) 加载一个常数到栈中
ldfld(及多个变化形式) 加载一个对象实例的成员到栈中
ldloc(及多个变化形式) 加载一个本地变量到栈中
ldobj 获得一个堆对象的所有数据,并将它们放置到栈中
ldstr 加载一个字符串数据到栈中
主要的弹出栈操作码 (st存储)
操作码 作用
pop 删除当前栈顶的值,但是并不影响存储的值
starg 存储栈顶的值到给出方法的参数,根据索引确定这个参数
stloc(及多个变化形式) 弹出当前栈顶的值并存储在一个本地变量列表中,根据所以确定这个参数
stobj 从栈中复制一个特定的类型到指定的内存地址
stfld 用从栈中获得的值替换对象成员的值
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。