Download as pdf or txt
Download as pdf or txt
You are on page 1of 8

II PARCIJALNI PISMENI ISPIT Varijanta Poena

IZ PREDMETA SISTEMSKO PROGRAMIRANJE


SARAJEVO, 15.1.2020 A
STUDENT:_________________________________________
Zadatak Nivo Max. poena Ostvareno poena

1 1 1
Koja je uloga loadera?
Učitavanje izvršne verzije programa u memoriju
Zadatak Nivo Max. poena Ostvareno poena

2 1 1
Šta se nalazi u sekciji .debug?
Informacije potrebne debagerskim programima za traženje grešaka u programu koje se mogu
lako izbaciti iz izvršnog programa
Zadatak Nivo Max. poena Ostvareno poena

3 2 1
Dopunite sljedeću tabelu API funkcija
Funkcija Kategorija Namjena
FillRgn Funkcije Regiona na ekranu Puni region koristeći navedenu četku
ExitProcess Funkcije procesa i niti Završava proces i sve njegove niti
EndPage Funkcije za štampanje Označava kraj strane
Zadatak Nivo Max. poena Ostvareno poena

4 2 1
Zašto odmotavanje petlji nije uvijek dobra rutina optuimizacije?
Ova metoda može da poveća veličinu izvršnog koda
Zadatak Nivo Max. poena Ostvareno poena

5 3 2
Neka se funkcija GenFile(char * FileName,int length) poziva iz dinamičke biblioteke fileutil.dll. Napišite
program koji poziva ovu funkciju koristeći eksplicitno dinamičko linkovanje.
#include<windows.h>
#include <stdio.h>
int main() {
typedef void * (*pfunc) (char * FileName,int length);
HANDLE hdll;
pfunc GenFile;
double x,y;
hdll=LoadLibrary("fileutil.dll");
GenFile=(pfunc)GetProcAddress(hdll,"GenFile");
GenFile("test.dat",100);
}
Zadatak Nivo Max. poena Ostvareno poena

6 3 1
Nacrtajte redoslijed sekcija izvršnog programa ako je linker pozvan sa ld a.o b.o c.o gdje su datoteke
organizovane kao na sljedećoj slici.

.info .data .data$c


.text
.data .datb .info$b
.info
.text .text .text
.data
.debug .datc .drctve
.datb
a.o b.o c.o .datc

.debug
Zadatak Nivo Max. poena Ostvareno poena

7 3 1
Neka je dat vrh 40 kolonskog tekstualnog ekrana

I s p i t i z s i s t e m s k o g p r o g r a m i r a n j a
D a n a s

Na kojim memorijskim lokacijama se nalaze slova “t”, ako je segmenti registar DS postavljen na 0B800h
4*2=8 i 12*2=24=18h
_________________________________________________________________________________
Zadatak Nivo Max. poena Ostvareno poena

8 3 3
Neka je u FILDZAN-32 kompajleru prevođena sljedeća linija koda
ako z=2 { d :=Message(“AAA”,20); }
Napišite prevedene naredbe asemblerskog koda. ASCII kod za slovo 'A' je 65.

LEA EBX,[z] LEA EBX,[d] LEA EAX,[L4]


MOV EAX,[EBX] MOV EAX,[EBX] MOV [ESP+0],EAX
PUSH EAX PUSH EBX MOV EAX,20
MOV EAX,2 SUB ESP,L3 MOV [ESP+4],EAX
POP EBX section .data L3 EQU 8
CMP EBX,EAX L4 DB 65 CALL _Message@8
SETE AL DB 65 POP EBX
AND EAX,0FFh DB 65 MOV [EBX],EAX
CMP EAX,0 DB 0
JZ L1 section .text

Zadatak Nivo Max. poena Ostvareno poena

