Sistemski softver/Septembar 2022
Ispit iz septembarskog roka 2022. održan je 14.09.
1. zadatak
- Isti zadatak se našao na junskom roku 2022. godine
Postavka
Posmatra se proces asembliranja datog ivzornog asemblerskog koda za amd64 arhitekturu. Rezultat asembliranja je predmetni program po ELF formatu. Prikazati sadržaj (1) tabele simbola i (2) relokacionih zapisa strogo poštujući školski format i obavezno u skladu sa zadatom numeracijom simbola.
.intel_syntax noprefix
.section .text
.global min, la1
min: enter 0, 0 # 0x00
mov rbx, la1 # 0x04
cmp rbx, [rbp]+0x12 # 0x0c
call var[rip] # 0x10
jle la1 # 0x16
mov rax, [rbp]+0x12 # 0x18
jmp la2 # 0x1c
la1: mov rax, rbx # 0x1e
la2: leave # 0x21
ret # 0x22
.data
.global var
.type var, @object
var:
.quad la1, la2-4
.end
Napomena: heksadecimalni brojevi navedeni u komentaru izvornog asemblerskog koda predstavljaju pomeraj do početka instrukcije u tom redu gledano od početka sekcije kojoj instrukcija pripada. Takođe, usvojiti pretpostavku da je veličina operacionog koda:
- 2B za instrukciju
callza PC relativno adresiranje, - 4B za instrukciju
movza apsolutno adresiranje i - 1B za instrukcije
jleijmpza PC relativno adresiranje.
Rešenje
Videti ovde.
2. zadatak
Postavka
Posmatra se makro procesor sa ugnježdenim makro definicijama, bez ugnježdenih makro ekspanzija.
- Šta je rezultat makro ekspanzije zadatog teksta?
- Prikazati operacije nad stekom paramatera prema redosledu njihovog izvođenja koristeći notacije PUSH(...) i POP(...) pri čemu umesto tri tačkice treba navesti listu vrednosti koje se smeštaju ili skidaju sa steka.
- Prikazati operacije nad stekom argumenata prema redosledu njihovog izvođenja koristeći notacije PUSH(...) i POP(...) pri čemu umesto tri tačkice treba navesti listu vrednosti koje se smeštaju ili skidaju sa steka.
MCDEFN M1 A, B, C D M2 A, B, C MCDEFN M2 C, D, F A, B, C, D, E MCEND M2 C, D, F MCEND M2 1, 2, 3 M1 4, 5, 6, 7 M1 4, 5, 6, 7 M2 1, 2, 3
Rešenje
a)
M2 1, 2, 3 M2 4, 5, 6 M2 6, 7, F M2 4, 5, 6 M2 6, 7, F 4, 5, 1, 2, E
b)
PUSH(((1,0),A), ((1,1),B), ((1,2),C), ((1,3),D)) PUSH(((2,0),C), ((2,1),D), ((2,2),F)) POP(((2,0),C), ((2,1),D), ((2,2),F)) POP(((1,0),A), ((1,1),B), ((1,2),C), ((1,3),D))
c)
PUSH((0,4), (1,5), (2,6), (3,7)) POP((0,4), (1,5), (2,6), (3,7)) PUSH((0,4), (1,5), (2,6), (3,7)) POP((0,4), (1,5), (2,6), (3,7)) PUSH((0,1), (1,2), (2,3)) POP((0,1), (1,2), (2,3))
3. zadatak
Postavka
Posmatraju se dva objektna programa levi.o i desni.o dobijena pomoću GNU asemblera.
#shdr Num Address Size Type Flags Name 1: 0000000 0052 PROGBITS AX .text 3: 0000000 0000 PROGBITS WA .data 4: 0000000 0012 NOBITS WA .bss #.symtab Num Value Size Type Bind Ndx Name 0: 0000000 0000 NOTYP LOC UND 1: 0000000 0000 SCTN LOC 1 .text 2: 0000000 0000 SCTN LOC 3 .data 3: 0000000 0000 SCTN LOC 4 .bss 4: 0000013 0000 FUNC GLOB 1 a 5: 0000010 0000 NOTYP GLOB 4 d 6: 0000000 0000 NOTYP GLOB UND c #.rela.text Offset Type Symbol Addend 0000004 R_X86_64_32S 4 (a) 0 000000b R_X86_64_PC32 6 (c) -4 |
#shdr Num Address Size Type Flags Name 1: 0000000 000a PROGBITS AX .text 3: 0000000 0008 PROGBITS WA .data 5: 0000000 0016 NOBITS WA .bss #.symtab Num Value Size Type Bind Ndx Name 0: 0000000 0000 NOTYP LOC UND 1: 0000000 0000 SCTN LOC 1 .text 2: 0000000 0000 SCTN LOC 3 .data 3: 0000000 0000 SCTN LOC 5 .bss 4: 0000004 0000 NOTYP LOC 3 b 5: 0000008 0000 OBJCT GLOB 5 c 6: 0000000 0000 NOTYP GLOB UND a #.rela.text Offset Type Symbol Addend 0000003 R_X86_64_PC32 6 (a) -4 #.rela.data Offset Type Symbol Addend 0000002 R_X86_64_32 3 (.bss) 0 |
Prikazati izlaz linkera izlaz.o tako da bude ispoštovano sve što je navedeno u nastavku:
- strogo poštujući školski format i obavezno sa numeracijom u tabeli simbola prema sledećem redosledu:
UND, .text, .data, .bss, b, c, d, a - povezivanje se inicira sledećom komandom
ld --relocatable -o izlaz.o -T script.ld levi.o desni.o - linkerska skripta
script.ldima sledeći sadržaj:
SECTIONS
{
.text : { *(.text) }
.data : { *(.data) }
.bss : { *.(bss) }
}
Rešenje
#shdr Num Address Size Type Flags Name 1: 0000000 005c PROGBITS AX .text 3: 0000000 0008 PROGBITS WA .data 4: 0000000 0028 NOBITS WA .bss #.symtab Num Value Size Type Bind Ndx Name 0: 0000000 0000 NOTYP LOC UND 1: 0000000 0000 SCTN LOC 1 .text 2: 0000000 0000 SCTN LOC 3 .data 3: 0000000 0000 SCTN LOC 4 .bss 4: 0000004 0000 NOTYP LOC 3 b 5: 000001a 0000 OBJCT GLOB 5 c 6: 0000000 0000 NOTYP GLOB 4 d 7: 0000000 0000 FUNC GLOB 1 a #.rela.text Offset Type Symbol Addend 0000004 R_X86_64_32S 7 (a) 0 000000b R_X86_64_PC32 5 (c) -4 0000055 R_X86_64_PC32 7 (a) -4 #.rela.data Offset Type Symbol Addend 0000002 R_X86_64_32 3 (.bss) 0
4. zadatak
- Isti zadatak se našao na junskom roku 2022. godine
Postavka
Posmatra se JIT emulator i emuliranje sledećeg programa.
- Označiti sve blokove koji će u toku rada emulatora biti prevedeni. Za svaki prevedeni blok navesti jedinstvenu identifikaciju u obliku
B<n>(<x>-<y>)(<n>je redni broj bloka u pogledu trenutka njegovog prevođenja pri čemu numeracija počinje od broja jedan, <x> je redni broj prve a <y> redni broj poslednje linije izvornog koda bloka). - Navesti sekvencu izvršavanja. U sekvenci izvršavanja mogu se nađi samo
GP(svaki put kada se emulator vrati u glavnu petlju),BH(svaki put kada se pozove funkcija koja pomaže u razrešavanju skokova) iB<n>(svaki put kada se izvrši dati blok u skladu sa oznakama iz prethodne tačke).
BEG ; line 1
LDI 2 ; line 2 ( PZ) A <= <V>
L1 SUB B ; line 3 (CPZ) A <= A - mem[<V>]
L2 ADD C ; line 4 (CPZ) A <= A + mem[<V>]
BNG L2 ; line 5 if (!flags[P]) PC <= <V>
BZE L3 ; line 6 if ( flags[Z]) PC <= <V>
SBI 2 ; line 7 (CPZ) A <= A - <V>
BNZ L1 ; line 8 if (!flags[Z]) PC <= <V>
L3 HLT ; line 9 stop execution
B DC 9 ; line 10
C DC 2 ; line 11
END ; line 12
Rešenje
Videti ovde.