目录

常量压栈指令

局部变量表压栈指令

操作数栈出栈指令

通用指令


上一篇日志里用到的指令如bipush,iload等都是JVM常用的指令,它们有各自的分类,如bipush是常量压入操作数栈,iload是将数组指令索引压入操作数栈,根据操作的数据类型不同还可以分为,i开头的是对integer类型操作指令,f开头是对float类型操作指令。每一条字节码指令由一个字节的助记符加上后面的参数组成,例如sipush  100指令一共占用3个字节,sipush占一字节加上后面的参数占两个字节。这些指令有专门负责类型转换的,运算的指令和存储指令,这篇日志总结下从操作范围,也就是从局部变量表到操作数栈之间数据传递,来分类一些JVM常用的指令。

常量压栈指令

常量压栈指令作用是将常数压入操作数栈中,大致有push,ldc和const三类,push前面见过了,在一个两数相加的代码中,首先用到bipush指令将两个常量压入操作数栈里,根据数据大小可以使用bipush或sipush,前者可处理的数据范围在-128~127,后者更大在-32768~32767之间。第二种const类指令负责将一些特定的常量压栈,例如iconst_m1将-1压入操作数栈,aconst_null将null压栈,如果想将浮点类型数据压栈,使用fconst_x,x=1,2,3表示分别将1,2,3压栈,同理,lconst_x和dconst_x分别表示将长整型数据和双精度浮点数压栈。第三种ldc类型,它可以将int,String或者float类型数据压入操作数栈,支持的参数长度为8位,如果超出这个长度的数据可以使用ldc_w指令,它的数据支持长度为16位。

局部变量表压栈指令

这类指令顾名思义就是将局部变量表中的数据压入操作数栈里,还是拿回两数相加的程序看,把两个数进行加法运算前,需要先将它们从局部变量表里拿出压入到操作数栈中,用到的是iload_x指令,x表示的是局部变量表中的第几号位置,和const指令类似,iload前面的i标识的是处理整型数据,所以fload,dload等分别处理的就是单精度浮点数和双精度浮点数。如果是将数组元素进行入栈,使用的是xaload指令,iaload,caload和saload分别表示将数据压入int,char和short数组,来看一个例子:

代码在Instance()方法中传入两个数组参数,一个是int数组一个是char数组,然后输出里面下标为1的元素。从.class文件里看,首先aload_1指令将数组引用压入栈,然后iconst_1将索引1压入,最后iaload指令将数组arr1[1]压入操作数栈,arr2[1]同理,aload_2指令将char数组入栈,然后iconst_1将索引1入栈,代码中两个数组都是输出下标为1的元素,最后caload指令将char类型数组压入操作数栈中。

操作数栈出栈指令

操作数栈出栈指令,作用是将操作数栈顶元素弹出,放入到局部变量表中中,完成对局部变量的赋值操作,有xstore_n和xastore两种,后者是对数组进行操作的指令,xstore_n指令中的x代表数据类型,可以是i、l、f、d、s等,n自然就是代表第几号数字了,来看一个例子:

对两个变量进行赋值,一个是int型局部变量,一个是数组,从字节码指令中可以看到,bipush指令将参数95压栈后,istore_3指令将其弹出,放入到局部变量表第3号位置里。下面对数组的赋值有点不同,iastore指令用来对一个int型数组操作,对一个数组里面元素进行赋值,需要数组引用,索引和赋值参数三部分,首先aload_1将数组引用(arr1[ ])压栈,然后iconst_1将数组索引1压栈(arr1[ 1 ]),最后bipush27压栈,iastore将参数27赋值给局部变量表中的数组arr1[ 1 ]位置。

通用指令

最后总结的一种常用指令是通用类型的指令,它与前面指令区别的地方在于,和操作的数据类型无关,前面的指令中,不同类型的指令入栈有lconst、fconst、bipush、sipush等,除了明确数据类型外还要指定放入的位置,通用类指令不需要指明数据类型,例如dup复制指令,作用是将栈顶元素复制一次并压入栈顶,同样是数据操作指令,但无需关注当前栈顶元素是什么类型,还有pop指令是将栈顶元素弹出并直接丢弃,来看个例子:

代码简单生成一个Object对象,并调用ob.toString()方法,从字节码指令看,首先new指令为我们实例化ob对象,此时对象被放在栈顶处,然后dup指令将该对象的引用复制了一份,之后栈中就有两份相同的ob对象引用,为什么需要先复制一份,往下看,invokespecial指令是调用对象的构造方法,此时需要从栈顶中弹出一个ob对象引用,之后astore_3指令将该对象出栈放入局部变量表中,可以看到,一共用到两次该对象的引用,且每次使用都要将其出栈,所以需要dup一份对象引用在栈中。当ob.toString()方法执行完毕后,最后将返回值return到栈顶,使用pop指令将没有其他地方使用到的返回值直接丢弃。

