《深入Java虚拟机》笔记:指令集 (转)

《深入Java虚拟机》笔记:指令集

 

指令 含义
iconst_m1 把int型常量-1压入栈中
iconst_0 把int型常量压入栈中
fconst_1 把float型常量1压入栈中
lconst_2 把long型常量2压入栈中
dconst_3 把double型常量3压入栈中
bipush byte1 把byte1转换成int型压入栈中
sipush byte1,byte2 把byte1,byte2组成的short转换成int压入栈中
aconst_null 把空对象压入栈中
ldc indexbyte1 把常量池中指定下标的一个字长压入栈
ldc_w indexbyte1,indexbyte2 把常量池中指定下标的一个字长压入栈
ldc2_w indexbyte1,intexbyte2 把常量池中指定下标的两个字长压入栈
pop 弹出栈顶的一个字
pop2 弹出栈顶的两个字
swap 交换栈顶的两个字
dup 复制栈顶的一个字
dup2 复制栈顶的两个字
dup_x1 复制一字,并将弹出的两字压栈
dup_x2 复制一字,并将弹出的三字压栈
dup2_x1 复制两字,并将弹出的三字压栈
dup2_x2 复制两字,并将弹出的四字压栈
iload vindex 将位置vindex的int型局部变量压入栈
iload_0 将位置0的int型局部变量压入栈
fload vindex 将位置vindex的float型局部变量压入栈
fload_0 将位置0的float型局部变量压入栈
lload vindex 将位置vindex的long型局部变量压入栈
lload_0 将位置0的long型局部变量压入栈
dload vindex 将位置vindex的double型局部变量压入栈
dload_0 将位置0的double型局部变量压入栈
aload vindex 将位置vindex的对象引用局部变量压入栈
aload_0 将位置0的对象引用局部变量压入栈
istore vindex 弹出int型,存储在vindex处的局部变量
istore_0 弹出int型,存储在0处的局部变量
fstore vindex 弹出float型,存储在vindex处的局部变量
fstore_0 弹出float型,存储在0处的局部变量
lstore vindex 弹出long型,存储在vindex处的局部变量
lstore_0 弹出long型,存储在0处的局部变量
dstore vindex 弹出double型,存储在vindex处的局部变量
dstore_0 弹出double型,存储在0处的局部变量
astore vindex 弹出对象引用类型,存储在vindex处的局部变量
astore_0 弹出对象引用类型,存储在0处的局部变量
wide iload byte1,byte2 wide能把原来的一字节的参数变成处理两字节
i2l 把int类型转换成long类型,其他类似,不再举例
iadd 弹出两个int型,相加后结果压入栈
ladd 弹出两个long型,相加后结果压入栈
iinc vindex,const 把常量const与位于vindex的局部变量相加
wide iinc index1,intdex2,const1,const2 把常量与位于vindex1,vindex2的局部变量相加
isub 弹出两个int型,相减后lint型结果压入栈
lsub 弹出两个long型,相减后long型结果压入栈
imul 弹出两个int型,相乘后int型结果压入栈
lmul 弹出两个long型,相乘后long型结果压入栈
idev 弹出两个int型,相除后int型结果压入栈
ldev 弹出两个long型,相除后long型结果压入栈
irem 弹出两个int型,取余后int型结果压入栈
lrem 弹出两个long型,取余后long型结果压入栈
ineg 弹出一个int型,取反后int型结果压入栈
lneg 弹出一个long型,取反后long型结果压入栈
ishl 向左对int型值进行移位操作(long类似)
ishr 向右对int型值进行算术移位操作
iushr 向右对int型值进行逻辑移位操作
iand 对两个int类型值进行逻辑与运算(long类似)
ior 对两个int类型值进行逻辑或运算
ixor 对两个int类型值进行逻辑异或运算
fadd 弹出两个float型,相加后float型结果压入栈
fsub 弹出两个float型,相减后float型结果压入栈
fmul 弹出两个float型,相乘后float型结果压入栈
fdiv 弹出两个float型,相除后float型结果压入栈
frem 弹出两个float型,取余后float型结果压入栈
new indexbyte1,indexbyte2 在堆中创建一个新的对象,将其压入栈中
putfield indexbyte1,intdebyte2 设置对象字段的值,值和对象引用都从栈获取
getfield indexbyte1,indexbyte2 将对象字段压入栈,对象引用从栈中获取
putstatic indexbyte1,indexbyte2 设置类静态变量的值,从栈中获取
getstatic indexbyte1,indexbyte2 将静态变量压入栈
checkcast indexbyte1,indexbyte2 如果栈中的引用不是指定位置的类,则抛出异常
instanceof indexbyte1,indexbyte2 同上,不过是往结果中压入true或false
newarray atype 从栈中弹出长度,分配atype类型的数组
anewarray indexbyte1,intdexbyte2 从栈中取长度,index取类型
multianewarray index1,index2,dimensions 分配多维数组
arraylength 从栈中弹出一个引用,并将其长度压入栈
baload 从栈中取数组引用和下标,把对应boolean压入栈
caload 同上,char
saload 同上,short
iaload 同上,int
laload 同上,long
faload 同上,folat
daload 同上,double
aaload 同上,array
bastore
将byte或boolean类型的值value、索引index、数组引用arrayref弹出栈,赋值为arrayref[index]=value

