#JAVA数据类型格式
#byte 1字节 -128~127
#short 2字节 -32768~32767
#int 4字节 -2147483648~2147483647
#long 8字节 -9223372036854774808~9223372036854774807
long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-2的63次方到2的63次方-1)
- 格式:Opcode(操作码) + Operands[] (操作数)
- Java字节码直接运行在虚拟机上而非对CPU寄存器直接运算,所以指令集也做了一层C封装,Java的操作码会针对不同的(Operands[])操作数数据类型提供对应的(Opcode)操作码
例如:iload,bload,fload,dload,aload 这几个指令都是加载变量到操作栈(其中,i<=>int;b<=>byte;s<=>short;c<=>char;f<=>float;d<=>double;a<=>reference) - 指令列表
3.1 加载和存储指令
(1)加载局部变量(JVM内存空间中的数据栈)到操作栈(JVM内存空间中的操作栈):iload、iload_、lload、lload_、fload、fload_、dload、dload_、aload、aload_(其中_代表偏移量,aload 5代表读取数据栈中第五个对象引用到操作栈)
(2)存储操作栈(JVM内存空间中的操作栈)到局部变量(JVM内存空间中的数据栈):istore、istore_、lstore、lstore_、fstore、fstore_、dstore、dstore_、astore、astore_
(3)加载常量(JVM内存空间中的常量池)到操作数栈:bipush、sipush、ldc、ldc_w、ldc2_w、aconst_null、iconst_m1、iconst_、lconst_、fconst_、dconst_
(4)扩充局部变量表的访问索引的指令:wide
*加载一个int型变量到操作栈 iload byte_addr iload为Opcode byte_addr为操作数局部变量表int型索引
*所以一个Java栈帧的局部变量只能有byte_addr[8](2^8 = 256)个
3.2 运算指令
(1)加法指令:iadd、ladd、fadd、dadd
(2)减法指令:isub、lsub、fsub、dsub
(3)乘法指令:imul、lmul、fmul、dmul
(4)除法指令:idiv、ldiv、fdiv、ddiv
(5)求余指令:irem、lrem、frem、drem
(6)取反指令:ineg、lneg、fneg、dneg
(7)位移指令:ishl、ishr、iushr、lshl、lshr、lushr
(8)按位或指令:ior、lor
(9)按位与指令:iand、land
(10)按位异或指令:ixor、lxor
(11)局部变量自增指令:iinc
(12)比较指令:dcmpg、dcmpl、fcmpg、fcmpl、lcmp
*位运算只支持int,long型
*innc等价于++,–,+=,-=几个单目操作符
3.3 类型转换指令
(1)窄化类型转换:i2b、i2c、i2s、l2i、f2i、f2l、d2i、d2l、d2f
(2)宽化类型转换直接复制无需指令
3.4 类型创建和数组操作指令
(1)类型实例创建:new
(2)数组实例创建:newarray,anewarray,multianewarray
(3)数组加载到操作栈:baload、caload、saload、iaload、laload、faload、daload、aaload
(4)数组存储到操作数栈:bastore、castore、sastore、iastore、fastore、dastore、aastore
(5)数组取长度指令:arraylength
*newarray操作数为T_BOOLEAN,T_CHAR…这些基本数据类型
*anewarray操作数为一个16bit的常量池指针,指向一个类型描述符
*multianewarray多维数组创建
3.5 方法和字段访问指令
(1)类变量访问:getstatic、putstatic
(2)成员变量访问:getfield、putfield
(3)方法访问:invokevirtual、invokeinterface、invokespecial、invokestatic
(4)方法返回指令:lreturn、freturn、dreturn和areturn
*invokevirtual访问成员方法、重写方法、重载方法
*invokespecial 访问私有方法、init、父类方法
3.6 控制指令
(1)操作数栈指令:pop、pop2、dup、dup2、dup_x1、dup2_x1、dup_x2、dup2_x2和swap;
(2)条件分支:ifeq、iflt、ifle、ifne、ifgt、ifge、ifnull、ifnonnull、if_icmpeq、if_icmpne、if_icmplt, if_icmpgt、if_icmple、if_icmpge、if_acmpeq和if_acmpne
(3)复合条件分支:tableswitch、lookupswitch
(4)无条件分支:goto、goto_w、jsr、jsr_w、ret
3.7 异常抛出指令 athrow