instruction machine virtuelle Java ALOAD_0 dans la méthode dite « principale » des points à « args » au lieu de « ce »?

StackOverflow https://stackoverflow.com/questions/4641416

Question

Je suis en train de mettre en œuvre un sous-ensemble de Java pour une étude universitaire. Eh bien, je suis dans les dernières étapes (génération de code) et je l'ai écrit un programme assez simple pour voir comment les arguments de la méthode sont traités:

class Main {
    public static void main(String[] args) {
        System.out.println(args.length);
    }
}

Ensuite, je l'ai construit, et RAN « Main.class » par un désassembleur en ligne j'ai trouvé à: http://www.cs.cornell.edu/People/egs/kimera /disassembler.html

je reçois la mise en œuvre suivant la méthode « principale »: (La sortie est démonté en 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

Mon problème est:
1. aload_0 est censé pousser « ceci » sur la pile (c'est ce que la spécification JVM semble dire)
2. arraylength est supposée retourner la longueur de la matrice dont la référence est sur le haut de la pile

Alors, selon moi, la combinaison de 1 et 2 ne devrait pas même le travail.

Comment / pourquoi est-ce que ça marche? Ou est le buggy désassembleur et le bytecode réelle est autre chose?

Était-ce utile?

La solution

  

aload_0 est censé pousser « ceci » sur la pile

Pas tout à fait ... aload_0 lit le premier argument de référence (ou, plus généralement, la première variable de référence locale) de la méthode et le pousse sur la pile.

Dans les fonctions membres, la première variable locale se trouve être la référence this.

Mais main n'est pas une fonction membre, il est statique fonction donc il n'y a aucun argument this, et le vrai premier argument de la méthode est args.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top