Tôi đã viết một lớp thử nghiệm rất ngu ngốc trong Java:in Java hotspot JIT lắp ráp đang
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) ;
}
}
Sau đó, tôi muốn nhìn thấy mã được tạo ra bởi Java Hotspot JIT (Client VM xây dựng 23,7-b01). Tôi đã sử dụng tùy chọn "-XX: + PrintAssembly" và hsdis-i386.dll từ http://classparser.blogspot.dk/2010/03/hsdis-i386dll.html
Đây là phần thú vị của mã được tạo ra (tôi đã bỏ qua việc khởi tạo đối tượng mới. EDIT: mã cho phương thức subst). Rõ ràng, ebx là con trỏ "this" và edx là con trỏ tới đối số.
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
Thành thật mà nói, tôi không rất hài lòng với lắp ráp x86 nhưng mã đó có hợp lý với bạn không? Những hướng dẫn lạ như "adc BYTE PTR [edx + 8], cl" đang làm gì? Tôi đã mong đợi một số hướng dẫn của FPU.
Bạn có thể nhận được câu trả lời tốt hơn nếu bạn gắn thẻ câu hỏi 'assembly'. – assylias
Với tôi, mã lắp ráp này không có ý nghĩa gì cả. Tôi nghi ngờ đây là mã thực thi thực tế được tạo bởi HotSpot. – NPE
Tôi nghi ngờ rằng bộ tách rời của bạn không thể diễn giải chính xác mã máy. Mã opcode cho 'LDS' là' 0xc5', nhưng đó cũng có thể là [tiền tố VEX 2 byte] (http://wiki.osdev.org/X86-64_Instruction_Encoding#VEX.2FXOP_opcodes) trên các CPU x86 mới hơn. – Michael