9 3 2
Programer je stalno kompajlirao C dio programa koristeći
gcc -c glavni.c -o glavni.o
pa asemblerski dio programa koristeći
nasm -fwin32 pp.asm
a zatim ih linkovao koristeći
ld -o final.exe crt0.o glavni.o pp.o -lc
Projekt menadžer je tražio refaktorisanje programa, tako da se datoteka glavni.c razdvoji u receive.c , send.c i
g3.c, a pp.asm u input.asm i output.asm. Pored ovoga, dodan je mini generator tab2asm koji pravi asm datoteke
od tekstualnih tabela i koji se poziva sa
tab2asm info.tab info.asm
Pošto je složenost sistema narasla, potrebno je napisati Makefile
all : final.exe gcc -c g3.c -o g3.o
final.exe : receive.o send.o g3.o pp.o info.o pp.o : pp.asm
ld -o final.exe crt0.o receive.o send.o g3.o pp.o nasm -fwin32 pp.asm
info.o -lc pp.o : pp.asm
receive.o : receive.c nasm -fwin32 pp.asm
gcc -c receive.c -o receive.o info.o : info.asm
send.o : send.c nasm -fwin32 info.asm
gcc -c send.c -o send.o info.asm : info.tab
g3.o : g3.c tab2asm info.tab info.asm
Zadatak Nivo Max. poena Ostvareno poena

10 4 2
Uporedite interpretiranje i kompajliranje, prednosti i nedostaci jednog i drugog
Interpretiranje je brže u razvoju softvera pošto se ne čeka na početak izvršenja. Kompajliranje
je brže u izvršenju ali sporije u prevođenju. Neke programske konstrukcije se mogu postići samo
jednom od ovih varijanti.
Zadatak Nivo Max. poena Ostvareno poena

11 5 2
Koje od sljedećih rješenja predstavlja ispravan početak i završetak interapt rutine i zašto:
PUSHA MOV EAX,20 PUSHA PUSHA
.... PUSH EAX .... ....
POPA .... MOV DX,20h OUT 20h,20h
IRET POP EAX MOV AL,20h POPA
IRET OUT DX,AL IRET
POPA
IRET
_Četvrto rješenje koristi nepostojeću instrukciju, prvo i drugo ne označavaju kraj interapta.
Drugo još kvari registar Ispravno je treće rješenje.

Zadatak Nivo Max. poena Ostvareno poena

12 6 3
Napisati Win32 API program u C koji iscrtava sljedeći prozor sa
jednim dugmetom i seditnim poljem. Klik na dugme Kreni pokreće
brojač od nule i ažurira se svake sekunde kroz sistem puruka. Klik na
dugme Stop zaustavlja brojač. Korisne informacije:
 Vrijeme upišite unutar statičkog teksta. On se postavi kao
prozor klase “STATIC” stila WS_CHILD i WS_VISIBLE.
 Poruka WM_TIMER se šalje svakih onoliko milisekundi
koliko je proslijeđeno kao treći parametar funkcije SetTimer.
Prvi parametar ove funkcije je handle na prozor kome se šalje
ova poruka, drugi i četvrti mogu biti 0 i NULL.. Kao rezultat
vraća identifikator timera koji je tipa UINT_PTR
 Timer se deaktivira funkcijom KillTimer, čiji je prvi parametar
