PRIMERI SA PREDAVANJA 17 Beta asembler Zadatak 1. Posmatrajmo sledeću funkciju napisanu u programskom jeziku C, za računanje najvećeg zajedničkog delioca dva pozitivna cela broja: int gcd(int a, int b) { if (a == b) return a; if (a > b) return gcd(a b, b); return gcd(a, b a); } A. Ručno prevesti C funkciju u Beta asemblerski jezik. Rešenje: PUSH (LP) PUSH (BP) MOVE (SP, BP) LD (BP, -12, R0) LD (BP, -16, R1) CMPEQ (R0, R1, R2) BT (R2, L1) CMPLE (R0, R1, R2) BT (R2, L2) SUB (R0, R1, R2) BR (gcd, LP) DEALLOCATE (2) BR (L1) L2: SUB (R1, R0, R2) PUSH (R0) BR (gcd, LP) DEALLOCATE (2) L1: POP (R2) POP (R1) POP (BP) POP (LP) JMP (LP) 1
B. Šta je prevodilac hteo da postigne instrukcijom LD(BP, -16, R1)? Rešenje: pristup drugom argumentu poziva funkcije, koji je udaljen 16 B od lokacije na koju pokazuje BP u trenutnom okviru (frame). C. Ručno prevesti instrukciju BR(L1) iz asemblerskog jezika u mašinski kod instrukcije. Rešenje: BR(L1) je makro koji se prevodi u BR(L1, R31), što je takođe makro koji se prevodi u BEQ(R31, L1, R31). Mašinki oblik ove instrukcije je: 011100 11111 11111 0000000000000111 jer je instrukcija na koju se skače udaljena 7 lokacija od naredne instrukcije. Ne treba zaboraviti da je PUSH makro koji se sastoji od 2 instrukcije. D. Šta se nalazi u registru R0 u trenutku izvršenja instrukcije sa labelom L1? Rešenje: Prilikom izlaska iz funkcije, u registru R0 se nalazi povratna vrednost funkcije. E. Koliko je zauzeta stack memorija tokom izvršenja sledećeg poziva funkcije: gcd(24, 16)? Rešenje: gcd(24, 16) => gcd(8, 16) => gcd(8, 8) što je bazni slučaj rekurzije. Ukupno se zauzima 3 okvira, od kojih je svaki veličine 6 lokacija. Ukupno zauzeće je stoga 18 lokacija, odn. 18 x 4 = 72 B. Tokom izvršavanja poziva funkcije gcd(28, 70) pojavljuje se sledeći sadržaj stack memorije:??? 0x00000594 0x00001234 0x00000046 0x0000002A 0x0000001C 0x00000594 0x0000124C 0x0000002A <-- BP 0x00001254 <-- SP F. Koja je vrednost drugog argumenta (b) trenutnog poziva funkcije? Rešenje: drugi argument se nalazi na lokaciji 16 B udaljenoj od BP. Vrednost drugog argumenta je 0xE. G. Koja vrednost se nalazi u registru BP? Rešenje: Iznad trenutne lokacije na koju pokazuje BP se nalazi sačuvana stara vrednost BP: 0x124C, što je koordinatni početak prethodnog okvira. Trenutna vrednost BP je stoga 0x124C + 0x18 = 0x1264. Veličina okvira je 6 lokacija, odn. 24 = 0x18 B. 2
H. Šta se nalazi na nepoznatoj lokaciji (???) u stack memoriji? Rešenje: Na nepoznatoj lokaciji se nalazi prvi argument prethodnog poziva. Pošto je prvi poziv bio gcd(28. 70), redosled poziva je: gcd(28, 70) => gcd(28, 42) => gcd(28, 14). Prvi argument prethodnog poziva je 28. I. Na kojoj adresi u memoriji za instrukcije se nalazi instrukcija POP(R2)? Rešenje: Iz trenutnog okvira stack memorije saznajemo povratnu adresu trenutnog poziva, na lokaciji sačuvanog LP. U pitanju je adresa 0x594. Pošto je u prethodnom pozivu drugi argument bio veći od prvog, zaključujemo da je u pitanju povratna adresa koja pokazuje na lokaciju DEALLOCATE (2) koja se nalazi odmah iznad instrukcije sa labelom L1. Stoga je adresa instrukcije sa labelom L1 0x594 + 0x4 = 0x598. J. Šta je značenje vrednosti 0x1254, na lokaciji na koju pokazuje SP, u ovom trenutku? Rešenje: Ova vrednost ne nosi nikakvo značenje jer je na tom mestu stack memorija prazna. Stack memoriju smatramo praznom od lokacije na koju pokazuje SP, pa na dalje. Zadatak 2. Dat je sledeći C program i njegov prevod u Beta asemblerski jezik. int f(int x) { int a = (x & 5); if (x == 0) return 0; else return???; } Prevod u asemblerski jezik: f: PUSH (LP) PUSH (BP) MOVE (SP, BP) ALLOCATE (1) LD (BP, -12, R0) ANDC (R0, 5, R1) ST (R1, 0, BP) xx: yy: BEQ (R0, bye) SUBC (R0, 1, R0) PUSH (R0) BR (f, LP) DEALLOCATE (1) 3
LD (BP, 0, R1) ADD (R1, R0, R0) bye: POP (R1) MOVE (BP, SP) POP (BP) POP (LP) JMP (LP) A. Koji izraz nedostaje u C programu, na mestu upitnika? Rešenje: izraz se otkriva iz analize asemblerskog programa. U pitanju je izraz: a + f(x-1). B. Gde je smeštena lokalna promenljiva a? Rešenje: lokalna promenljiva je smeštena u stack memoriji, na lokaciji na koju pokazuje BP. C. Ručno prevesti instrukciju sa labelom yy u Beta mašinski kod. Rešenje: Makro BR(f, LP) se prevodi u BEQ(R31, f, LP), a ova instrukcija se prevodi u sledeći mašinski oblik: 011100 11100 11111 1111111111110000. Udaljenost instrukcije sa labelom f je -16 lokacija u odnosu na narednu instrukciju od instrukcije skoka. Tokom izvršavanja jednog poziva funkcije, izvršavanje programa je stalo u trenutku kada programski brojač ima vrednost labele xx. U tom trenutku, registar BP ima vrednost 0x174, a stack memorija ima sledeći sadržaj: 0x00000007 0x00000007 0x0000005C 0x000000D4 0x00000003 0x00000006 0x000000A4 0x0000014C 0x00000004 0x000000A4 0x00000160 <-- BP 0x00000004 D. Koju vrednost ima registar SP? Rešenje: Registar SP pokazuje na prvu slobodnu lokaciju u stack memoriji. Pošto je vrednost registra VP 0x174, a veličina okvira (frame) je 5 lokacija, vrednost registra SP je 0x174 + 0x8 = 0x17C. 4
E. Koju vrednost ima lokalna promenljiva a? Rešenje: Lokalna promenljiva a se nalazi na lokaciji na koju pokazuje registar BP. Vrednost je: 0x5. F. Koja je adresa prvog poziva funkcije u glavnom programu? Rešenje: Povratna adresa prvog poziva je 0x5C, što vidimo u sadržaju stack memorije u pitanju je jedini sačuvani LP od ostalih, pošto je prilikom svih rekurzivnih poziva povratna adresa ista. instrukcija poziva funkcije, odn. skoka na funkciju, se onda nalazi lokaciju iznad, na adresi 0x58. G. Koju vrednost ima programski brojač? Rešenje: Programski brojač ima adresu trenutno izvršavane instrukcije, odn. labele xx. Pošto je povratna adresa rekurzivnog poziva 0xA4, a to je adresa instrukcije DEALLOCATE (1), a labela xx je udaljena 5 instrukcija unazad, vrednost labele xx je: 0xA4 0x14 = 0x90. Adapted material under Creative Commons License. MIT OCW https://ocw.mit.edu/terms/ 5