java代码是不能直接在JVM平台上执行的,首先要被编译成.class文件,随后才可以在JVM上执行。
首先看一下JVM的构成图:
JVM由类加载器子系统,内存空间(又分为:方法区、java堆、java栈、本地方法栈、程序计数器五部分)
一段.class 代码经过反编译后是一段 类 汇编代码,下面列举了一些常见的指令集:
在讨论指令集之前,首先要讲一个概念,那就是对栈帧进一步拆分。 栈帧一共分为四个部分:局部变量表、操作数栈、动态链接、方法返回地址 其中,局部变量表和操作数栈是最重要的两个部分 局部变量表存放在方法中定义的局部变量 操作数栈相当于jvm的一个缓存 所有的操作都必须在此处进行 所有的变量都必须加载到操作数栈才能被使用 所以,所谓指令,就是在局部变量表和操作数栈来回倒腾的过程。 下面对指令进行分类讲解: (1)入栈指令 整型入栈指令: 取值-1~5采用iconst指令; 取值-128~127采用bipush指令; 取值-32768~32767采用sipush指令; 取值-2147483648~2147483647采用ldc指令。 非整型入栈指令: float,String类型也使用ldc指令 double和long类型使用ldc_2w boolean类型视作0和1 null的入栈指令为:aconst_null (2)存储指令 将操作数栈中的常量保存在局部变量表中的某个位置 如: istore_1:将上面入栈的整型常量保存在局部变量表中的第1个位置 fstore_2:将上面入栈的浮点常量保存在局部变量表中的第2个位置 dstore_10:将上面入栈的双浮点常量保存在局部变量表中的第10个位置 lstore_20:将上面入栈的长整常量保存在局部变量表中的第20个位置 astore_100:将上面入栈的引用常量保存在局部变量表中的第100个位置 (3)变量入栈指令 iload_1:局部变量表中的第1个位置的整型变量入栈 fload_2:局部变量表中的第1个位置的浮点型变量入栈 dload_10:局部变量表中的第1个位置的双浮点型变量入栈 lload_20:局部变量表中的第1个位置的长整型变量入栈 aload_100:局部变量表中的第100个位置的引用型变量入栈 (4)计算指令 加:iadd、ladd、fadd、dadd 减:isub、lsub、fsub、dsub 乘:imul、lmul、fmul、dmul 除:idiv、ldiv、fdiv、ddiv 注意:栈顶计算,一次只能计算一个表达式
|