私は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"オプションとhsdis-i386.dllをhttp://classparser.blogspot.dk/2010/03/hsdis-i386dll.htmlから
ここでは、私は新しいオブジェクトの初期化をスキップしました。 substメソッド)。明らかに、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
私には、このアセンブリコードは理にかなっていません。私はこれがHotSpotによって生成された実際の実行可能コードであるとは思わない。 – NPE
逆アセンブラがマシンコードを正しく解釈できないと思われます。 'LDS'のオペコードは' 0xc5'ですが、新しいx86 CPUでは[2バイトのVEXプレフィックス](http://wiki.osdev.org/X86-64_Instruction_Encoding#VEX.2FXOP_opcodes)でもかまいません。 – Michael