一. bytecode標準
可參考JVM Specification(http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html):
chapter4 "The class File Format" 以presudo code說明byte code格式。
chapter6 "The Java Virtual Machine Instruction Set"說明JVM opcode。
對照以上內容可使用HEX editor自行撰寫bytecode再以JVM執行。
二. java組合語言
相較於C編譯為assembler再組譯為machine code執行,如果將JVM視為physical machine,java bytecode相當於machine code的地位。但在java原始碼和bytecode之間,sun沒有定義標準的java assembler。
jasmin(http://jasmin.sourceforge.net/)是一個java assembler(非標準),相較於直接編輯bytecode,可以先撰寫jasmin再組譯為byecode較為容易。
JDK也提供一個bytecode類反組譯器,可將bytecode轉為ascii code,說明如下:
指令javap -c employeeName
employeeName.java內容
==========================================
public String employeeName()
{
return name;
}
==========================================
執行結果
==========================================
Method java.lang.String employeeName()
0 aload_0
1 getfield #5
4 areturn
==========================================
以 javap 列出來的內容對照 JVM spec可瞭解 JVM instructions 的用途以及 class file format。
三. 參考資料:
[1] Java bytecode: Understanding bytecode makes you a better programmer
http://www-128.ibm.com/developerworks/ibm/library/it-haggar_bytecode/
[2]JVM Specification
http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html
[3]jasmin
http://jasmin.sourceforge.net/
[4]Decompiling Java
http://www.tenlong.com.tw/Read/readForm.php?i=16
[5]A Working Developer`s Guide to Java Bytecode
http://www.strongd.net/blog/show/75

1 意見:
http://blog.ring.idv.tw/comment.ser?i=311
張貼意見