Professional Documents
Culture Documents
II PARCIJALNI PISMENI ISPIT-15-01-2020-odgovori
II PARCIJALNI PISMENI ISPIT-15-01-2020-odgovori
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.
.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.
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.
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
.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
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
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?
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;