Maskinarkitektur (Q3/2007)


Besvarelse af ugeopgave / ugeseddel 2

Soeren Loebner, 20050677, DA3,
Peter Poder, 20062546, DA3,
Kristian Thomsen, 20063105, DA3.

Filerne ligger i: /users/lobner/kurser/dMasArk/u2/


Kørsel af programmet imul.c gav:
imul(2,3) = 6.
Ved kørsel med en negativ værdi for x fås det følgende: En kørsel med x=2 og y=-4 gav:
imul(2,-4) = -8.
Der kommer 'x' gennemloeb i while-loekken, derfor skal 'x' vaere positiv. For hvert gennemloeb bliver 'y' lagt til 'p' (p=p+y) og denne addition virker ogsaa med negative tal. 'p' retuneres.

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

IJVM Trace of imul.bc Wed Feb 7 10:42:26 2007 stack = 0, 1, 16 bipush 44 [10 2c] stack = 44, 0, 1, 16 bipush 2 [10 02] stack = 2, 44, 0, 1, 16 bipush 3 [10 03] stack = 3, 2, 44, 0, 1, 16 invokevirtual 0 [b6 00 00] stack = 15, 51, 0, 3, 2, 22, 0, 1 bipush 0 [10 00] stack = 0, 15, 51, 0, 3, 2, 22, 0 istore 3 [36 03] stack = 15, 51, 0, 3, 2, 22, 0, 1 iload 1 [15 01] stack = 2, 15, 51, 0, 3, 2, 22, 0 iflt 25 [9b 00 19] stack = 15, 51, 0, 3, 2, 22, 0, 1 iload 1 [15 01] stack = 2, 15, 51, 0, 3, 2, 22, 0 ifeq 20 [99 00 14] stack = 15, 51, 0, 3, 2, 22, 0, 1 iload 1 [15 01] stack = 2, 15, 51, 0, 3, 2, 22, 0 bipush 1 [10 01] stack = 1, 2, 15, 51, 0, 3, 2, 22 isub [64] stack = 1, 15, 51, 0, 3, 2, 22, 0 istore 1 [36 01] stack = 15, 51, 0, 3, 1, 22, 0, 1 iload 3 [15 03] stack = 0, 15, 51, 0, 3, 1, 22, 0 iload 2 [15 02] stack = 3, 0, 15, 51, 0, 3, 1, 22 iadd [60] stack = 3, 15, 51, 0, 3, 1, 22, 0 istore 3 [36 03] stack = 15, 51, 3, 3, 1, 22, 0, 1 goto -24 [a7 ff e8] stack = 15, 51, 3, 3, 1, 22, 0, 1 iload 1 [15 01] stack = 1, 15, 51, 3, 3, 1, 22, 0 iflt 25 [9b 00 19] stack = 15, 51, 3, 3, 1, 22, 0, 1 iload 1 [15 01] stack = 1, 15, 51, 3, 3, 1, 22, 0 ifeq 20 [99 00 14] stack = 15, 51, 3, 3, 1, 22, 0, 1 iload 1 [15 01] stack = 1, 15, 51, 3, 3, 1, 22, 0 bipush 1 [10 01] stack = 1, 1, 15, 51, 3, 3, 1, 22 isub [64] stack = 0, 15, 51, 3, 3, 1, 22, 0 istore 1 [36 01] stack = 15, 51, 3, 3, 0, 22, 0, 1 iload 3 [15 03] stack = 3, 15, 51, 3, 3, 0, 22, 0 iload 2 [15 02] stack = 3, 3, 15, 51, 3, 3, 0, 22 iadd [60] stack = 6, 15, 51, 3, 3, 0, 22, 0 istore 3 [36 03] stack = 15, 51, 6, 3, 0, 22, 0, 1 goto -24 [a7 ff e8] stack = 15, 51, 6, 3, 0, 22, 0, 1 iload 1 [15 01] stack = 0, 15, 51, 6, 3, 0, 22, 0 iflt 25 [9b 00 19] stack = 15, 51, 6, 3, 0, 22, 0, 1 iload 1 [15 01] stack = 0, 15, 51, 6, 3, 0, 22, 0 ifeq 20 [99 00 14] stack = 15, 51, 6, 3, 0, 22, 0, 1 iload 3 [15 03] stack = 6, 15, 51, 6, 3, 0, 22, 0 ireturn [ac] stack = 6, 0, 1, 16 ireturn [ac] stack = 6 return value: 6
Stakkens maksimale størrelse er 11. Denne størrelse optræder de steder hvor 22 ligger i yderste position paa printet, da man her ikke kan se de 3 oevrige vaerdier, 0, 1 og 16. Stoerrelsen afhaenger kun af hvor mange variable der indgaar, og ikke af while-loekken, da stakkens stoerrelse er den samme ved start og slut af loekken.

Efter ordren invokevirtual imul ser stakken således ud:

stack = 15, 51, 0, 3, 2, 22, 0, 1
Værdien 51 er prev. PC og værdien 22 er linkpointeren der peger paa hvor i _hukommelsen_ prev. PC kan findes.

Antal ordrer udført afhænger af den aktuelle værdi af x. Fordi x bestemmer antallet af gennemloeb af while-loekken, som foelger af det generelle udtryk ordrer = (13+(13x)) Da while-loekken tilfoejer 13 linier for hvert gennemloeb, og udover det er der 13 linier. Til at eftervise dette er der foretaget følgende kørsler med optælling af antal udførte ordrer:

x y antal ordrer 2 3 39 2 -4 39 // vaerdien af y betyder intet for antal ordrer. 42 -4 559 // kun x betyder noget.
Det passer :P