oznaka prozora a drugi identifikator timera.
 Dugme šalje poruku WM_COMMAND, čiji wParam parametar sadrži handle od tog prozora.
 Dugme je prozor klase “BUTTON” stila WS_CHILD i WS_VISIBLE.
 Naslov prozora (što uključuje i tekst edit polja) se postavlja funkcijom SetWindowText(HWND hwnd,
char * text)
#include <windows.h> WNDCLASSEX WndClsEx;
#include <stdio.h> WndClsEx.cbSize = sizeof(WNDCLASSEX);
LPCTSTR ClsName = "BasicApp"; WndClsEx.style = CS_HREDRAW |
LPCTSTR WndName = "Vrijeme"; CS_VREDRAW;
int tot; WndClsEx.lpfnWndProc = WndProcedure;
HWND hStatic,hDugme,hStop; WndClsEx.cbClsExtra = 0;
UINT_PTR timer; WndClsEx.cbWndExtra = 0;
LRESULT CALLBACK WndProcedure(HWND hWnd, WndClsEx.hIcon =
UINT Msg, WPARAM wParam, LPARAM lParam) LoadIcon(NULL,IDI_APPLICATION);
{ WndClsEx.hCursor=
PAINTSTRUCT ps; LoadCursor(NULL,IDC_ARROW);
HDC hdc; WndClsEx.hbrBackground =
CreateSolidBrush(RGB(155, 155, 155));
int i; WndClsEx.lpszMenuName = NULL;
char vrijeme[30]; WndClsEx.lpszClassName = ClsName;
switch(Msg) WndClsEx.hInstance = hInstance;
{ WndClsEx.hIconSm = LoadIcon(NULL,
case WM_DESTROY: IDI_APPLICATION);
PostQuitMessage(WM_QUIT); RegisterClassEx(&WndClsEx);
break; hWnd =
case WM_TIMER: CreateWindow(ClsName,WndName,WS_OVERLAPPEDWI
tot++; NDOW, CW_USEDEFAULT, CW_USEDEFAULT,
sprintf(vrijeme,"Proslo je %d sekundi ",tot); 300, 300, NULL, NULL, hInstance, NULL);
SetWindowText(hStatic,vrijeme); hDugme =
break; CreateWindow("BUTTON","Kreni",WS_CHILD |
case WM_COMMAND: WS_VISIBLE,
if ((HWND)lParam==hDugme) { 0, 0, 50, 50,hWnd, NULL, hInstance, NULL);
tot=0; hStop =
timer=SetTimer(hWnd,0,1000,NULL); CreateWindow("BUTTON","Stop",WS_CHILD |
} WS_VISIBLE,
if ((HWND)lParam==hStop) { 60, 0, 50, 50,hWnd, NULL, hInstance, NULL);
KillTimer(hWnd,timer);
} hStatic =
CreateWindow("STATIC","Vrijeme",WS_CHILD |
break; WS_VISIBLE,
default: 0, 60, 200, 20,hWnd, NULL, hInstance, NULL);
return DefWindowProc(hWnd, Msg, wParam, tot=0;
lParam); UpdateWindow(hWnd);
} ShowWindow(hWnd, SW_SHOWNORMAL);
return 0;
} while( GetMessage(&Msg, NULL, 0, 0) )
{
INT WINAPI WinMain(HINSTANCE hInstance, TranslateMessage(&Msg);
HINSTANCE hPrevInstance, DispatchMessage(&Msg);
LPSTR lpCmdLine, int nCmdShow) }
{ return Msg.wParam;
MSG Msg; }
HWND hWnd;
II PARCIJALNI PISMENI ISPIT Varijanta Poena
IZ PREDMETA SISTEMSKO PROGRAMIRANJE
SARAJEVO, 15.1.2020 B
STUDENT:_________________________________________
Zadatak Nivo Max. poena Ostvareno poena

1 1 1
Koje su metode traženje sporog koda u programima?
Metoda uzaludnih pokušaja, optimizacija svega, Analitička metoda, upotreba profajlera
Zadatak Nivo Max. poena Ostvareno poena

2 1 1
Šta je paravirtualizacija?
To je realizacija virtualne mašine gdje se gostujući operativni sistem modifikuje kako bi se
izvršavao istovremeno sa domaćinskim
Zadatak Nivo Max. poena Ostvareno poena

3 2 1
Dopunite sljedeću tabelu API funkcija
Funkcija Kategorija Namjena
IsCharLower String funkcije
GetStdHandle
Vraća pseudo oznaku trenutnog procesa
Zadatak Nivo Max. poena Ostvareno poena

4 2 1
Zašto je u generisanom kodu u FILDZAN32 oduzimanje duže za jednu instrukciju od sabiranja?
_Oduzimanje je nekomutativna operacija, pa se mora prvi parametar staviti u EAX radi SUB
instrukcije
Zadatak Nivo Max. poena Ostvareno poena

5 3 2
Neka se funkcija GenFile(char * FileName,int length) poziva iz dinamičke biblioteke fileutil.dll. Napišite
program koji poziva ovu funkciju koristeći implicitno dinamičko linkovanje.

#include<windows.h>
#include <stdio.h>
__declspec(dllimport) GenFile(char * FileName,int length) ;
int main() {
GenFile("test.dat",100);
}
Zadatak Nivo Max. poena Ostvareno poena

6 3 1
Nacrtajte redoslijed sekcija izvršnog programa ako je linker pozvan sa ld a.o b.o c.o gdje su datoteke
organizovane kao na sljedećoj slici.
.text
.rdata .data .data .rdata

