`
答案在风中
  • 浏览: 64989 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ASM 学习笔记(一)

 
阅读更多

        毕业工作以来转到了.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。

 

欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

  • 大小: 30.4 KB
分享到:
评论

相关推荐

    ASM学习笔记

    这是Oracle提供的一个卷管理器,用于替代操作系统所提供的LVM,它不仅支持单实例配置,也支持RAC这样的多实例配置。将给Oracle数据库管理员带来极大的方便,ASM可以自动管理磁盘组,并提供数据冗余和优化。特别是...

    c28-assemble学习笔记_28335_c28系列dsp汇编语言学习笔记_Asm.zip

    《C28系列DSP汇编语言学习笔记》是针对德州仪器(TI)的C28x系列数字信号处理器(DSP)的一份详细教程,旨在帮助读者深入理解和掌握C28x DSP的汇编语言编程技术。汇编语言是低级编程语言,与硬件紧密相连,能实现...

    成功之路Oracle11g学习笔记

    《成功之路Oracle11g学习笔记》是一本专为初学者设计的Oracle数据库学习资源,旨在帮助读者系统地掌握Oracle11g的基础知识。Oracle11g是Oracle公司推出的一个重要版本,它提供了许多增强的功能和优化,使得数据库...

    c28-assemble学习笔记_28335_c28系列dsp汇编语言学习笔记_Asm_源码.zip

    《C28系列DSP汇编语言学习笔记》是针对TI公司C28x系列数字信号处理器(Digital Signal Processor)的一份详细教程,旨在帮助读者掌握C28x DSP的汇编语言编程技巧。C28x系列是TI公司推出的高性能浮点DSP芯片,广泛...

    asm-giude阅读笔记

    Java ASM是一个强大的库,专为Java字节码的分析、生成和转换而设计。它被广泛应用于动态代理、代码混淆、AOP(面向切面编程)等领域。ASM的核心优势在于其简单、模块化且功能强大的API,以及详尽的文档和Eclipse插件...

    IBM AIX系统管理学习笔记

    ### IBM AIX系统管理学习笔记知识点汇总 #### 一、AIX系统概述及厂家介绍 - **IBM AIX**:AIX(Advanced Interactive Executive)是由IBM公司开发的一种基于Unix的操作系统,主要运行于IBM的Power Systems硬件平台...

    我的Oracle 11g OCP学习笔记

    本学习笔记详细记录了作者在准备Oracle 11g OCP认证过程中的学习心得和实践经验,对于希望深入理解Oracle数据库管理和优化的读者来说,是一份宝贵的资料。 Oracle 11g包含了许多重要的特性和改进,例如: 1. **...

    asm filesystem

    asm的学习笔记,希望对他们有帮助,特别最后一章asm disk恢复比较复杂

    IAR for AVR 学习笔记

    【IAR for AVR 学习笔记】是一系列关于如何使用IAR Embedded Workbench集成开发环境进行AVR微控制器编程的学习资料。IAR for AVR提供了针对AVR芯片优化的C/C++编译器,使得开发者能高效地编写和调试代码。 在【数据...

    FS98O22-学习笔记.rar_Asm__Asm_

    【标题】"FS98O22-学习笔记.rar_Asm__Asm_" 提供的信息表明,这是一份关于汇编语言(Assembly)的学习资料,可能是某次培训或课程的笔记,以RAR压缩格式存储。RAR是一种常见的文件压缩格式,用于减少文件大小以便于...

    asm的魅力系列(浅显易懂)

    汇编语言(Assembly Language),简称ASM,是计算机科学中的一个基础概念,它是机器语言的一种符号化表示。在计算机硬件层面上,所有的指令都是由二进制数字组成的,但这样的形式对人类来说难以理解和编写。于是,...

    Oracle 集群学习笔记.docx

    Oracle 集群学习笔记 Oracle 集群是一种高可用性和高性能的解决方案,通过将多个服务器组合成一个集群,可以实现数据库的高可用性和负载均衡。下面是 Oracle 集群的详细知识点: 1. Oracle 集群的总体结构 ...

    Oracle 10g OCP学习笔记

    本学习笔记将涵盖Oracle 10g OCP的所有核心概念和技术。 1. 数据库安装与配置:学习笔记首先会介绍如何在不同操作系统环境下安装Oracle 10g,包括选择合适的安装类型(如企业版、标准版)、配置Oracle Universal ...

    linux的学习笔记

    Linux内核的学习是一个深入计算机操作系统核心的...在学习过程中,不断实践和总结笔记,对于巩固知识和分享经验都是十分有益的。如果有条件,参与社区讨论,与其他学习者交流,也能加速学习进度并提高解决问题的能力。

    Oracle 集群学习笔记.pdf

    本篇学习笔记主要探讨Oracle集群的原理、Oracle Clusterware的体系结构以及RAC(Real Application Clusters)架构。 1. Oracle集群原理概述 Oracle集群的核心是实现高可用性和并行处理能力。这需要至少两台服务器...

Global site tag (gtag.js) - Google Analytics