我们来看一下这样一段逻辑(Java实现)

public voidprint(inti,intj) {

intf;if(i == j) {

f = i + j;}else{

f = i - j;}

}

编译后的字节码

public void print(int, int);

descriptor: (II)V

flags: ACC_PUBLIC

Code:

stack=2, locals=4, args_size=3

0: iload_1 //将局部变量表第一个整型变量i入栈

1: iload_2 //将局部变量表第二个整型变量j入栈

2: if_icmpne 12 //将操作数栈的两个整型变量弹出并进行相等比较,如果不相等则跳到位置为12的地方

5: iload_1 //如果相等,将局部变量表第一个整型变量i入栈

6: iload_2 //如果相等,将局部变量表第二个整型变量j入栈

7: iadd //将操作数栈的两个整型变量弹出,并相加后将结果入栈

8: istore_3 //将相加的结果从栈顶弹出并赋值给局部变量表的第三个整型变量f

9: goto 16 //跳转到位置16

12: iload_1 //如果不相等,将局部变量表第一个整型变量i入栈

13: iload_2 //如果不相等,将局部变量表第二个整型变量j入栈

14: isub //将操作数栈的两个整型变量弹出,并相减后将结果入栈

15: istore_3 //将相减的结果从栈顶弹出并赋值给局部变量表的第三个整型变量f

16: return

LineNumberTable:

line 7: 0

line 8: 5

line 10: 12

line 12: 16

LocalVariableTable:

Start Length Slot Name Signature

9 3 3 f I

0 17 0 this Lcom/guanjian/calculate/test/Calc;

0 17 1 i I

0 17 2 j I

16 1 3 f I

其汇编语言如下

bne $r3,$r4,ELSE //判断r3寄存器与r4寄存器是否相等,如果不等跳转到ELSR标记处

add $r5,$r3,$r4 //如果相等,则将r3寄存器和r4寄存器相加将结果放入r5寄存器

j EXIT //跳转到EXIT标记处

ELSE:

sub $r5,$r3,$r4 //如果不相等,则将r3寄存器和r4寄存器相减将结果放入r5寄存器

EXIT:

通过比较,其实也能看出来,Java字节码的入栈操作其实也就是放入寄存器中,出栈也就是清理寄存器。

Java代码

public voidprint() {

intsum = 0;for(inti = 0;i < 100;i++) {

sum += i;}

}

编译后的字节码

public void print();

descriptor: ()V

flags: ACC_PUBLIC

Code:

stack=2, locals=3, args_size=1

0: iconst_0 //入栈整数0

1: istore_1 //将栈顶0弹出并赋值给局部变量表第一个整型变量sum

2: iconst_0 //入栈整数0

3: istore_2 //将栈顶0弹出并赋值给局部变量表第二个整型变量i

4: iload_2 //将局部变量表第二个整型变量i入栈

5: bipush 100 //入栈100

7: if_icmpge 20 //将操作数栈的两个值弹出并判断i是否小于100,如果不小于100跳转到位置20

10: iload_1 //将局部变量表第一个整型变量sum入栈

11: iload_2 //将局部变量表第二个整型变量i入栈

12: iadd //将操作数栈的两个整型变量弹出并相加后将结果入栈

13: istore_1 //将栈顶的结果弹出并赋值给局部变量表第一个整型变量sum

14: iinc 2, 1 //将局部变量表的第二个整型变量i自增1

17: goto 4 //跳转到位置4

20: return

LineNumberTable:

line 6: 0

line 7: 2

line 8: 10

line 7: 14

line 10: 20

LocalVariableTable:

Start Length Slot Name Signature

4 16 2 i I

0 21 0 this Lcom/guanjian/calculate/test/Calc;

2 19 1 sum I

其汇编语言为

addi $s3,$zero,0 //0加上一个常数寄存器zero(里面的数就是0)存入s3寄存器int sum = 0;

addi $s4,$zero,0 //0加上一个常数寄存器zero(里面的数就是0)存入s4寄存器int i = 0

addi $s5,$zero,100 //100加上一个常数寄存器zero(里面的数就是0)存入s5寄存器100

LOOP:

beq $s4,$s5,EXIT //比较s4寄存器的值是否小于S5寄存器的值,如果如果结果为假跳转到EXIT标记i < 100

add $s3,$s4,$s3 //将s4寄存器和s3寄存器的值相加存入s3寄存器sum += i;

addi $s4,$s4,1 //将s4寄存器的值加1存入s4寄存器i++

j LOOP //跳转到LOOP标记

EXIT:

