ldloc的意思是把局部变量压到堆栈里面,后面的.0表示第零个局部变量(也就是a了);add则把栈顶的两个元素弹出来并且相加,结果压到堆栈顶上;stloc则把栈顶的内容弹出来,保存到局部变量当中。现在应该看出来了,ld就是load的缩写,st是store的缩写,loc是local。那么还有没有其他的呢?大家可以看一下下面的表:
主要操作 | 操作数范围/条件 | 操作数类型 | 操作数 | |||||||||
缩写 | 全称 | 含义 | 缩写 | 全称 | 含义 | 缩写 | 全称 | 含义 | 缩写 | 全称 | 含义 | |
ld | load | 将操作数压到堆栈当中,相当于: push ax | arg | argument | 参数 | ? | ? | 操作数中的数值 | .0 | ? | 第零个参数 * | |
.1 | ? | 第一个参数 | ||||||||||
.2 | ? | 第二个参数 | ||||||||||
.3 | ? | 第三个参数 | ||||||||||
.s xx | (short) | 参数xx | ||||||||||
a | address | 操作数的地址 | 只有 .s xx,参见ldarg.s | |||||||||
loc | local | 局部变量 | 参见ldarg | |||||||||
fld | field | 字段(类的全局变量) | 参见ldarg | xx | ? | xx字段,eg: ldfld xx | ||||||
c | const | 常量 | .i4 | int 4 bytes | C#里面的int,其他的类型例如short需要通过conv转换 | .m1 | minus 1 | -1 | ||||
.0 | ? | 0 | ||||||||||
.1 | ? | 1 | ||||||||||
…… | ||||||||||||
.8 | 8 | |||||||||||
.s | (short) | 后面跟一个字节以内的整型数值(有符号的) | ||||||||||
? | ? | 后面跟四个字节的整型数值 | ||||||||||
.i8 | int 8 bytes | C#里面的long | ? | ? | 后面跟八个字节的整型数值 | |||||||
.r4 | real 4 bytes | C#里面的float | ? | ? | 后面跟四个字节的浮点数值 | |||||||
.r8 | real 8 bytes | C#里面的double | ? | ? | 后面跟八个字节的浮点数值 | |||||||
null | null | 空值(也就是0) | ? | ? | ? | ? | ? | ? | ||||
st | store | 将堆栈内容弹出到操作数中,相当于: pop ax | 参见ld ** | |||||||||
conv | convert | 数值类型转换,仅仅用纯粹的数值类型间的转换,例如int/float等 | ? | ? | ? | .i1 | int 1 bytes | C#里面的sbyte | ? | ? | ? | |
.i2 | int 2 bytes | C#里面的short | ||||||||||
.i4 | int 4 bytes | C#里面的int | ||||||||||
.i8 | int 8 bytes | C#里面的long | ||||||||||
.r4 | real 4 bytes | C#里面的float | ||||||||||
.r8 | real 8 bytes | C#里面的double | ||||||||||
.u4 | uint 4 bytes | C#里面的uint | ||||||||||
.u8 | uint 8 bytes | C#里面的ulong | ||||||||||
b/br | branch | 条件和无条件跳转,相当于: jmp/jxx label_jump | br | ? | ? | 无条件跳转 | ? | ? | ? | ? | ? | 后面跟四个字节的偏移量(有符号) |
.s | (short) | 后面跟一个字节的偏移量(有符号) | ||||||||||
false | false | 值为零的时候跳转 | ? | ? | ? | 参见br | ||||||
true | true | 值不为零的时候跳转 | ? | ? | ? | |||||||
b | eq | equal to | 相等 | ? | ? | ? | ||||||
ne | not equal to | 不相等 | un | unsigned or unordered | 无氟好的(对于整数)或者无序的(对于浮点) | |||||||
gt | greater than | 大于 | ||||||||||
lt | less than | 小于 | ||||||||||
ge | greater than or equal to | 大于等于 | ||||||||||
le | less than or equal to | 小于等于 | ||||||||||
call | call | 调用 | ? | ? | ? | ? | ? | (非虚函数) | ? | |||
? | ? | ? | virt | virtual | 虚函数 |
* 最左边的是参数0,然后是参数1、2、3……。如果不是在静态当中,参数0相当于C#的this(VB的Me),该参数不需要代码传递,此时最左边的参数是参数1,也就是从.1开始。