Próbuję zaimplementować podzbiór Java do badania akademickiego. Cóż, jestem w ostatnim stadium (generowanie kodu) i napisałem dość prosty program, aby zobaczyć, jak argumenty metody są obsługiwane:Instrukcja JVM ALOAD_0 w "głównej" metodzie wskazuje "args" zamiast "this"?
class Main {
public static void main(String[] args) {
System.out.println(args.length);
}
}
Potem zbudował go i pobiegł „Main.class” poprzez Online dezasembler znalazłem na stronie: http://www.cs.cornell.edu/People/egs/kimera/disassembler.html
otrzymuję następujący realizacji do „głównego” metody: (zdemontowanych wyjściowy w Jasmin)
.method public static main([Ljava/lang/String;)V
.limit locals 1
.limit stack 2
getstatic java/lang/System/out Ljava/io/PrintStream;
aload_0
arraylength
invokevirtual java/io/PrintStream.println(I)V
return
.end method
Mój problem polega na tym:
1. ma na celu popchnąć "to" na stos (to, co wydaje się mówić specyfikacja JVM)
2.arraylength
ma zwrócić długość tablicy, której odniesienie znajduje się na szczycie stosu
Więc według mnie połączenie 1 & 2 nie powinno nawet działać.
Jak/dlaczego to działa? A może bugsem dezasemblera i faktycznym bajtem jest coś innego?
+1. this.foo (x, y) jest naprawdę Foo.foo (this, x, y) – grinch
Czy to obowiązuje dla * wszystkich * metod statycznych? –
@ dohaqatar7 Tak. –