JVM指令手册

1、const系列,该系列命令主要负责把简单的数值类型送到栈顶。该系列命令不带参数。注意只把简单的数值类型送到栈 顶时,才使用如下的命令。注意送到栈顶。对于int型,其他的数值请使用push系列命令(比如bipush)。

指令码 			助记符 			说明 
0x02 			iconst_m1 		将int(-1)推送至栈顶 
0x03 			iconst_0 		将int(0)推送至栈顶 
0x04 			iconst_1 		将int(1)推送至栈顶 
0x05 			iconst_2 		将int(2)推送至栈顶 
0x06 			iconst_3 		将int(3)推送至栈顶 
0x07 			iconst_4 		将int(4)推送至栈顶
0x08 			iconst_5 		将int(5)推送至栈顶 
0x09 			lconst_0 		将long(0)推送至栈顶 
0x0a 			lconst_1 		将long(1)推送至栈顶 
0x0b			fconst_0 		将float(0)推送至栈顶 
0x0c 			fconst_1 		将float(1)推送至栈顶 
0x0d 			fconst_2 		将float(2)推送至栈顶 
0x0e			dconst_0 		将double(0)推送至栈顶 
0x0f 			dconst_1 		将double(1)推送至栈顶

2、push系列,该系列命令负责把一个整形数字(长度比较小)送到到栈顶。该系列命令有一个参数,用于指定要送到栈顶的数字。注意该系列命令只能操作一定范围内的整形数值,超出该范围的使用将使用ldc 命令系列。

指令码 			助记符 			说明 
0x10 			bipush 			将单字节的常量值(-128~127)推送至栈顶 
0x11 			sipush 			将一个短整型常量值(-32768~32767)推送至栈顶

3、ldc系列,该系列命令负责把数值常量或String常量值从常量池中推送至栈顶。该命令后面 需要给一个表示常量在常量池中位置(编号)的参数,对于const系列命令和push系列命令操作范围之外的数值类型常量,都放在常量池中,另外,所有不是通过new创建的String都是放在常量池中的。

指令码 			助记符 			说明 
0x12 			ldc 			将int,floatString型常量值从常量池中推送至栈 顶
0x13 			ldc_w 			将int,floatString型常量值从常量池中推送至栈 顶(宽索引) 
0x14 			ldc2_w 			将longdouble型常量值从常量池中推送至栈顶 (宽索引)

4、load系列A,该系列命令负责把本地变量的送到栈顶。这里的本地变量不仅可以是数值类型, 还可以是引用类型。

指令码 			助记符 			说明 
0x15 			iload 			将指定的int型本地变量推送至栈顶 
0x16 			lload 			将指定的long型本地变量推送至栈顶 
0x17 			fload 			将指定的float型本地变量推送至栈顶 
0x18 			dload 			将指定的double型本地变量推送至栈顶 
0x19 			aload 			将指定的引用类型本地变量推送至栈顶 
0x1a 			iload_0 		将第一个int型本地变量推送至栈顶 
0x1b 			iload_1 		将第二个int型本地变量推送至栈顶 
0x1c 			iload_2 		将第三个int型本地变量推送至栈顶 
0x1d 			iload_3 		将第四个int型本地变量推送至栈顶 
0x1e 			lload_0 		将第一个long型本地变量推送至栈顶
0x1f 			lload_1 		将第二个long型本地变量推送至栈顶 
0x20 			lload_2 		将第三个long型本地变量推送至栈顶 
0x21 			lload_3 		将第四个long型本地变量推送至栈顶 
0x22 			fload_0 		将第一个float型本地变量推送至栈顶 
0x23 			fload_1 		将第二个float型本地变量推送至栈顶 
0x24 			fload_2 		将第三个float型本地变量推送至栈顶 
0x25 			fload_3 		将第四个float型本地变量推送至栈顶 
0x26 			dload_0 		将第一个double型本地变量推送至栈顶 
0x27 			dload_1 		将第二个double型本地变量推送至栈顶 
0x28 			dload_2 		将第三个double型本地变量推送至栈顶 
0x29 			dload_3 		将第四个double型本地变量推送至栈顶 
0x2a 			aload_0 		将第一个引用类型本地变量推送至栈顶 
0x2b 			aload_1 		将第二个引用类型本地变量推送至栈顶 
0x2c 			aload_2 		将第三个引用类型本地变量推送至栈顶 
0x2d 			aload_3 		将第四个引用类型本地变量推送至栈顶