.drctve .datb .info$b .data

.text .text .text .datb

.info
.debug .drctve .drctve
.debug
a.o b.o c.o
Zadatak Nivo Max. poena Ostvareno poena

7 3 1
Neka je dat vrh 40 kolonskog tekstualnog ekrana

I s p i t i z s i s t e m s k o g p r o g r a m i r a n j a
D a n a s

Na kojim memorijskim lokacijama se nalaze slova “m”, ako je segmenti registar DS postavljen na 0B800h
14*2=28=1Ch i 26*2=52=34h
Zadatak Nivo Max. poena Ostvareno poena

8 3 3
Neka je u FILDZAN-32 kompajleru prevođena sljedeća linija koda
dok z=2 { q :=Message(“AAA”,20); }
Napišite prevedene naredbe asemblerskog koda. ASCII kod za slovo 'A' je 65.
L1: JMP L3 LEA EAX,[L5]
LEA EBX,[z] L2: MOV [ESP+0],EAX
MOV EAX,[EBX] LEA EBX,[q] MOV EAX,20
PUSH EAX MOV EAX,[EBX] MOV [ESP+4],EAX
MOV EAX,2 PUSH EBX L4 EQU 8
POP EBX SUB ESP,L4 CALL _Message@8
CMP EBX,EAX section .data POP EBX
SETE AL L5 DB 65 MOV [EBX],EAX
AND EAX,0FFh DB 65 ;}
CMP EAX,0 DB 65 JMP L1
JNE L2 DB 0 L3:
section .text

Zadatak Nivo Max. poena Ostvareno poena

9 3 2
Programer je stalno kompajlirao C dio programa koristeći
gcc -c glavni.c -o glavni.o
pa asemblerski dio programa koristeći
nasm -fwin32 pp.asm
a zatim ih linkovao koristeći
ld -o final.exe crt0.o glavni.o pp.o -lc
Projekt menadžer je tražio refaktorisanje programa i dodavanje pristupa bazama podataka,, tako da se datoteka
glavni.c razdvoji u front.c , backc i log.c, a četvrta C datoteka (zvana baza.c) se dobija koristeći SQL
predprocesor Pro*C koji se poziva sa
proc -name=baza.pc
Pošto je složenost sistema narasla, potrebno je napisati Makefile
all : final.exe pp.o : pp.asm
final.exe : front.o back.o log.o pp.o info.o nasm -fwin32 pp.asm
ld -o final.exe crt0.o front.o back.o log.o pp.o baza.o : baza.c
baza.o -lc gcc -c baza.c -o baza.o
front.o : front.c baza.c : baza.pc
gcc -c front.c -o front.o proc -name=baza.pc
back.o : back.c
gcc -c back.c -o back.o
log.o : log.c
gcc -c log.c -o log.o

Zadatak Nivo Max. poena Ostvareno poena

10 4 2
Uporedite memorijski mapirane i U/I mapirane periferijske uređaje, prednosti i nedostaci jednih i drugih
_________________________________________________________________________________
Memorijski mapirani uređaji omogućavaju sve adresne režime koji se koriste na procesoru da se
primijene na uređaju. U/I mapirani uređaji ne troše adresni prostor.
Zadatak Nivo Max. poena Ostvareno poena

11 5 2
Program vam je spor, a rok završetka kratak. Na raspolaganju su sljedeće opcije: prelazak sa C na asemblerski
jezik, promjena bubble sort u quick sort, prelazak sa C na asemblerski jezik i brojanje ciklusa, zamjena
množenja sa 2 sabiranjem. Koji je najbolji redoslijed da probate ove optimizacije i obrazložite odluku?

Prvo bolji algoritam, pa jednostavna zamjena instrukcija, pa promjena programskog jezika i na


kraju brojanje ciklusa. Odluka je bazirana na troškovima i efektima pojedine optimizacije

Zadatak Nivo Max. poena Ostvareno poena

12 6 3
Napisati Win32 API program u C koji iscrtava sljedeći prozor sa
jednim dugmetom i seditnim poljem. Klik na dugme Kreni pokreće
brojač od nule i ažurira se svake sekunde kroz sistem puruka. Klik na
dugme Stop zaustavlja brojač. Korisne informacije:
 Vrijeme upišite unutar EDIT polja, prozora klase “EDIT” stila
