可以在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是基于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
}
不同編譯器嵌入?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ù)好,這是提交給編譯器決定的。
如果直接運(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代碼:
System.currentTimeMillis();
替換成time.zz()(要求time是類名,不是對(duì)象,zz是靜態(tài)方法)
很容易就出錯(cuò)。
第一步:首先從網(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)