5、load系列B,该系列命令负责把数组的某项送到栈顶。该命令根据栈里内容来确定对哪个数组 的哪项进行操作。

指令码 			助记符 			说明 
0x2e 			iaload 			将int型数组指定索引的值推送至栈顶 
0x2f 			laload 			将long型数组指定索引的值推送至栈顶 
0x30 			faload 			将float型数组指定索引的值推送至栈顶 
0x31 			daload 			将double型数组指定索引的值推送至栈顶
0x32 			aaload 			将引用型数组指定索引的值推送至栈顶 
0x33 			baload 			将booleanbyte型数组指定索引的值推送至 栈顶
0x34 			caload 			将char型数组指定索引的值推送至栈顶 
0x35 			saload 			将short型数组指定索引的值推送至栈顶

6、store系列A,该系列命令负责把栈顶的值存入本地变量。这里的本地变量不仅可以是数值类 型,还可以是引用类型。

指令码 			助记符 			说明
0x36 			istore 			将栈顶int型数值存入指定本地变量 
0x37 			lstore 			将栈顶long型数值存入指定本地变量 
0x38 			fstore 			将栈顶float型数值存入指定本地变量 
0x39 			dstore 			将栈顶double型数值存入指定本地变量 
0x3a 			astore 			将栈顶引用型数值存入指定本地变量 
0x3b 			istore_0		将栈顶int型数值存入第一个本地变量 
0x3c 			istore_1 		将栈顶int型数值存入第二个本地变量 
0x3d 			istore_2 		将栈顶int型数值存入第三个本地变量 
0x3e 			istore_3 		将栈顶int型数值存入第四个本地变量 
0x3f 			lstore_0 		将栈顶long型数值存入第一个本地变量 
0x40 			lstore_1 		将栈顶long型数值存入第二个本地变量 
0x41 			lstore_2 		将栈顶long型数值存入第三个本地变量 
0x42 			lstore_3 		将栈顶long型数值存入第四个本地变量 
0x43 			fstore_0 		将栈顶float型数值存入第一个本地变量 
0x44 			fstore_1 		将栈顶float型数值存入第二个本地变量 
0x45 			fstore_2 		将栈顶float型数值存入第三个本地变量
0x46 			fstore_3 		将栈顶float型数值存入第四个本地变量 
0x47 			dstore_0 		将栈顶double型数值存入第一个本地变量 
0x48 			dstore_1 		将栈顶double型数值存入第二个本地变量 
0x49 			dstore_2 		将栈顶double型数值存入第三个本地变量 
0x4a 			dstore_3 		将栈顶double型数值存入第四个本地变量 
0x4b 			astore_0 		将栈顶引用型数值存入第一个本地变量 
0x4c 			astore_1 		将栈顶引用型数值存入第二个本地变量 
0x4d 			astore_2 		将栈顶引用型数值存入第三个本地变量 
0x4e 			astore_3 		将栈顶引用型数值存入第四个本地变量

7、store系列B,该系列命令负责把栈顶项的值存到数组里。该命令根据栈里内容来确定对哪个数组的哪项进行操作。

指令码 			助记符 			说明 
0x4f 			iastore 		将栈顶int型数值存入指定数组的指定索引位置 
0x50 			lastore 		将栈顶long型数值存入指定数组的指定索引位置 
0x51 			fastore 		将栈顶float型数值存入指定数组的指定索引位置 
0x52 			dastore 		将栈顶double型数值存入指定数组的指定索引位置 
0x53 			aastore 		将栈顶引用型数值存入指定数组的指定索引位置 
0x54 			bastore 		将栈顶booleanbyte型数值存入指定数组的指定 索引位置 
0x55 			castore 		将栈顶char型数值存入指定数组的指定索引位置
0x56 			sastore 		将栈顶short型数值存入指定数组的指定索引位置

8、pop系列,该系列命令只是简单对栈顶进行操作。