其他类型同上

ifeq branchbyte1,branchbyte2 从栈中弹出int型,为0则跳转到指定的分支执行
ifne branchbyte1,branchbyte2 同上,不为0则跳转到指定的分支执行
iflt branchbyte1,branchbyte2 同上,如果小于0,则跳转到指定的分支执行
ifle branchbyte1,branchbyte2 同上,如果小于等于0,则跳转到指定的分支执行
ifgt branchbyte1,branchbyte2 同上,如果大于0,则跳转到指定的分支执行
ifge branchbyte1,branchbyte2 同上,如果大于等于0,则跳转到指定的分支执行
if_icmpeq branchbyte1,branchbyte2 栈中弹出两个int,如果的一个等于第二个,跳转
if_icmpme branchbyte1,branchbyte2 栈中弹出两个int,如果的一个不等于第二个,跳转
if_icmplt branchbyte1,branchbyte2 栈中弹出两个int,如果的一个小于第二个,跳转
if_icmple branchbyte1,branchbyte2 栈中弹出两个int,如果的一个小于等于第二个,跳转
if_icmpgt branchbyte1,branchbyte2 栈中弹出两个int,如果的一个大于第二个,跳转
if_icmpge branchbyte1,branchbyte2 栈中弹出两个int,如果的一个大于等于第二个,跳转
lcmp 从栈中弹出两个long,把结果-1、0、1放入栈
fcmpg 从栈中弹出两个float,把结果-1、0、1放入栈
fcmpl 从栈中弹出两个float,把结果-1、0、1放入栈
dcmpg 从栈中弹出两个double,把结果-1、0、1放入栈
dcmpl 从栈中弹出两个double,把结果-1、0、1放入栈
ifnull branchbyte1,branchbyte2 从栈中弹出,如果是null就跳到分支
ifnonnull branchbyte1,branchbyte2 从栈中弹出,如果不是null就跳到分支

 

 

 

 

时间: 2024-11-05 15:00:37

《深入Java虚拟机》笔记:指令集 (转)的相关文章

《深入解析Android 虚拟机》——2.2 Java虚拟机概述

2.2 Java虚拟机概述 Java虚拟机(JVM)是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能模拟来实现的.Java虚拟机有自己完善的硬件架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.JVM虚拟机的运作结构如图2-1所示. 从该图中可以看到,JVM是运行在操作系统之上的,与硬件没有直接的交互.JVM的具体组成部分如图2-2所示. (1)使用JVM的原因. Java语言的一个非常重要的特点就是与平台的无关性.而使用JVM是实现这一特点的关键.一般的高级语言如果要在

Java虚拟机体系结构

JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例.每个Java程序都运行于它自己的Java虚拟机实例中. Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序.而这个main()方法必须是共有的(public).静态的(static).返回值为void,并且接受

理解Java虚拟机体系结构(转)

1 概述 众所周知,Java支持平台无关性.安全性和网络移动性.而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操作系统是什么.正是得益于Java虚拟机,它号称的"一次编译,到处运行"才能有所保障. 1.1 Java程序执行流程 Java程序的执行依赖于编译环境和运行环境.源码代码转变成可执行的机器代码,由下面的流程完成: Java技术的核心就是Java虚拟机,因为所有的Java程序都在虚拟机上运行.Java程序的运行需要Java

java虚拟机学习笔记

笔记 1.编译顺序:                 编译器                     虚拟机      虚拟机          java源文件*.java------->字节码*.class------>类装载器--->执行引擎 一个.class文件只能包含一个类或接口.因此.java文件中定义了多少类,编译时就会生成多少.class文件(内部类不算). 2.java程序可以选择两种方式访问底层系统,由程序员选择:(1).通过java程序调用javaapi调用本地方法,

java虚拟机学习笔记2

笔记 11.数组数组也是类的对象.具有相同类型和维数的数组属于同一个类(不管长度只看维数).数组的长度属于对象实例.多维数组也是一维数组.如二 维数组,即为一个一维数组,该一维数组的每个元素是一个数组的引用.数组和普通对象一样也存储在堆中.数组名为数组的引用,通过索引即数组标号来访问数组内容. 12.异常在java栈帧的帧数据区内保存有针对该方法的异常表的引用.异常表记载了该方法的字节码(*.class)受catch子句保护的范围(即try子句里的 字节码).当某个方法抛出异常时,虚拟机在对应的

深入Java虚拟机读书笔记[10:20]

第十章 栈和局部变量操作 第十一章 类型转换 第十二章 整数运算 第十三章 逻辑运算 第十四章 浮点运算 第十五章 对象和数组 第十六章 控制流 第十七章 异常 以上一些是操作码相关的内容, 第十八章 finally子句 微型子例程 字节码中的finally子句表现的很像微型子例程.Java方法与微型子例程使用不同的指令集.跳转到微型子例程的指令是jsr或者jsr_w,将返回地址压入栈.执行完毕后调用ret指令.ret指令并不会从栈中弹出返回地址,而是在子例程开始的时候将返回地址从栈顶取出存储在

jvm开发笔记3—java虚拟机雏形

作者:王智通   一.背景 笔者希望通过自己动手编写一个简单的jvm来了解java虚拟机内部的工作细节毕竟hotsopt以及android的dalvik都有几十万行的c代码级别. 在前面的2篇开发笔记中已经实现了一个class文件解析器和一个java反汇编器 在这基础上 java虚拟机的雏形也已经写好.还没有内存管理功能 没有线程支持.它能解释执行的指令取决于我的java语法范围 在这之前我对java一无所知 通过写这个jvm顺便也把java学会了 它现在的功能如下 1.java反汇编器 山寨了

深入Java虚拟机读书笔记[5]

第五章 Java虚拟机 1. Java虚拟机内部体系结构 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配.当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用. 堆内存用来存放由new创建的对象和数组.在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理. 2. 数据类型 Java虚拟机中的数据类型分为基本类型和引用类型.Java语言中的所有基本类型同样为

周志明的《深入理解JAVA虚拟机》中基于栈的指令集和基于寄存器的指令集,要好好学习

这个知识点是我以前没有的,所以我以前发贴表示完全不理解JAR字节码的执行过程及以本地代码交互的过程. 现在有了这个知识点. 那对JVM的运行机制就了解了大概了. 周志明的<深入理解JAVA虚拟机>这书是本好书呀. 但由于我个人阅读习惯,三天之内要草草看一次的.所以没有按书上代码操作. 以后工作如何有应用时,再慢慢深入吧. ~~~~~~~~~~~~~~~ NET CLR 和 Java VM 都是堆疊式虛擬機器(Stack-Based VM),也就是說,它們的指令集(Instruction Set