重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

asm插入java代码块 java的asm

ASM插入回调方法

可以在worker中调用js回调。

公司主营业务:网站制作、成都网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联公司推出镇宁免费做网站回馈大家。

使用wasm的时候,某些任务会被放到worker中执行,执行完成后回调通知结果。这个时候要特别注意:worker和主线程相互独立。在worker中调用js回调时,第一个面临的限制就是webworker的限制不能访问window,document对象,与主线程通信需要通过postmessage方式。

ASM是一种通用Java字节码操作和分析框架。它可以用于修改现有的class文件或动态生成class文件。

ASM是怎样访问及修改编译了的class文件

ASM是基于ClassVisitor接口方法的调用顺序,提供了3个核心组件,用于产生和修改转换class

ClassReader解析compiled class的byte数组,其accept方法接受classVisitor的实例参数,按顺序调用它的各个visitXxx方法。将它作为事件的生产者。

ClassWriter直接构建二进制形式的class,toByteArray返回compiled class的byte数组。将它作为事件的消费者

ClassAdapter内部包装了一个ClassVisitor实例,代理所有的ClassVisitor接口方法。将它作为事件过滤器。

package org.objectweb.asm;

public abstract interface ClassVisitor

{

public abstract void visit(int paramInt1, int paramInt2, String paramString1, String paramString2, String paramString3, String[] paramArrayOfString);

public abstract void visitSource(String paramString1, String paramString2);

public abstract void visitOuterClass(String paramString1, String paramString2, String paramString3);

public abstract AnnotationVisitor visitAnnotation(String paramString, boolean paramBoolean);

public abstract void visitAttribute(Attribute paramAttribute);

public abstract void visitInnerClass(String paramString1, String paramString2, String paramString3, int paramInt);

public abstract FieldVisitor visitField(int paramInt, String paramString1, String paramString2, String paramString3, Object paramObject);

public abstract MethodVisitor visitMethod(int paramInt, String paramString1, String paramString2, String paramString3, String[] paramArrayOfString);

public abstract void visitEnd();

}

访问ClassVisitor接口方法的顺序:

visit visitSource? visitOuterClass? ( visitAnnotation | visitAttribute )*

( visitInnerClass | visitField | visitMethod )*

visitEnd

首先必须调用visit, 然后最多访问一次visitSource, 然后最多调用一次visitOuterClass, 然后选出visitAnnotation或者visitAttribute之一,对它访问若干次,

然后选出visitInnerClass或者visitField或者visitMethod 之一, 对它调用若干次

最后必须调用一下visitEnd

以下例子说明了ClassReader如何使用accept方法, 依次按照所谓的顺序,调用 ClassPrinter作为ClassVisitor的实现类的visitXxx方法,访问java.util.Map的。

查看accept方法内部,可以发现这个所谓的调用顺序。

/**

* @{#} ClassPrinter.java Created on Jun 10, 2010 9:37:57 PM

*

* this code example from asm-guide.pdf

* author.

*

*/

package example.me;

import org.objectweb.asm.AnnotationVisitor;

import org.objectweb.asm.Attribute;

import org.objectweb.asm.ClassReader;

import org.objectweb.asm.ClassVisitor;

import org.objectweb.asm.FieldVisitor;

import org.objectweb.asm.MethodVisitor;

public class ClassPrinter implements ClassVisitor {

public void visit(int version, int access, String name, String signature,

String superName, String[] interfaces) {

System.out.println(name + " extends " + superName + " {");

}

public AnnotationVisitor visitAnnotation(String desc, boolean visible) {

return null;

}

public void visitAttribute(Attribute attr) {}

public void visitEnd() {

System.out.println("}");

}

public FieldVisitor visitField(int access, String name, String desc,

String signature, Object value) {

System.out.println(" " + desc + " " + name);

return null;

}

public void visitInnerClass(String name, String outerName,

String innerName, int access) {}

public MethodVisitor visitMethod(int access, String name, String desc,

String signature, String[] exceptions) {

System.out.println(" " + name + desc);

return null;

}

public void visitOuterClass(String owner, String name, String desc) {}

public void visitSource(String source, String debug) {}

public static void main(String[] args) throws Exception {

ClassPrinter cp = new ClassPrinter();

ClassReader cr = new ClassReader("java.util.Map");

/*

* InputStream input = Thread.currentThread().getContextClassLoader()

* .getResourceAsStream( "java.lang.Runnable".replace('.', '/') +

* ".class"); ClassReader cr = new ClassReader(input);

*/

cr.accept(cp, 0); //cp是ClassVisitor的实现类,在accept方法的内部,以既定的顺序调用cp.visitXxx(...)方法,最终输出java.util.Map的编译后class结构

}

}

输出结果:java/util/Map extends java/lang/Object {

size()I

isEmpty()Z

containsKey(Ljava/lang/Object;)Z

containsValue(Ljava/lang/Object;)Z

get(Ljava/lang/Object;)Ljava/lang/Object;

put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

remove(Ljava/lang/Object;)Ljava/lang/Object;

putAll(Ljava/util/Map;)V

clear()V

keySet()Ljava/util/Set;

values()Ljava/util/Collection;

entrySet()Ljava/util/Set;

equals(Ljava/lang/Object;)Z

hashCode()I

}