指令码 			助记符 			说明 
0x57 			pop 			将栈顶数值弹出 (数值不能是longdouble类型的) 
0x58 			pop2 			将栈顶的一个(longdouble类型的)或两个数值弹出 (其它) 
0x59 			dup 			复制栈顶数值(数值不能是longdouble类型的)并将 复制值压入栈顶 
0x5a 			dup_x1 			复制栈顶数值(数值不能是longdouble类型的)并将两 个复制值压入栈顶 
0x5b 			dup_x2 			复制栈顶数值(数值不能是longdouble类型的)并将三 个(或两个)复制值压入栈顶 
0x5c 			dup2 			复制栈顶一个(longdouble类型的)或两个(其它) 数值并将复制值压入栈顶 
0x5d 			dup2_x1 		复制栈顶数值(longdouble类型的)并将两个复制值 压入栈顶 
0x5e 			dup2_x2 		复制栈顶数值(longdouble类型的)并将三个(或两 个)复制值压入栈顶

9、栈顶元素数学操作及移位操作系列,该系列命令用于对栈顶元素行数学操作,和对数值进行移位操作。移位操作的操 作数和要移位的数都是从栈里取得。

指令码 			助记符 			说明 
0x5f 			swap 			将栈最顶端的两个数值互换(数值不能是longdouble类型的) 
0x60 			iadd 			将栈顶两int型数值相加并将结果压入栈顶 
0x61 			ladd 			将栈顶两long型数值相加并将结果压入栈顶 
0x62 			fadd 			将栈顶两float型数值相加并将结果压入栈顶 
0x63 			dadd 			将栈顶两double型数值相加并将结果压入栈顶
0x64 			isub 			将栈顶两int型数值相减并将结果压入栈顶 
0x65 			lsub 			将栈顶两long型数值相减并将结果压入栈顶 
0x66 			fsub 			将栈顶两float型数值相减并将结果压入栈顶 
0x67 			dsub 			将栈顶两double型数值相减并将结果压入栈顶 
0x68 			imul 			将栈顶两int型数值相乘并将结果压入栈顶 
0x69 			lmul 			将栈顶两long型数值相乘并将结果压入栈顶 
0x6a 			fmul 			将栈顶两float型数值相乘并将结果压入栈顶 
0x6b 			dmul 			将栈顶两double型数值相乘并将结果压入栈顶 
0x6c 			idiv 			将栈顶两int型数值相除并将结果压入栈顶 
0x6d 			ldiv 			将栈顶两long型数值相除并将结果压入栈顶 
0x6e 			fdiv 			将栈顶两float型数值相除并将结果压入栈顶 
0x6f 			ddiv 			将栈顶两double型数值相除并将结果压入栈顶 
0x70 			irem 			将栈顶两int型数值作取模运算并将结果压入栈顶 
0x71 			lrem 			将栈顶两long型数值作取模运算并将结果压入栈顶 
0x72 			frem 			将栈顶两float型数值作取模运算并将结果压入栈顶 
0x73 			drem 			将栈顶两double型数值作取模运算并将结果压入栈 顶
0x74 			ineg 			将栈顶int型数值取负并将结果压入栈顶 
0x75 			lneg 			将栈顶long型数值取负并将结果压入栈顶 
0x76 			fneg 			将栈顶float型数值取负并将结果压入栈顶 
0x77 			dneg 			将栈顶double型数值取负并将结果压入栈顶 
0x78 			ishl 			将int型数值左移位指定位数并将结果压入栈顶 
0x79 			lshl 			将long型数值左移位指定位数并将结果压入栈顶 
0x7a 			ishr 			将int型数值右(符号)移位指定位数并将结果压入栈顶
0x7b 			lshr 			将long型数值右(符号)移位指定位数并将结果压入栈顶 
0x7c 			iushr 			将int型数值右(无符号)移位指定位数并将结果压入栈顶 
0x7d 			lushr 			将long型数值右(无符号)移位指定位数并将结果压入栈顶 
0x7e 			iand 			将栈顶两int型数值作“按位与”并将结果压入栈顶 
0x7f 			land 			将栈顶两long型数值作“按位与”并将结果压入栈顶
0x80 			ior 			将栈顶两int型数值作“按位或”并将结果压入栈顶
0x81 			lor 			将栈顶两long型数值作“按位或”并将结果压入栈顶
0x82 			ixor 			将栈顶两int型数值作“按位异或”并将结果压入栈顶
0x83 			lxor 			将栈顶两long型数值作“按位异或”并将结果压入栈顶

