java byte 相等比较_Java字节码跟真正汇编的比较
我们来看一下这样一段逻辑(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字节码跟真正汇编的比较相关推荐
- java table 设置长度_Java字节码lookupswitch和tableswitch总指令长度
使用给定的字节码,当遇到切换指令时,我想知道下一条指令的位置(不运行代码).为了做到这一点,我想我应该计算指令的总大小,包括跳转偏移或匹配偏移对.这可能吗?如果不是,怎么可能知道下一条指令在哪里? 此 ...
- java byte 数组打印_Java字节数组输出流
Java ByteArrayOutputStream类 字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中.创建字节数组输出流对象有以下几种方式. 下面的构造 ...
- java忍者_Java字节码忍者禁术
Java语言本身是由Java语言规格说明(JLS)所定义的,而Java虚拟机的可执行字节码则是由一个完全独立的标准,即Java虚拟机规格说明(通常也被称为VMSpec)所定义的. JVM字节码是通过j ...
- java 魔数_Java 字节码结构解析
本文通过解析Class文件中字节码的结构,来加深对Java类文件结构的理解.建议先阅读Java类文件结构解析这篇文章. Test.java package org.tianbin.clazz; pub ...
- java中字节码_Java字节码执行图示
★ 查看具体的执行图示,需要先了解一下 java 线程执行的地方,Java 每一个线程执行字节码指令都是在 jvm 虚拟机栈中完成 " 1.JVM 虚拟机栈 每一条 JVM 线程都有自己私有 ...
- [Java安全]—动态加载字节码文件
ClassLoader加载远程字节码 POC import java.io.IOException; import java.net.URL; import java.net.URLClassLoad ...
- Java中动态加载字节码的方法 (持续补充)
文章目录 Java中动态加载字节码的方法 1.利用 URLClassLoader 加载远程class文件 2.利用 ClassLoader#defineClass 直接加载字节码 2.1 类加载 - ...
- 【Java 虚拟机原理】Class 字节码二进制文件分析 七 ( 局部变量表分析 )
文章目录 前言 一.编译生成带局部变量表的字节码文件 二.局部变量表 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 二 ( 常量池位置 | 常量池结构 | tag | i ...
- 【Java 虚拟机原理】Class 字节码二进制文件分析 六 ( 属性类型 | Code 属性 | 属性名称索引 | 属性长度 | 操作数栈最大深度 | 局部变量存储空间 | 字节码长度 )
文章目录 前言 一.属性类型 二.Code 属性表数据结构 三.属性名称索引 四.属性长度 五.操作数栈最大深度 六.局部变量存储空间 七.字节码长度 八.存储字节码指令的一系列字节流 前言 上一篇博 ...
- 【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )
文章目录 前言 一.方法表结构 二.方法计数器 三.方法表数据解析 ( init 构造方法 ) 1.方法访问标志 2.方法名称索引 3.方法返回类型 4.方法属性数量 前言 上一篇博客 [Java 虚 ...
最新文章
- Salesforce Lightning开发学习(二)Component组件开发实践
- Pyhton 模块和包
- Zend Studio 默认模板和输入代码提示时间的修改方式
- SQL2000: MMC 不能打开文件
- luoguP4755 Beautiful Pair
- 我整理的一个经典分页程序(JSP的)
- orm2 中文文档 3. 定义模型
- Url传值的Get method and Post method
- 于群matlab仿真,33637《MATLAB-Simulink电力系统建模与仿真》于群(实例程序)
- ZN200以太网转串口TTL(1)
- 统计分析 -- t分布
- mkdir命令、chmod修改权限、利用scp 远程上传下载文件/文件夹
- Scarpy源码分析6
- Windows软件之——RocketDock之无法拖放图标到dock栏
- 信息融合发展沿革与技术动态
- bugku-秋名山老司机
- 注册表写入二进制数据
- windbg常用命令
- (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究(ADC)
- 修改手机开机Logo界面(Redmi Note 7)
热门文章
- ASP.NET2.0 GridView小技巧汇粹 (转)
- Hibernate常用配置
- euraka有哪些组件_SpringCloud及其五大常用组件之Eureka和Zuul
- python socket清空接受区_用 Python 开发一个 「聊天室」
- python win32模块详解_Windows平台Python编程必会模块之pywin32介绍
- linux解析器错误权限不够,实例解析Linux下目录的权限
- mysql列行条件,返回满足mysql表中列的多个条件的行
- NYOJ 40 公约数和公倍数
- erp服务器性能测试,浪潮PS-ERP压力测试报告--AMD单路服务器
- 【Python笔记】Python/C++解决约瑟夫环问题