欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

asm插入java代碼塊 java的asm

ASM插入回調(diào)方法

可以在worker中調(diào)用js回調(diào)。

公司主營(yíng)業(yè)務(wù):網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出鎮(zhèn)寧免費(fèi)做網(wǎng)站回饋大家。

使用wasm的時(shí)候,某些任務(wù)會(huì)被放到worker中執(zhí)行,執(zhí)行完成后回調(diào)通知結(jié)果。這個(gè)時(shí)候要特別注意:worker和主線程相互獨(dú)立。在worker中調(diào)用js回調(diào)時(shí),第一個(gè)面臨的限制就是webworker的限制不能訪問window,document對(duì)象,與主線程通信需要通過postmessage方式。

ASM是一種通用Java字節(jié)碼操作和分析框架。它可以用于修改現(xiàn)有的class文件或動(dòng)態(tài)生成class文件。

ASM是怎樣訪問及修改編譯了的class文件

ASM是基于ClassVisitor接口方法的調(diào)用順序,提供了3個(gè)核心組件,用于產(chǎn)生和修改轉(zhuǎn)換class

ClassReader解析compiled class的byte數(shù)組,其accept方法接受classVisitor的實(shí)例參數(shù),按順序調(diào)用它的各個(gè)visitXxx方法。將它作為事件的生產(chǎn)者。

ClassWriter直接構(gòu)建二進(jìn)制形式的class,toByteArray返回compiled class的byte數(shù)組。將它作為事件的消費(fèi)者

ClassAdapter內(nèi)部包裝了一個(gè)ClassVisitor實(shí)例,代理所有的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

首先必須調(diào)用visit, 然后最多訪問一次visitSource, 然后最多調(diào)用一次visitOuterClass, 然后選出visitAnnotation或者visitAttribute之一,對(duì)它訪問若干次,

然后選出visitInnerClass或者visitField或者visitMethod 之一, 對(duì)它調(diào)用若干次

最后必須調(diào)用一下visitEnd

以下例子說明了ClassReader如何使用accept方法, 依次按照所謂的順序,調(diào)用 ClassPrinter作為ClassVisitor的實(shí)現(xiàn)類的visitXxx方法,訪問java.util.Map的。

查看accept方法內(nèi)部,可以發(fā)現(xiàn)這個(gè)所謂的調(diào)用順序。

/**

* @{#} 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的實(shí)現(xiàn)類,在accept方法的內(nèi)部,以既定的順序調(diào)用cp.visitXxx(...)方法,最終輸出java.util.Map的編譯后class結(jié)構(gòu)

}

}

輸出結(jié)果: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語言中

不同編譯器嵌入?yún)R編的方式不一樣,具體如下:

一、Turbo

C ,

也就是所說的TC。

1、使用預(yù)處理程序的偽指令#asm和#endasm,#asm用來開始一個(gè)匯編程序塊,而#endasm指令用于該塊的結(jié)束。

參考代碼:

int mul(int a, int b)

{

/*匯編開始*/

#asm

mov ax,word ptr 8[bp]

imul ax word ptr 10[bp]

#endasm

/*匯編結(jié)束。*/

}

2、使用asm語句:

格式:asm匯編語句

參考代碼:

int mul(int a, int b)

{

asm mov ax,word ptr 8[bp]

asm imul ax word ptr 10[bp]

/*

每個(gè)asm對(duì)應(yīng)一句匯編

注意結(jié)尾不需要分號(hào)

*/

}

二、VC++/VS

格式:

__asm

匯編指令

[

;

]

__asm

{

匯編指令

}

[

;

]

asm前面是兩條下劃線,后面的方括號(hào)內(nèi)容表示分號(hào)可有可無。

使用方法:

1、一條一條地用:

__asm mov al, 2

__asm mov dx, 0xD007

__asm out dx, al

每行一條匯編,

可以有分號(hào),也可以沒有。

2、組成一塊地用:

__asm {

mov al, 2

mov dx, 0xD007

out dx, al

}

整體作為一個(gè)匯編代碼塊。

3、也可以將多條匯編寫在一行:

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

三、GNU

GCC

GCC對(duì)匯編的支持是最豐富的,簡(jiǎn)單介紹如下:

1、

用到的關(guān)鍵字:

“__asm__”

表示后面的代碼為內(nèi)嵌匯編,“asm”是“__asm__”的別名。

“__volatile__” 表示編譯器不要優(yōu)化代碼,后面的指令保留原樣,“volatile”是它的別名。

括號(hào)里面是匯編指令。

內(nèi)嵌匯編語法如下:

__asm__(

匯編語句模板:

輸出部分:

輸入部分:

破壞描述部分)

一個(gè)簡(jiǎn)單的匯編模板:

int a=10,b;

asm("movl %1, %%eax;

movl %%eax, %0;"

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

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

:"%eax" /*毀壞部*/

);

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

里邊r表示使用任意寄存器,%0、%1表示使用兩個(gè)寄存器,一般只能%0~%9共十個(gè)操作數(shù),按輸入輸出部變量出現(xiàn)順序進(jìn)行映射。

寄存器用兩個(gè)百分號(hào),是因?yàn)槭褂昧?0%1這些數(shù)字使百分號(hào)有了特殊意義,所以在操作數(shù)出現(xiàn)的寄存器必須用雙百分表示。

毀壞部里邊的%eax表示eax寄存器在匯編代碼塊執(zhí)行過程中會(huì)被改寫,在執(zhí)行前要保護(hù)好,這是提交給編譯器決定的。

急!!!關(guān)于使用ASM進(jìn)行JAVA字節(jié)碼操作的問題

如果直接運(yùn)行在平臺(tái)上就成了針對(duì)機(jī)器的了,而java目的就是要一次編譯,處處運(yùn)行。由于機(jī)器不同,對(duì)二進(jìn)制碼的要求也不同,所以不能達(dá)到上訴目標(biāo)。而java把源文件編譯成高效的字節(jié)碼,通過java虛擬機(jī)可以快速的轉(zhuǎn)換為各個(gè)機(jī)器所需要的機(jī)器碼,所以只要有java虛擬機(jī),java就能達(dá)到處處運(yùn)行。希望對(duì)你有幫助

java 的ASM字節(jié)碼編輯如果替換方法中的類名

等同于java代碼:

System.currentTimeMillis();

替換成time.zz()(要求time是類名,不是對(duì)象,zz是靜態(tài)方法)

很容易就出錯(cuò)。

如何在WordPress文章中插入代碼

第一步:首先從網(wǎng)上下載出WordPress的插件Wp-syntax。

第二步:在編輯文章時(shí),使用HTML的編輯方式插入以下代碼pre lang=”LANGUAGE” line=”0″//“l(fā)ine為1時(shí)表示顯示行號(hào)”/pre,中間插入要插入的代碼即可,LANGUAGE改為語言類型,例如php、java。line為0不顯示行號(hào),為1時(shí)顯示。

附:支持的語言如下: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://chinadenli.net/article16/hihedg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名自適應(yīng)網(wǎng)站標(biāo)簽優(yōu)化網(wǎng)站內(nèi)鏈手機(jī)網(wǎng)站建設(shè)靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)