JVM 虚拟机指令集笔记

本文详细介绍了JVM虚拟机的指令集,包括数据类型、加载和存储指令、运算指令、类型转换、类型创建与数组操作、方法和字段访问、控制指令以及异常处理。内容涵盖int、long等数据类型的范围,以及如iload、istore等指令的使用。
摘要由CSDN通过智能技术生成

#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)

  1. 格式:Opcode(操作码) + Operands[] (操作数)
  2. 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. 指令列表
    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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值