मैं जावा में एक बहुत ही बेवकूफ परीक्षण वर्ग ने लिखा है:मुद्रण जावा हॉटस्पॉट 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) ;
}
}
तब मैं जावा हॉटस्पॉट JIT (क्लाइंट वी एम का निर्माण 23.7-B01) द्वारा बनाया गया कोड देखना चाहती थी। मैंने "-XX: + PrintAssembly" विकल्प और hsdis-i386.dll http://classparser.blogspot.dk/2010/03/hsdis-i386dll.html
यहां जेनरेट कोड का दिलचस्प हिस्सा है (मैंने नई ऑब्जेक्ट की शुरुआत को छोड़ दिया है। संपादित करें: कोड के लिए कोड सबस्ट विधि)। जाहिर है, ईबीएक्स "यह" सूचक है और 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 असेंबली के साथ बहुत familar नहीं हूँ, लेकिन क्या यह कोड आपको समझ में आता है? "एडीसी BYTE पीटीआर [edx + 8], सीएल" जैसे उन अजीब निर्देश क्या हैं? मुझे कुछ एफपीयू निर्देशों की उम्मीद होगी।
यदि आप अपना प्रश्न 'असेंबली' टैग करते हैं तो आपको बेहतर उत्तर मिल सकते हैं। – assylias
मेरे लिए, इस असेंबली कोड को कोई समझ नहीं आता है। मुझे संदेह है कि यह हॉटस्पॉट द्वारा उत्पन्न वास्तविक निष्पादन योग्य कोड है। – NPE
मुझे संदेह है कि आपका डिस्सेबलर मशीन कोड को सही तरीके से समझने में असमर्थ है। 'एलडीएस' के लिए ओपोड' 0xc5' है, लेकिन यह एक नए x86 CPUs पर एक [2-बाइट वेक्स उपसर्ग] (http://wiki.osdev.org/X86-64_Instruction_Encoding#VEX.2FXOP_opcodes) भी हो सकता है। – Michael