java byte 相等比较_Java字节码跟真正汇编的比较相关推荐

  1. java table 设置长度_Java字节码lookupswitch和tableswitch总指令长度

    使用给定的字节码,当遇到切换指令时,我想知道下一条指令的位置(不运行代码).为了做到这一点,我想我应该计算指令的总大小,包括跳转偏移或匹配偏移对.这可能吗?如果不是,怎么可能知道下一条指令在哪里? 此 ...

  2. java byte 数组打印_Java字节数组输出流

    Java ByteArrayOutputStream类 字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中.创建字节数组输出流对象有以下几种方式. 下面的构造 ...

  3. java忍者_Java字节码忍者禁术

    Java语言本身是由Java语言规格说明(JLS)所定义的,而Java虚拟机的可执行字节码则是由一个完全独立的标准,即Java虚拟机规格说明(通常也被称为VMSpec)所定义的. JVM字节码是通过j ...

  4. java 魔数_Java 字节码结构解析

    本文通过解析Class文件中字节码的结构,来加深对Java类文件结构的理解.建议先阅读Java类文件结构解析这篇文章. Test.java package org.tianbin.clazz; pub ...

  5. java中字节码_Java字节码执行图示

    ★ 查看具体的执行图示,需要先了解一下 java 线程执行的地方,Java 每一个线程执行字节码指令都是在 jvm 虚拟机栈中完成 " 1.JVM 虚拟机栈 每一条 JVM 线程都有自己私有 ...

  6. [Java安全]—动态加载字节码文件

    ClassLoader加载远程字节码 POC import java.io.IOException; import java.net.URL; import java.net.URLClassLoad ...

  7. Java中动态加载字节码的方法 (持续补充)

    文章目录 Java中动态加载字节码的方法 1.利用 URLClassLoader 加载远程class文件 2.利用 ClassLoader#defineClass 直接加载字节码 2.1 类加载 - ...

  8. 【Java 虚拟机原理】Class 字节码二进制文件分析 七 ( 局部变量表分析 )

    文章目录 前言 一.编译生成带局部变量表的字节码文件 二.局部变量表 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 二 ( 常量池位置 | 常量池结构 | tag | i ...

  9. 【Java 虚拟机原理】Class 字节码二进制文件分析 六 ( 属性类型 | Code 属性 | 属性名称索引 | 属性长度 | 操作数栈最大深度 | 局部变量存储空间 | 字节码长度 )

    文章目录 前言 一.属性类型 二.Code 属性表数据结构 三.属性名称索引 四.属性长度 五.操作数栈最大深度 六.局部变量存储空间 七.字节码长度 八.存储字节码指令的一系列字节流 前言 上一篇博 ...

  10. 【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )

    文章目录 前言 一.方法表结构 二.方法计数器 三.方法表数据解析 ( init 构造方法 ) 1.方法访问标志 2.方法名称索引 3.方法返回类型 4.方法属性数量 前言 上一篇博客 [Java 虚 ...

最新文章

  1. Salesforce Lightning开发学习(二)Component组件开发实践
  2. Pyhton 模块和包
  3. Zend Studio 默认模板和输入代码提示时间的修改方式
  4. SQL2000: MMC 不能打开文件
  5. luoguP4755 Beautiful Pair
  6. 我整理的一个经典分页程序(JSP的)
  7. orm2 中文文档 3. 定义模型
  8. Url传值的Get method and Post method
  9. 于群matlab仿真,33637《MATLAB-Simulink电力系统建模与仿真》于群(实例程序)
  10. ZN200以太网转串口TTL(1)
  11. 统计分析 -- t分布
  12. mkdir命令、chmod修改权限、利用scp 远程上传下载文件/文件夹
  13. Scarpy源码分析6
  14. Windows软件之——RocketDock之无法拖放图标到dock栏
  15. 信息融合发展沿革与技术动态
  16. bugku-秋名山老司机
  17. 注册表写入二进制数据
  18. windbg常用命令
  19. (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究(ADC)
  20. 修改手机开机Logo界面(Redmi Note 7)

热门文章

  1. ASP.NET2.0 GridView小技巧汇粹 (转)
  2. Hibernate常用配置
  3. euraka有哪些组件_SpringCloud及其五大常用组件之Eureka和Zuul
  4. python socket清空接受区_用 Python 开发一个 「聊天室」
  5. python win32模块详解_Windows平台Python编程必会模块之pywin32介绍
  6. linux解析器错误权限不够,实例解析Linux下目录的权限
  7. mysql列行条件,返回满足mysql表中列的多个条件的行
  8. NYOJ 40 公约数和公倍数
  9. erp服务器性能测试,浪潮PS-ERP压力测试报告--AMD单路服务器
  10. 【Python笔记】Python/C++解决约瑟夫环问题