`
sharewind
  • 浏览: 156680 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

asm 之Hello World

阅读更多

 

import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Method;

import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;


public class HelloAsm {

	public static void main(String[] args)throws Exception{
		
		System.out.println("enter main");
		
		ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
		// 类访问开始
		cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC, "com/cjf/Hello", null, "java/lang/Object", null);
		
		// 至少提供一个构造函数
		MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
		// 代码开始:必须
		mv.visitCode();
		mv.visitVarInsn(Opcodes.ALOAD, 0);
		// 调用Object 构造函数
		mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
		mv.visitInsn(Opcodes.RETURN);
		// 计算栈和局部变量最大空间:必须
		mv.visitMaxs(0, 0);
		mv.visitEnd();
		
		
		// 生成main 方法
		mv = cw.visitMethod(Opcodes.ACC_PUBLIC|Opcodes.ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
		mv.visitCode();
		mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
		mv.visitLdcInsn("Hello World!");
		// 调用实例重载方法
		mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
		mv.visitInsn(Opcodes.RETURN);
		mv.visitMaxs(0, 0);
		mv.visitEnd();
		
		// 类结束:必须
		cw.visitEnd();
		
		final byte[] bytes = cw.toByteArray();
		Class<?> clazz = new ClassLoader() {
			protected Class<?> findClass(String name) throws ClassNotFoundException{
				return defineClass(name, bytes,0, bytes.length);
			}
		}.loadClass("com.cjf.Hello");
		
		Method method = clazz.getMethod("main", new Class[]{String[].class});
		method.invoke(null, (Object)new String[0]);
		
		for (int i = 0; i < bytes.length; i++) {
			System.out.printf("%d:\t %02X \t %c \n",i,bytes[i],(char)bytes[i]);
		}
		
		FileOutputStream fos = new FileOutputStream(new File("Hello.class"));
		fos.write(bytes);
		fos.close();
		
	}
}
 

 

分享到:
评论

相关推荐

    asm_helloworld_world_

    标题“asm_helloworld_world_”暗示我们关注的焦点是一个用汇编语言编写的“Hello, World!”程序。在计算机科学的教育中,"Hello, World!"通常被用作初次接触新编程语言时编写的第一个程序,它能快速验证编译器和...

    asm.zip_asm hello world_world

    标题 "asm.zip_asm hello world_world" 和描述 "asm hello world test" 暗示了这个压缩包的内容与汇编语言编程有关,特别是涉及到一个简单的 "hello world" 程序的创建和测试。汇编语言是计算机编程的一种底层语言,...

    masm汇编helloworld模板

    在`HelloWorld.asm`中,我们可能会看到类似以下的代码片段,用于打印"Hello, World!": ```assembly section .data hello db 'Hello, World!',0 section .text global _start _start: ; 设置段寄存器 mov ax,...

    HelloWorld.asm

    第一个汇编语言程序,使用MASM32编译,适合自己学习参考

    简单的hello world操作系统

    这个简单的hello world操作系统包包括一个boot sector code(ASM) , boot sector writer , 一个 exe header stripper , 和 一个如何建立一个显示“Hello World !”的小操作系统的简单导引。The Simple Hello World ...

    hello-world2_supporttnd_world_vs2019hello.asm_efiasmhelloworld_源

    标题中的"hello-world2_supporttnd_world_vs2019hello.asm_efiasmhelloworld_源"揭示了这个压缩包文件的主要内容。它涉及到一个“hello world”程序的实现,使用了汇编语言(asm),并且可能针对Visual Studio 2019...

    汇编helloworld

    汇编语言第一个入门程序,helloworld的asm格式文档

    汇编语言hello,world

    `hello.asm`是我们的主要程序文件,它将包含"Hello, World!"的输出逻辑。在汇编语言中,我们需要指定输出到屏幕的指令,这通常通过控制视频内存来实现。DOS环境下,我们可以使用INT 21H这个中断服务调用来显示文本,...

    masm.rar_Assembly hello wor_dos hello world_hello world D_masm_

    标题中的"masm.rar_Assembly hello wor_dos hello world_hello world D_masm_"揭示了我们今天要讨论的主题——使用MASM(Microsoft Assembler)在DOS环境下编写并编译一个简单的“Hello, World!”程序。这个压缩包...

    MASM_masmhellloworld_汇编语言helloworld_

    标题“MASM_masmhellloworld_汇编语言helloworld_”揭示了我们要讨论的主题,即使用Microsoft Macro Assembler(MASM)编写一个简单的“Hello, World!”程序。这是一个经典的编程入门示例,用于演示基本的汇编语言...

    x86汇编语言测试程序——输出“Hello World!”

    用x86汇编写的环境搭建的测试程序。如果输出“Hello World!”那么就表示环境搭建成功。大家可以下载尝试一下。

    DSP实验一-CCS入门实验指导-HelloWorld

    对于本实验,我们将使用一个简单的“Hello, World!”程序示例来介绍DSP开发的基本流程。在开始之前,请确保你已经正确安装了CCS,并且按照安装说明完成了相关的软件设置,包括设置好目标板或模拟器的通信接口。 ...

    MASM32 Hello World

    首先,我们来看`HelloWorld.asm`文件,这是源代码文件。在汇编语言中,每个语句都对应机器码,直接控制计算机硬件。MASM32提供了方便的语法,允许程序员用高级形式表示低级指令。在这个例子中,源代码可能包含以下...

    hello.asm 一个简单汇编程序

    hello.asm 汇编程序 Data SEGMENT string DB "HELLO WORLD! $" data ENDS CODE SEGMENT ASSUME CS:code,DS:data start: MOV AX,data MOV DS,AX MOV DX,OFFSET string MOV AH,9 INT 21H MOV AH,4CH INT 21H...

    SpringMVC3.1.2 入门级HelloWorld源码

    [INFO] | +- org.springframework:spring-asm:jar:3.1.2.RELEASE:compile [INFO] | \- commons-logging:commons-logging:jar:1.1.1:compile [INFO] \- org.springframework:spring-webmvc:jar:3.1.2.RELEASE:compile...

    22.asm 屏幕上显示字符串hello world 的masm汇编程序

    22.asm

    DTK643 例程 hello world

    【标题】"DTK643 例程 hello world" 是一个基于数字信号处理器(DSP)DM643开发板的示例程序,用于初学者理解如何在该平台上进行基本的编程操作。"hello world"是软件开发中的一个经典入门程序,通常用于验证开发...

    简单的消息框源程序hello world!(汇编源码)

    本文将深入探讨一个基于汇编语言的简单消息框源程序——"hello world!",它是一个常见的入门级示例,适用于初学者理解和学习。 首先,"hello world!"程序是每个程序员接触编程时的首个例子,它在屏幕上打印出...

    jersey-学习-和hello-world

    @Path("/helloworld") public class HelloWorldResource { @GET @Produces("text/plain") public String getClichedMessage() { return "Hello World"; } } ``` 这里定义了一个简单的GET方法,用于返回文本...

    CSharpAsmjs:C#Hello World示例到Asm.js

    CSharpAsmjs C#Hello World示例到Asm.js 我试图写一个Hello World! 可以转换为Asm.js的示例应用程序首先使用C#Native( )转换为C ++,然后使用Emscripten( )转换为JavaScript。障碍: EMscripten无法编译C#...

Global site tag (gtag.js) - Google Analytics