博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM指令集介绍
阅读量:6847 次
发布时间:2019-06-26

本文共 1658 字,大约阅读时间需要 5 分钟。

 

转载自:

延伸参考 

void spin() { 

   int   i; 
   for (i = 0; i < 100; i++) { 
        ; // Loop body is empty 
   } 
编译后的代码如下 (与《Java虚拟机规范(java SE 7)》上看到的不一样,不知道是不是JDK版本的问题) 
void spin(); 
  Code: 
   0:   iconst_0 
   1:   istore_1 
   2:   iload_1 
   3:   bipush  100 
   5:   if_icmpge       14 
   8:   iinc    1, 1 
   11:  goto    2 
   14:  return 
调用一个新的方法,就产生一个新的帧栈(Frame),如下图,在一个帧栈中,含有操作数栈(Operand Stack)和局部变量表(Local Variables),注意,此图只是用来表示在此期间发生的操作,并不直观的表示内存中的实际状态。 
STEP1-->  0: iconst_0  

Code[]数组的第0行,表示把int型的0值压入操作数栈,注意,在局部变量表中,索引为0的位置存放的局部变量是指向调用当前方法的类实例的指针,即this指针 

指令iconst_<i> 中的i表示的int 常量 −1、0、1、2、3、4、5 

STEP2-->  1:   istore_1  
 
从操作数栈中弹出一个int型的操作数(即常量0),然后将其放置在局部变量1号位置(0号位置已被this占据) 

注意:物理上讲出栈后原来的数还在,只是程序告诉用户这个格子可以用了,我们就拿它当空格子用,下次入栈的时候写个新的数就把原来的数覆盖掉。凡是可以随便写的格子,不管里面原来有什么,都被认为是空格子。

STEP3-->  2:  iload_1  
 
从局部变量表中获得1号位置变量的值,将其压入操作数栈 
STEP4-->  3: bipush  100  
 
在操作数栈中加入int型的常量100 
STEP5-->  5: if_icmpge   14  
 
该命令和《Java虚拟机规范》得到的不太一样,但起到的功能是一样的,可以查一下JVM 的在线文档,发现此命令的介绍如下: 
if_icmpge  pops the top two ints off the stack and compares them. If value2 is greater than or equal to value1, execution branches to the address (pc + branchoffset), where pc is the address of the if_icmpge opcode in the bytecode and branchoffset is a 16-bit signed integer parameter following the if_icmpge opcode in the bytecode. If value2 is less than value1, execution continues at the next instruction. 
即将操作数栈中的两个int值弹出栈,然后比较它们,如果value2(即这里的0)大于或等于value1(即这里的100),则跳转至14行执行,否则就继续执行。很显然,这里0<100,所以继续执行下面的代码。 
STEP6-->  8:   iinc    1, 1  
 
该命令给局部变量表的1号位置的int值增加1,如图,原来的0变成了1 
STEP7-->  11:  goto    2  
很显然,这一条的命令就是让下一条执行语句跳至2,即 iload_1,然后便继 
续执行… 
STEP8-->  14:  return  
当局部变量1号位置的值(即程序中的i)大于100后,便满足了5: if_icmpge   14这条语句的条件,程序跳到14,遇到了return命令,该方法完成 

转载于:https://www.cnblogs.com/thiaoqueen/p/8466038.html

你可能感兴趣的文章
C# 获取接口数据(xml格式)转为json格式
查看>>
asp.net mvc session锁问题 (转载)
查看>>
[转]决定人生的三种成本:机会成本,沉没成本,边际成本
查看>>
A Generic Particle IO Library
查看>>
Enterprise Library 系列教程
查看>>
windows下搭建iphone开发环境
查看>>
关于信号量sem_wait的整理(转)
查看>>
MVC 3 数据验证 Model Validation 详解
查看>>
POJ 2446 Chessboard (匹配)
查看>>
POJ 3414 Pots (BFS)
查看>>
利用vbs设置Java环境变量
查看>>
Ubuntu离线安装软件包
查看>>
线段树
查看>>
我们都曾经历过:生活教会我的8堂人生课
查看>>
推荐几本最好的web前端开发技术图书
查看>>
ZOJ 1015 Fishing Net(判断弦图)
查看>>
D3D中剔除模式
查看>>
iOS开发系列--App扩展开发
查看>>
批量插入,更新,删除数据
查看>>
mysql 查看用户的权限
查看>>