Arkitektur og operativsystemer (dArkOS)


Besvarelse af ugeopgave, uge 38

http://www.daimi.au.dk/~smunk/dArkOS/uge38/

Mads Peter Lindberg, 20001990, 3,
Søren S. Munk, 20001614, 3,
Per Abrahamsen, 20001358, 3.
Kørsel af programmet imul.c gav:
imul(2,3) = 6.
Ved kørsel med en negativ værdi for x fås resultatet Resultatet bliver 0. Løkken kører kun mens x > 0, og da x < 0 fra start retuneres p=0 med det samme.
En kørsel med x=2 og y=-4 gav:
imul(2,-4) = -8.
Ved addition af -y x gange fås x(-y) som er det ønskede resultat. Grunden til at det er vores resultat er, at vi adderer -y til p x gange (p = p + y;) .

En kørsel af programmet imul.j ser således ud:

stack = 0, 1, 15 bipush 44 [10 2c] stack = 44, 0, 1, 15 bipush 2 [10 02] stack = 2, 44, 0, 1, 15 bipush 3 [10 03] stack = 3, 2, 44, 0, 1, 15 invokevirtual 0 [b6 00 00] stack = 14, 46, 0, 3, 2, 21, 0, 1 bipush 0 [10 00] stack = 0, 14, 46, 0, 3, 2, 21, 0 istore 3 [36 03] stack = 14, 46, 0, 3, 2, 21, 0, 1 iload 1 [15 01] stack = 2, 14, 46, 0, 3, 2, 21, 0 ifeq 20 [99 00 14] stack = 14, 46, 0, 3, 2, 21, 0, 1 iload 1 [15 01] stack = 2, 14, 46, 0, 3, 2, 21, 0 bipush 1 [10 01] stack = 1, 2, 14, 46, 0, 3, 2, 21 isub [64] stack = 1, 14, 46, 0, 3, 2, 21, 0 istore 1 [36 01] stack = 14, 46, 0, 3, 1, 21, 0, 1 iload 3 [15 03] stack = 0, 14, 46, 0, 3, 1, 21, 0 iload 2 [15 02] stack = 3, 0, 14, 46, 0, 3, 1, 21 iadd [60] stack = 3, 14, 46, 0, 3, 1, 21, 0 istore 3 [36 03] stack = 14, 46, 3, 3, 1, 21, 0, 1 goto -19 [a7 ff ed] stack = 14, 46, 3, 3, 1, 21, 0, 1 iload 1 [15 01] stack = 1, 14, 46, 3, 3, 1, 21, 0 ifeq 20 [99 00 14] stack = 14, 46, 3, 3, 1, 21, 0, 1 iload 1 [15 01] stack = 1, 14, 46, 3, 3, 1, 21, 0 bipush 1 [10 01] stack = 1, 1, 14, 46, 3, 3, 1, 21 isub [64] stack = 0, 14, 46, 3, 3, 1, 21, 0 istore 1 [36 01] stack = 14, 46, 3, 3, 0, 21, 0, 1 iload 3 [15 03] stack = 3, 14, 46, 3, 3, 0, 21, 0 iload 2 [15 02] stack = 3, 3, 14, 46, 3, 3, 0, 21 iadd [60] stack = 6, 14, 46, 3, 3, 0, 21, 0 istore 3 [36 03] stack = 14, 46, 6, 3, 0, 21, 0, 1 goto -19 [a7 ff ed] stack = 14, 46, 6, 3, 0, 21, 0, 1 iload 1 [15 01] stack = 0, 14, 46, 6, 3, 0, 21, 0 ifeq 20 [99 00 14] stack = 14, 46, 6, 3, 0, 21, 0, 1 iload 3 [15 03] stack = 6, 14, 46, 6, 3, 0, 21, 0 ireturn [ac] stack = 6, 0, 1, 15 ireturn [ac] stack = 6 return value: 6
Stakkens maksimale størrelse er 11. Denne størrelse optræder ved bipush 1 [10 01] stack = 1, 2, 14, 46, 0, 3, 2,21, 0, 1, 15
og iload 2 [15 02]
. Stakkens maksimale størrelse er konstant for x > 0, og for x=0 er stakken mindre.

Efter ordren invokevirtual imul ser stakken således ud:

stack = 14, 46, 0, 3, 2, 21, 0, 1
Værdien 46 er Callers PC som er det sted vi skal forsætte til efter metodekald og værdien 21 er Link Ptr til Callers PC i stakken altså er der 14 elementer som ikke er vist i stakken, da man tæller fra 0, ikke fra 1.
method area: 47 bytes 00 03 00 01 10 00 36 03 15 01 99 00 14 15 01 10 01 64 36 01 15 03 15 02 60 36 03 a7 ff ed 15 03 ac 00 01 00 00 10 2c 10 02 10 03 b6 00 00 ac constant pool: 2 words 00000000 00000021
Der er 47 bytes i method area og der går 4 bytes (8 bit) på et word (32 bit) altså har vi 12 words i method area + 2 i konstant pool = 14. altså har vi 14 elementer under stakken som ikke er vist i vores trace, dvs. de er egentlig ikke en del af stakken
.

Antal ordrer udført afhænger af den aktuelle værdi af x. 11x+11 = antal ordrer. Til at eftervise dette er der foretaget følgende kørsler med optælling af antal udførte ordrer:

x y antal ordrer -1 3 1174178 (afbrudt, øhhh) 0 3 11 1 3 22 2 3 33 3 3 44 4 3 55 5 3 66 6 3 77 7 3 88 .....
Vi kunne godt få det til at passe med vore gerelle udtryk. Det eneste der ikke paseede ind var for x=-1, hvilket resulterer i en uendelig lykke som terminerer når det negative tal bliver så stort at det bliver positivt og når 0. Altså en fejl i IJVM prgrammet. Men da resultatet er forkert for x<0 har det ikke den store betydning.