我用Java寫了一個非常愚蠢的測試類:印刷Java的熱點JIT的彙編代碼
public class Vector3 {
public double x,y,z ;
public Vector3(double x, double y, double z) {
this.x=x ; this.y=y ; this.z=z ;
}
public Vector3 subst(Vector3 v) {
return new Vector3(x-v.x,y-v.y,z-v.z) ;
}
}
然後我想看看由Java熱點JIT(客戶端VM建設23.7-B01)生成的代碼。我用了「-XX:+ PrintAssembly」選項,並從http://classparser.blogspot.dk/2010/03/hsdis-i386dll.html
這裏hsdis-i386.dll是生成的代碼的有趣的部分(我跳過了新對象的初始化編輯:代碼爲子方法)。顯然,ebx是「this」指針,edx是指向參數的指針。
lds edi,(bad)
sti
adc BYTE PTR [ebx+8],al ;*getfield x
mov edx,DWORD PTR [esp+56]
lds edi,(bad) ; implicit exception: dispatches to 0x02611f2d
sti
adc BYTE PTR [edx+8],cl ;*getfield x
lds edi,(bad)
sti
adc BYTE PTR [ebx+16],dl ;*getfield y
lds edi,(bad)
sti
adc BYTE PTR [edx+16],bl ;*getfield y
lds edi,(bad)
sti
adc BYTE PTR [ebx+24],ah ;*getfield z
lds edi,(bad)
sti
adc BYTE PTR [edx+24],ch ;*getfield z
lds edi,(bad)
sti
pop esp
rol ebp,0xfb
adc DWORD PTR [eax+8],eax ;*putfield x
lds ebp,(bad)
jmp 0x02611f66
rol ebp,cl
sti
adc DWORD PTR [eax+16],edx ;*putfield y
lds ebx,(bad)
fistp DWORD PTR [ebp-59]
sti
adc DWORD PTR [eax+24],esp ;*putfield z
老實說,我不是很熟悉x86程序集,但是代碼對你有意義嗎?那些奇怪的指令是什麼,比如「adc BYTE PTR [edx + 8],cl」在幹什麼?我會期待一些FPU指令。
如果您爲'assembly'標記問題,您可能會得到更好的答案。 – assylias 2013-03-11 11:46:28
對我來說,這個彙編代碼沒有意義。我懷疑這是HotSpot生成的實際可執行代碼。 – NPE 2013-03-11 12:15:02
我懷疑你的反彙編程序無法正確解釋機器碼。在較新的x86 CPU上,'LDS'的操作碼是'0xc5',但也可以是[2字節VEX前綴](http://wiki.osdev.org/X86-64_Instruction_Encoding#VEX.2FXOP_opcodes)。 – Michael 2013-03-11 12:22:16