ZASOBNIK (nalavo je dno):
1. %s - vlozenie mena instancie triedy
2. %s getfield - vlozenie operacie
3. H - vykonanie operacie a vlozenie hodnoty
4. H %s - vlozenie mena instancie triedy
5. H %s %s - vlozenie mena instancie triedy
6. H %s %s getfield - vlozenie operacie
7. H %s H - vykonanie operacie a vlozenie hodnoty
8. H %s H sipush 1 - vlozenie operacie s atributom 1
9. H %s H 1 - vykonanie operacie
10. H %s H 1 iadd - vlozenie operacie
11. H %s HI - vykonanie operacie a vlozenie vysledku suctu
12. H %s HI putfield - vlozenie operacie
13. H - vykonanie operacie
Teda na konci sa hodnota HI ulozila cez putfield do ID a na vrchole zasobnika ostala hodnota H este pred jej inkrementaciou co je podstatou operacie ID++.
(H - je hodnota ID, HI je inkrementovana hodnota ID)
Nutnost viacerych %s vypliva z formatu instrukcii getfield a putfield. Proste si treba poriadne nastudovat inst_jal.doc.
pozri ked som si to doc-ko nepresla aspon 100krat tak ani raz ;-) ale proste som to nevedela pochopit, takze ti velmi pekne dakujem ;-)
este keby niekto nerozumel, tak tu je popis od Plocicu:
- putfield potrebuje zasobnik v tvare:
| |
|---------------|
| hodnota (j+1 |
|---------------|
| ref.na objekt |
|---------------|
teda je potrebna ta instrukcia (alebo postupnost onstrukcii vseobecne),
ktora vlozi referenciu na aktualny objekt do zasobnika, pricom v kode
musi byt pred instrukciami, ktore vytvoria hodnotu => kvoli tomu je tam
to aload_0 dvakrat (presnejsie je ta postupnost instrukcii, kora
zodpoveda prekladu symbolu Vyraz ($1.kod) - v priklade je to "this",
co zodpoveda aktualnemu objektu apreto je tam to aload_0.
- kedze vyznam operatora ++ je taky, ze sa ma inkrementovat hodnota
nejakej premennej (tu instancna premenna) - to je tam zatial urobene,
ale navyse vysledkom je povodna hodnota premennej - preto je potrebne
dat do zasobnika povodnu hodnotu - a to sa da urobit tak, ze sa ta
hodnota premennej da najskor do zasobnika, preto je na zaciatku
este "aload_0"+"getfield ahoj j I"