毕业工作以来转到了.Net阵营对java有些生疏了,之前使用.Net的IL做了些aop相关的东西,终于有空学习学习与IL相似的ASM(刚刚接触,有错误忘大家指出,欢迎讨论)。
先谈谈个基本概念(建议看下这篇文章http://www.blogjava.net/libin2722/archive/2007/09/23/147513.html):
Bytecode (字节码)
C/C++编译器把源代码编译成汇编代码,Java编译器把Java源代码编译成字节码bytecode。
Java跨平台其实就是基于相同的bytecode规范做不同平台的虚拟机,我们的Java程序编译成bytecode后就可以在不同平台跑了。
.net框架有IL(intermediate language),汇编是C/C++程序的中间表达方式,而bytecode可以说是Java平台的中间语言。
来个简单的Demo,了解下ByteCode:
import java.io.PrintStream; public class HelloWorld { /** * @param args */ public static void main(String[] args) { // 下面两个控制台输出语句,结果是一样的 System.out.println("Hello world");// 直接调用System.out的静态方法println PrintStream staticOutput = System.out; staticOutput.println("Hello world");// 多做了一个store/load局部变量的操作,多引入了一个本地变量保存PrintStream(System.out)的地址 PrintStream output = new PrintStream(System.out);// 创建了一个PrintStream对象,使用了New指令在heap上分配了对象空间,并且使用一个局部变量用于保存PrintStream对象的堆指针(栈空间) output.println("Hello world"); } }
HelloWorld.java编译后的bytecode:
// class version 50.0 (50) // access flags 0x21 public class HelloWorld { // compiled from: HelloWorld.java // access flags 0x1 public <init>()V//创建默认构造函数 L0 LINENUMBER 3 L0 ALOAD 0 INVOKESPECIAL java/lang/Object.<init>()V//继承Object的构造函数 RETURN L1 LOCALVARIABLE this LHelloWorld; L0 L1 0//所使用到的局部变量 MAXSTACK = 1//函数所使用到的栈最大的size MAXLOCALS = 1//存放局部变量的最大size // access flags 0x9 public static main([Ljava/lang/String;)V L0//标记Label,跳转语句等跳转指向至Label LINENUMBER 9 L0//行号标记,异常时候的堆栈信息就会用到这个 GETSTATIC java/lang/System.out : Ljava/io/PrintStream; LDC "Hello world" INVOKEVIRTUAL java/io/PrintStream.println(Ljava/lang/String;)V L1 LINENUMBER 10 L1 GETSTATIC java/lang/System.out : Ljava/io/PrintStream; ASTORE 1 L2 LINENUMBER 11 L2 ALOAD 1 LDC "Hello world" INVOKEVIRTUAL java/io/PrintStream.println(Ljava/lang/String;)V L3 LINENUMBER 12 L3 NEW java/io/PrintStream//创建对象,分配堆空间 DUP//复制之前分配的PrintStream的引用并压入栈顶 GETSTATIC java/lang/System.out : Ljava/io/PrintStream;//将今年静态对象System.out压栈 INVOKESPECIAL java/io/PrintStream.<init>(Ljava/io/OutputStream;)V//调用PrintStream(PrintStream ps)构造函数 ASTORE 2 L4 LINENUMBER 13 L4 ALOAD 2 LDC "Hello world" INVOKEVIRTUAL java/io/PrintStream.println(Ljava/lang/String;)V L5 LINENUMBER 14 L5 RETURN L6 LOCALVARIABLE args [Ljava/lang/String; L0 L6 0 LOCALVARIABLE staticOutput Ljava/io/PrintStream; L2 L6 1 LOCALVARIABLE output Ljava/io/PrintStream; L4 L6 2 MAXSTACK = 3 MAXLOCALS = 3 }
对应的Stack上的过程:
太晚了,这篇文章就简单介绍下bytecode,明天还要上班碎觉了,周末继续学习ASM。
欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
相关推荐
这是Oracle提供的一个卷管理器,用于替代操作系统所提供的LVM,它不仅支持单实例配置,也支持RAC这样的多实例配置。将给Oracle数据库管理员带来极大的方便,ASM可以自动管理磁盘组,并提供数据冗余和优化。特别是...
《C28系列DSP汇编语言学习笔记》是针对德州仪器(TI)的C28x系列数字信号处理器(DSP)的一份详细教程,旨在帮助读者深入理解和掌握C28x DSP的汇编语言编程技术。汇编语言是低级编程语言,与硬件紧密相连,能实现...
《成功之路Oracle11g学习笔记》是一本专为初学者设计的Oracle数据库学习资源,旨在帮助读者系统地掌握Oracle11g的基础知识。Oracle11g是Oracle公司推出的一个重要版本,它提供了许多增强的功能和优化,使得数据库...
《C28系列DSP汇编语言学习笔记》是针对TI公司C28x系列数字信号处理器(Digital Signal Processor)的一份详细教程,旨在帮助读者掌握C28x DSP的汇编语言编程技巧。C28x系列是TI公司推出的高性能浮点DSP芯片,广泛...
Java ASM是一个强大的库,专为Java字节码的分析、生成和转换而设计。它被广泛应用于动态代理、代码混淆、AOP(面向切面编程)等领域。ASM的核心优势在于其简单、模块化且功能强大的API,以及详尽的文档和Eclipse插件...
HY11P35学习笔记的中断处理程序使用了IntISR.asm文件。该文件包含了中断服务程序的定义和实现。在中断处理程序中,我们使用JMP指令跳转到IntIsr标签处,然后调用中断服务程序。 系统初始化设置 SystemInit函数是HY...
### IBM AIX系统管理学习笔记知识点汇总 #### 一、AIX系统概述及厂家介绍 - **IBM AIX**:AIX(Advanced Interactive Executive)是由IBM公司开发的一种基于Unix的操作系统,主要运行于IBM的Power Systems硬件平台...
本学习笔记详细记录了作者在准备Oracle 11g OCP认证过程中的学习心得和实践经验,对于希望深入理解Oracle数据库管理和优化的读者来说,是一份宝贵的资料。 Oracle 11g包含了许多重要的特性和改进,例如: 1. **...
asm的学习笔记,希望对他们有帮助,特别最后一章asm disk恢复比较复杂
这篇学习笔记主要涉及的是基于SN8P...整体来看,这个学习笔记涵盖了SN8P1919微控制器的初始化、主循环处理、中断处理、特殊功能寄存器的使用以及与外部设备的交互等多个重要方面,是一份比较全面的嵌入式系统开发参考。
【IAR for AVR 学习笔记】是一系列关于如何使用IAR Embedded Workbench集成开发环境进行AVR微控制器编程的学习资料。IAR for AVR提供了针对AVR芯片优化的C/C++编译器,使得开发者能高效地编写和调试代码。 在【数据...
【标题】"FS98O22-学习笔记.rar_Asm__Asm_" 提供的信息表明,这是一份关于汇编语言(Assembly)的学习资料,可能是某次培训或课程的笔记,以RAR压缩格式存储。RAR是一种常见的文件压缩格式,用于减少文件大小以便于...
汇编语言(Assembly Language),简称ASM,是计算机科学中的一个基础概念,它是机器语言的一种符号化表示。在计算机硬件层面上,所有的指令都是由二进制数字组成的,但这样的形式对人类来说难以理解和编写。于是,...
Oracle 集群学习笔记 Oracle 集群是一种高可用性和高性能的解决方案,通过将多个服务器组合成一个集群,可以实现数据库的高可用性和负载均衡。下面是 Oracle 集群的详细知识点: 1. Oracle 集群的总体结构 ...
【FS98O22 学习笔记】 FS98O22 学习笔记主要涉及的是嵌入式系统的程序架构、系统初始化以及IO端口配置等关键知识点。以下是详细内容: 1. **程序架构** - 在程序的开头,可以看到`FS98O22.inc`、`MyDefine.h`和`...
本学习笔记将涵盖Oracle 10g OCP的所有核心概念和技术。 1. 数据库安装与配置:学习笔记首先会介绍如何在不同操作系统环境下安装Oracle 10g,包括选择合适的安装类型(如企业版、标准版)、配置Oracle Universal ...
Linux内核的学习是一个深入计算机操作系统核心的...在学习过程中,不断实践和总结笔记,对于巩固知识和分享经验都是十分有益的。如果有条件,参与社区讨论,与其他学习者交流,也能加速学习进度并提高解决问题的能力。
本篇学习笔记主要探讨Oracle集群的原理、Oracle Clusterware的体系结构以及RAC(Real Application Clusters)架构。 1. Oracle集群原理概述 Oracle集群的核心是实现高可用性和并行处理能力。这需要至少两台服务器...