WS_CHILD i WS_VISIBLE.
 Poruka WM_TIMER se šalje svakih onoliko milisekundi
koliko je proslijeđeno kao treći parametar funkcije SetTimer.
Prvi parametar ove funkcije je handle na prozor kome se šalje
ova poruka, drugi i četvrti mogu biti 0 i NULL.. Kao rezultat
vraća identifikator timera koji je tipa UINT_PTR
 Timer se deaktivira funkcijom KillTimer, čiji je prvi parametar
oznaka prozora a drugi identifikator timera.
 Dugme šalje poruku WM_COMMAND, čiji wParam parametar sadrži handle od tog prozora.
 Dugme je prozor klase “BUTTON” stila WS_CHILD i WS_VISIBLE.
 Naslov prozora (što uključuje i tekst edit polja) se postavlja funkcijom SetWindowText(HWND hwnd,
char * text)

#include <windows.h> WNDCLASSEX WndClsEx;
#include <stdio.h> WndClsEx.cbSize = sizeof(WNDCLASSEX);
LPCTSTR ClsName = "BasicApp"; WndClsEx.style = CS_HREDRAW |
LPCTSTR WndName = "Vrijeme"; CS_VREDRAW;
int tot; WndClsEx.lpfnWndProc = WndProcedure;
HWND hEdit,hDugme,hStop; WndClsEx.cbClsExtra = 0;
UINT_PTR timer; WndClsEx.cbWndExtra = 0;
LRESULT CALLBACK WndProcedure(HWND hWnd, WndClsEx.hIcon =
UINT Msg, WPARAM wParam, LPARAM lParam) LoadIcon(NULL,IDI_APPLICATION);
{ WndClsEx.hCursor=
PAINTSTRUCT ps; LoadCursor(NULL,IDC_ARROW);
HDC hdc; WndClsEx.hbrBackground =
CreateSolidBrush(RGB(155, 155, 155));
int i; WndClsEx.lpszMenuName = NULL;
char vrijeme[30]; WndClsEx.lpszClassName = ClsName;
switch(Msg) WndClsEx.hInstance = hInstance;
{ WndClsEx.hIconSm = LoadIcon(NULL,
case WM_DESTROY: IDI_APPLICATION);
PostQuitMessage(WM_QUIT); RegisterClassEx(&WndClsEx);
break; hWnd =
case WM_TIMER: CreateWindow(ClsName,WndName,WS_OVERLAPPEDWI
tot++; NDOW, CW_USEDEFAULT, CW_USEDEFAULT,
sprintf(vrijeme,"Proslo je %d sekundi ",tot); 300, 300, NULL, NULL, hInstance, NULL);
SetWindowText(hEdit,vrijeme); hDugme =
break; CreateWindow("BUTTON","Kreni",WS_CHILD |
case WM_COMMAND: WS_VISIBLE,
if ((HWND)lParam==hDugme) { 0, 0, 50, 50,hWnd, NULL, hInstance, NULL);
tot=0; hStop =
timer=SetTimer(hWnd,0,1000,NULL); CreateWindow("BUTTON","Stop",WS_CHILD |
} WS_VISIBLE,
if ((HWND)lParam==hStop) { 60, 0, 50, 50,hWnd, NULL, hInstance, NULL);
KillTimer(hWnd,timer);
} hEdit =
CreateWindow("EDIT","Vrijeme",WS_CHILD |
break; WS_VISIBLE,
default: 0, 60, 200, 20,hWnd, NULL, hInstance, NULL);
return DefWindowProc(hWnd, Msg, wParam, tot=0;
lParam); UpdateWindow(hWnd);
} ShowWindow(hWnd, SW_SHOWNORMAL);
return 0;
} while( GetMessage(&Msg, NULL, 0, 0) )
{
INT WINAPI WinMain(HINSTANCE hInstance, TranslateMessage(&Msg);
HINSTANCE hPrevInstance, DispatchMessage(&Msg);
LPSTR lpCmdLine, int nCmdShow) }
{ return Msg.wParam;
MSG Msg; }
HWND hWnd;

You might also like