10、自增减指令系列,该指令用于对本地(局部)变量进行自增减操作。该指令第一参数为本地变量的编 号,第二个参数为自增减的数量。

指令码 			助记符 			说明 
0x84 			iinc 			将指定int型变量增加指定值(i++, i--, i+=2

11、类型转化系列,该系列指令负责对栈顶数值类型进行类型转化,并把结果压入栈顶。

指令码 			助记符 			说明 
0x85 			i2l 			将栈顶int型数值强制转换成long型数值并将 结果压入栈顶 
0x86 			i2f 			将栈顶int型数值强制转换成float型数值并将 结果压入栈顶 
0x87 			i2d 			将栈顶int型数值强制转换成double型数值并 将结果压入栈顶 
0x88 			l2i 			将栈顶long型数值强制转换成int型数值并将 结果压入栈顶
0x89 			l2f 			将栈顶long型数值强制转换成float型数值并 将结果压入栈顶 
0x8a 			l2d 			将栈顶long型数值强制转换成double型数值 并将结果压入栈顶 
0x8b 			f2i 			将栈顶float型数值强制转换成int型数值并将 结果压入栈顶 
0x8c 			f2l 			将栈顶float型数值强制转换成long型数值并 将结果压入栈顶 
0x8d 			f2d 			将栈顶float型数值强制转换成double型数值 并将结果压入栈顶 
0x8e 			d2i 			将栈顶double型数值强制转换成int型数值并 将结果压入栈顶 
0x8f 			d2l 			将栈顶double型数值强制转换成long型数值 并将结果压入栈顶 
0x90 			d2f 			将栈顶double型数值强制转换成float型数值 并将结果压入栈顶 
0x91 			i2b 			将栈顶int型数值强制转换成byte型数值并将 结果压入栈顶 
0x92 			i2c 			将栈顶int型数值强制转换成char型数值并将 结果压入栈顶 
0x93 			i2s 			将栈顶int型数值强制转换成short型数值并将 结果压入栈顶

12、比较指令系列A,该系列指令用于对栈顶非int型元素进行比较,并把结果压入栈顶。

指令码 			助记符 			说明 
0x94 			lcmp 			比较栈顶两long型数值大小,并将结果(10-1)压入栈顶 
0x95 			fcmpl 			比较栈顶两float型数值大小,并将结果(10-1)压入栈顶;当其中一个数值为NaN时,将-1压入栈顶 
0x96 			fcmpg 			比较栈顶两float型数值大小,并将结果(10-1)压入栈顶;当其中一个数值为NaN时,将1压入栈顶 
0x97 			dcmpl 			比较栈顶两double型数值大小,并将结果(10-1)压入栈顶;当其中一个数值为NaN时,将-1压入栈顶
0x98 			dcmpg 			比较栈顶两double型数值大小,并将结果(10-1)压入栈顶;当其中一个数值为NaN时,将1压入栈顶

13、有条件跳转指令系列A,该系列指令用于对栈顶int型元素进行比较,根据结果进行跳转。第一个参数为 要跳转到的代码的地址(这里的地址是指其指令在函数内是第几个指令)。注意 对于boolean型,其实是把它当做int型来处理的。另外对于引用比较使用的 时,其实是对存储的对象的地址进行比较。

指令码 			助记符 			说明 
0x99 			ifeq 			当栈顶int型数值等于0时跳转 
0x9a 			ifne 			当栈顶int型数值不等于0时跳转 
0x9b 			iflt 			当栈顶int型数值小于0时跳转 
0x9c 			ifge 			当栈顶int型数值大于等于0时跳转 
0x9d 			ifgt 			当栈顶int型数值大于0时跳转 
0x9e 			ifle 			当栈顶int型数值小于等于0时跳转
0x9f 			if_icmpeq 		比较栈顶两int型数值大小,当结果等于0时跳转 
0xa0 			if_icmpne 		比较栈顶两int型数值大小,当结果不等于0时跳转 
0xa1 			if_icmplt 		比较栈顶两int型数值大小,当结果小于0时跳转 
0xa2 			if_icmpge 		比较栈顶两int型数值大小,当结果大于等于0时跳转 
0xa3 			if_icmpgt 		比较栈顶两int型数值大小,当结果大于0时跳转 
0xa4 			if_icmple 		比较栈顶两int型数值大小,当结果小于等于0时跳转 
0xa5 			if_acmpeq 		比较栈顶两引用型数值,当结果相等时跳转 
0xa6 			if_acmpne 		比较栈顶两引用型数值,当结果不相等时跳转

14、有条件跳转指令系列B,该系列用于根据引用是否为空,来进行相应的指令跳转。

指令码 			助记符 			说明 
0xc6 			ifnull 			为null时跳转 
0xc7 			ifnonnull 		不为null时跳转

15、无条件跳转指令系列,该系列指令用于进行无条件指令跳转。

指令码 			助记符 			说明 
0xa7 			goto 			无条件跳转 
0xa8 			jsr 			跳转至指定16位offset位置,并将jsr下一条指 令地址压入栈顶 
0xa9 			ret 			返回至本地变量指定的index的指令位置(一般 与jsr, jsr_w联合使用)
0xaa 			tableswitch 	用于switch条件跳转,case值连续(可变长度 指令) 
0xab 			lookupswitch 	用于switch条件跳转,case值不连续(可变长 度指令)
0xc8 			goto_w 			无条件跳转(宽索引) 
0xc9 			jsr_w 			跳转至指定32位offset位置,并将jsr_w下一 条指令地址压入栈顶

16、返回指令系列,该系列指令用于从函数中返回。如果有返回值的话,都把函数的返回值放在栈道 中,以便它的调用方法取得它。

指令码 			助记符 			说明 
0xac 			ireturn 		从当前方法返回int 
0xad 			lreturn 		从当前方法返回long 
0xae 			freturn 		从当前方法返回float 
0xaf 			dreturn 		从当前方法返回double 
0xb0 			areturn 		从当前方法返回对象引用 
0xb1 			return 			从当前方法返回void

17、域操作指令系列,该系列指令用于对静态域和非静态域进行读写。该系列命令需要跟一个表明域编号的参数。

指令码 			助记符 			说明 
0xb2 			getstatic 		获取指定类的静态域,并将其值压入栈顶 
0xb3 			putstatic 		用栈顶的值为指定的类的静态域赋值 
0xb4 			getfield 		获取指定类的实例域,并将其值压入栈顶 
0xb5 			putfield 		用栈顶的值为指定的类的实例域赋值

18、方法操作命令系列,该系列指令用于对静态方法和非静方法进行调用。该系列命令需要跟一个表明方法编号的参数。如果方法有传入参数的话,则需要先压栈到栈顶。另外,方法的返回参数是保存 到栈顶的,因此我们可以通过栈道值取得方法的返回值。

指令码 			助记符 			说明 
0xb6 			invokevirtual 	调用实例方法
0xb7 			invokespecial 	调用超类构造方法,实例初始化方法,私有方法 
0xb8 			invokestatic 	调用静态方法 
0xb9 			invokeinterface 调用接口方法

19、new及数组系列,该系列用于创建一个对象和数组。

指令码 			助记符 			说明 
0xbb 			new 			创建一个对象,并将其引用值压入栈顶 
0xbc 			newarray 		创建一个指定原始类型(如int, float, char…)的数组,并将其引用值压入栈顶 
0xbd 			anewarray 		创建一个引用型(如类,接口,数组)的数 组,并将其引用值压入栈顶 
0xbe 			arraylength 	获得数组的长度值并压入栈顶

20、异常抛出指令

指令码 			助记符 			说明 
0xbf 			athrow 			将栈顶的异常抛出

21、对象操作指令系列,该系列指令用于操作对象

指令码 			助记符 			说明 
0xc0 			checkcast 		检验类型转换,检验未通过将抛出 ClassCastException 
0xc1 			instanceof 		检验对象是否是指定的类的实例,如果是 将1压入栈顶,否则将0压入栈顶 
0xc2 			monitorenter 	获得对象的锁,用于同步方法或同步块 
0xc3 			monitorexit 	释放对象的锁,用于同步方法或同步块

22、new多维数组

指令码 			助记符 			说明 
0xc5 			multianewarray 	创建指定类型和指定维度的多维数组(执行该指令 时,操作栈中必须包含各维度的长度值),并将其引用值压入栈顶
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值