Java Çok aptal bir test sınıfı yazdı: baskı Java hotspot JIT derleme kod
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) ;
}
}
Sonra Java Hotspot JIT (Müşteri VM 23.7-b01 inşa) tarafından oluşturulan kodu görmek istedim. üretilen kod ilginç kısmı (yeni nesnenin başlatma atlanır edilir: "+ PrintAssembly -XX" seçeneğini ve burada
http://classparser.blogspot.dk/2010/03/hsdis-i386dll.html
gelen hsdis-i386.dll EDIT: Ben kullandı. kod için alt yöntem). Açıkçası, ebx "bu" işaretçisidir ve edx argümanın işaretçisidir.
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
Açıkçası, x86 ile birlikte çok bildik değilim ama bu kod size mantıklı geliyor? "Adc BYTE PTR [edx + 8], cl" gibi garip talimatlar neler yapıyor? Bazı FPU talimatlarını beklerdim.
"Assembly" sorunuzu etiketlerseniz daha iyi yanıtlar alabilirsiniz. – assylias
Bana göre bu derleme kodu bir anlam ifade etmiyor. HotSpot tarafından üretilen gerçek yürütülebilir kod olduğundan şüphem var. – NPE
Sökücünüzün makine kodunu doğru bir şekilde yorumlayamadığından şüpheleniyorum. 'LDS'' için opcode' 0xc5'' dir, ancak bu aynı zamanda daha yeni x86 CPU'larda bir [2 baytlık VEX öneki] (http://wiki.osdev.org/X86-64_Instruction_Encoding#VEX.2FXOP_opcodes) olabilir. – Michael