JVM常用指令:常量,变量的压栈出栈指令相关推荐

  1. 【Android 逆向】x86 汇编 ( push / pop 入栈 / 出栈 指令 | ret / retn 函数调用返回指令 | set 设置目标值指令 )

    文章目录 一.push / pop 入栈 / 出栈 指令 二.ret / retn 函数调用返回指令 三.set 设置目标值指令 总结 一.push / pop 入栈 / 出栈 指令 push / p ...

  2. c语言局部变量压栈顺序,C 程序局部变量压栈出栈的理解

    写这篇总结的缘由仅仅出于巧合,五一前帮一位同学看51的程序,在查看汇编代码的时候(事实上我当时的汇编知识基本都还给了老师),无意中问起我"某个局部变量的声明怎么没有对应的汇编语句" ...

  3. Java 数据结构(链表LinkedList增删改查、数组Vector、获取Vector最大值、交换Vector两成员位置、栈的实现、压栈出栈实现反转、队列Queue)

    在链表(LinkedList)的开头和结尾添加元素 import java.util.LinkedList;public class Main {public static void main(Str ...

  4. java压栈重复字符串_Java 实例 – 压栈出栈的方法实现字符串反转

    Java 实例 - 压栈出栈的方法实现字符串反转 以下实例演示了使用用户自定义的方法 StringReverserThroughStack() 来实现字符串反转: /* author by w3csc ...

  5. 【OpenGL】二十一、OpenGL 矩阵压栈与出栈 ( 不同类型矩阵变换先后顺序 | 渲染前不设置单位阵 | 压栈出栈原理分析 | 代码示例 )

    文章目录 一.不同类型矩阵变换先后顺序 二.渲染前不设置单位阵 三.矩阵的压栈和出栈原理分析 四.矩阵的压栈和出栈代码示例 五.相关资源 一.不同类型矩阵变换先后顺序 对 OpenGL 中的 模型视图 ...

  6. 【数据结构】栈详解——压栈/入栈 | 弹栈/出栈 | 获取栈顶元素

    栈 顺序栈 栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈, ...

  7. Go语言_数据结构_栈(包括入栈和出栈,表达式的入栈出栈详细过程代码实现)

    入栈和出栈代码实现如下: package main import ("fmt""errors" )//使用数组来模拟一个栈的使用 type Stack stru ...

  8. PLC实现入栈出栈功能(SCL)

    PLC实现入栈出栈功能(SCL 引言 功能需求 准备工作 入栈 PLC程序 出栈 PLC程序 触摸屏画面程序 源程序 引言 之前用梯形图实现了PLC入栈出栈功能,这次使用SCL来实现此功能. 功能需求 ...

  9. 数据结构 - 栈(链表实现栈的入栈出栈)

    学完链表和栈,数组模拟栈学完后,自己根据链表写了个链栈,虽然只是简单的实现了入栈出栈遍历.收获还是很大的. 在push这里思考了一会,思路是:传入一个数字,push里创建一个节点node,把数据加入n ...

最新文章

  1. android 帖子功能,anroid 各个功能的帖子 和代码片段
  2. Tableau实战系列浏览 Tableau 环境(一) -初识tableau操作界面
  3. QT Creator应用程序开发——01简单按钮显示
  4. Similar Pairs CodeForces - 1360C(图匹配+简单贪心)
  5. 基于深度学习的单目人体姿态估计方法综述(一)
  6. 异速联服务器配置系统管理员,异速联V6.2.4.0正式版全新发布
  7. 2021年全球以太网供电(POE)控制器收入大约269.2百万美元,预计2028年达到363.9百万美元
  8. 【2020版】Basic4Android安装配置指南
  9. Ubuntu安装输入法却不能切换输入法
  10. android 跨进程通信 binder
  11. 新职业教育的三节课,凭什么做到今天这样
  12. chapter 2 古典密码技术
  13. 设计模式之 Composite(组合)通俗理解
  14. 自动化运维之自动化监控
  15. Django 之ORM(一)
  16. 并不对劲的方格取数问题
  17. 自助查询打印机应用瓶颈
  18. android 商城评价,打开应用商店对应用进行评价
  19. Zxing3.4.0 --最新版本集成 --demo 安卓--
  20. 串口控制直流电机程序 80C51单片机 L298N 普中51-单核-A4

热门文章

  1. Ubuntu中 Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?问题的解决
  2. FRM 第三章 银行的风险管理流程
  3. “签了三方后不想去,我赔了公司8千块钱……”
  4. kindel读书笔记——第二个月2017.02.22-03.21
  5. AngularJS的$http服务的应用
  6. js实现小球随机运动
  7. Swift Model快速生成
  8. tensorfow2.0以上版本,ipynb文件一键安装!安装不成功我倒立洗头~ [gpu+cpu版本]
  9. 融东圈圈:从三个角度对融东圈圈APP思考与分析
  10. 数的三次方根(C++)