Regjistrat e proçesoreve Kaos apo thjeshtesi? [MIPS]

Gjejm shpesh te shkruhet ne kod, kur shikojm programet tona assembly kode te tipit:
add $s0, $s1, $s2
E na thone qe $s0 = $s1 + $s2 dhe kuptojm qe vlera e rregjistrave $s1 dhe $s2 do te mblidhet dhe do te depozitohet tek rregjistri $s0 por ku qendron “kaosi”?
Problemi qendron qe nderkoh qe lexojm kodin assembly nuk shohim as vleren e rregjistrit $s1 dhe as ate te $s2-shit dhe themi,
Nga dreqin doli 10001001 tek $s0?

Ne realitet proçesi eshte shume i thjesht, dhe detyren per te asociuar variabilat e programeve me rregjistrat e ka kompilatori [kujdes po flasim per kompilator assembler dhe jo kompilatorin qe perkthen gjuhen nga niveli i lart ne ate te voglin].

Marrim 2 ushtrime per te shpjeguar kete fenomen dhe thjeshtesine e tij.

Ushtrimi 1

Pseudokodi;
a = (b + c) – (d + e);
Si eshte kodi assembly i ketij pseudokodi?

Ne kete rast ne na takon te marrim persiper rolin e assemblerit dhe do i lidhim ne vlerat me rregjistrat dhe perkatesisht;
meqenese kemi te bejm me variabila siç e mesuam tek ;
http://albanianwizard.org/informatika_shqiptare/arkitekture_kompiuterike/gjuha_e_programimit_assembly/regjistri-file-register-file-mips/

Rregjistri qe perdoret ne te tilla raste eshte seria e rregjistrave $s keshtu qe:
a = $s0; b = $s1; c = $s2; d = $s3; e = $s4;
Tani vazhdojm te kryejm veprimet me elementare dhe e ndajm kodin ne 2 pjese (b+c) dhe (d+e) dhe i depozitojm vlerat ne rregjistra temporan $t0 pasi nuk na duhen per shume kohe keshtu qe kodi assembly i bie te jete:

add $t0, $s1, $s2       # t0 = $s1 + $s2 = b + c
add $t1, $s3, $s4       # t1 = $s3 + $s4 = d + e
sub $s0, $t0, $t1,      # s0 = $t0 - $t1 = (b + c) - (d + e)

Nga vet komentimi besoj se kuptuam se ç’fare ndodhi.. le te sjellim nje shembull tjeter..

Ushtrimi 2

Perpara se te shikojm se si zgjidhet le te fiksojm dy ligje qe na duhen;

  1. Ne ç’do instruksion Mips, egzekuton gjithmon vetem 1 funksion i cili pershkruhet medoemos nga 3 variabila ku secila nga ato variabila i perket nje rregjistri. psh sub $s0, $t1, $t2
  2. Te vetmet instruksione qe perdorin memorjen ne aritekturen MIPS jane lw (load word) dhe sw (store word) te cilat me ane te nje instruksioni te posatshem qe quhet Data Transfer Instruction jane ne gjendje te marrin dhe te japin informacione nga memorja RAM

Vazhdojm me ushtrimin,
Le te marrim qe assembleri (pasi e pame njehere kete proçes) ka asociuar variabilat t dhe y me rregjistrat $s1 dhe $s2 dhe le te marrim qe kemi nje array (ne kete rast grumbull te dhenash) qe “fshihet” mbas ‘adreses baze’ ( lokacioni ne memorje qe shenon fillimin e te dhenave) te quajtur G mbas te ciles gjenden 100 fjale dhe kete adrese baze asembleri ka caktuar qe te gjendet tek rregjistri $s3.
Kalojm tek pseudokodi:
t = y + G[8];
I kemi shpjeguar te gjitha perveç [8]-tes e cila eshte nje konstante. qe do te thote se do te selektohen 8 elemente.
Ç’fare po ndodh?
Ne po na jepet ne kete rast nje lokacion memorjeje, dhe na thuhet qe adresa per te selektuar tog-dateshin (tog-fjaleshin) e isntruksioneve qe gjendet ne memorje eshte e perbere nga adresa fillestare (baze) + elementet per tu selektuar qe jane 8.
Adresa = adresen baze + 8 elemente = g + [8] e te gjitha keto do te magazinohen ne regjistrin $s3
Mbas kesaj na duhet qe ta mbledhim me y ($s2) dhe shumen ta depozitojm ne t ($s1).
Nga ky pseudokod nxjerrim qe fillimisht duhet te terheqim te dhena nga memorja dhe kete e ben vetem lw (load word);

lw $t0, 8($s3) #Momentalisht rregjistri $t0 merr g -n qe ndodhet tek $s3 + 8 (konstanten)

mbas kesaj besoj qe eshte e thjeshte, duhet vetem te marrim ate qe gjendet ne $t0 (G[8]) ta mbledhim me y ($s2) dhe ta magazinojm tek ($s1).

add $s1, $s2, $t0     # t = y + G[8]

Konstantja ne kete rast (8) ne nje instruksion per levizje te dhenash quhet offset kurse regjistri qe i shtohet (G) quhet rregjistri baze.

Leave a Reply

Your email address will not be published. Required fields are marked *