2011-01-09 24 views
17

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?

Odpowiedz

39

aload_0 ma pchnąć „to” na stosie

Niezupełnie ... aload_0 czyta argument Pierwsza wzmianka (lub, bardziej ogólnie, pierwsza zmienna referencyjna lokalne) metody i popycha go na stos.

W funkcjach składowych pierwszą zmienną lokalną jest numer referencyjny this.

Ale main nie jest funkcją członkiem, to statyczny funkcja nie ma więc this argumentem, a prawdziwa Pierwszy argument tej metody jest args.

+9

+1. this.foo (x, y) jest naprawdę Foo.foo (this, x, y) – grinch

+0

Czy to obowiązuje dla * wszystkich * metod statycznych? –

+0

@ dohaqatar7 Tak. –