如何把汇编程序嵌入到C语言中

不同编译器嵌入汇编的方式不一样,具体如下:

一、Turbo

C ,

也就是所说的TC。

1、使用预处理程序的伪指令#asm和#endasm,#asm用来开始一个汇编程序块,而#endasm指令用于该块的结束。

参考代码:

int mul(int a, int b)

{

/*汇编开始*/

#asm

mov ax,word ptr 8[bp]

imul ax word ptr 10[bp]

#endasm

/*汇编结束。*/

}

2、使用asm语句:

格式:asm汇编语句

参考代码:

int mul(int a, int b)

{

asm mov ax,word ptr 8[bp]

asm imul ax word ptr 10[bp]

/*

每个asm对应一句汇编

注意结尾不需要分号

*/

}

二、VC++/VS

格式:

__asm

汇编指令

[

;

]

__asm

{

汇编指令

}

[

;

]

asm前面是两条下划线,后面的方括号内容表示分号可有可无。

使用方法:

1、一条一条地用:

__asm mov al, 2

__asm mov dx, 0xD007

__asm out dx, al

每行一条汇编,

可以有分号,也可以没有。

2、组成一块地用:

__asm {

mov al, 2

mov dx, 0xD007

out dx, al

}

整体作为一个汇编代码块。

3、也可以将多条汇编写在一行:

__asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al

三、GNU

GCC

GCC对汇编的支持是最丰富的,简单介绍如下:

1、

用到的关键字:

“__asm__”

表示后面的代码为内嵌汇编,“asm”是“__asm__”的别名。

“__volatile__” 表示编译器不要优化代码,后面的指令保留原样,“volatile”是它的别名。

括号里面是汇编指令。

内嵌汇编语法如下:

__asm__(

汇编语句模板:

输出部分:

输入部分:

破坏描述部分)

一个简单的汇编模板:

int a=10,b;

asm("movl %1, %%eax;

movl %%eax, %0;"

:"=r"(b) /*输出部*/

:"r"(a) /*输入部*/

:"%eax" /*毁坏部*/

);

表示C语言里的“b=a;”。

里边r表示使用任意寄存器,%0、%1表示使用两个寄存器,一般只能%0~%9共十个操作数,按输入输出部变量出现顺序进行映射。

寄存器用两个百分号,是因为使用了%0%1这些数字使百分号有了特殊意义,所以在操作数出现的寄存器必须用双百分表示。

毁坏部里边的%eax表示eax寄存器在汇编代码块执行过程中会被改写,在执行前要保护好,这是提交给编译器决定的。

急!!!关于使用ASM进行JAVA字节码操作的问题

如果直接运行在平台上就成了针对机器的了,而java目的就是要一次编译,处处运行。由于机器不同,对二进制码的要求也不同,所以不能达到上诉目标。而java把源文件编译成高效的字节码,通过java虚拟机可以快速的转换为各个机器所需要的机器码,所以只要有java虚拟机,java就能达到处处运行。希望对你有帮助

java 的ASM字节码编辑如果替换方法中的类名

等同于java代码:

System.currentTimeMillis();

替换成time.zz()(要求time是类名,不是对象,zz是静态方法)

很容易就出错。

如何在WordPress文章中插入代码

第一步:首先从网上下载出WordPress的插件Wp-syntax。

第二步:在编辑文章时,使用HTML的编辑方式插入以下代码pre lang=”LANGUAGE” line=”0″//“line为1时表示显示行号”/pre,中间插入要插入的代码即可,LANGUAGE改为语言类型,例如php、java。line为0不显示行号,为1时显示。

附:支持的语言如下:abap, actionscript, actionscript3, ada, apache, applescript, apt_sources, asm, asp, autoit, avisynth, bash, bf, bibtex, blitzbasic, bnf, boo, c, c_mac, caddcl, cadlisp, cil, cfdg, cfm, cmake, cobol, cpp-qt, cpp, csharp, css, d, dcs, delphi, diff, div, dos, dot, eiffel, email, erlang, fo, fortran, freebasic, genero, gettext, glsl, gml, bnuplot, groovy, haskell, hq9plus, html4strict, idl, ini, inno, intercal, io, java, java5, javascript, kixtart, klonec, klonecpp, latex, lisp, locobasic, lolcode lotusformulas, lotusscript, lscript, lsl2, lua, m68k, make, matlab, mirc, modula3, mpasm, mxml, mysql, nsis, oberon2, objc, ocaml-brief, ocaml, oobas, oracle11, oracle8, pascal, per, pic16, pixelbender, perl, php-brief, php, plsql, povray, powershell, progress, prolog, properties, providex, python, qbasic, rails, rebol, reg, robots, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, sql, tcl, teraterm, text, thinbasic, tsql, typoscript, vb, vbnet, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xml, xorg_conf, xpp, z80


名称栏目:asm插入java代码块 java的asm
网页路径:http://cqcxhl.com/article/hihedg.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP