Sistemski softver/Septembar 2022

Izvor: SI Wiki
Pređi na navigaciju Pređi na pretragu

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 call za PC relativno adresiranje,
  • 4B za instrukciju mov za apsolutno adresiranje i
  • 1B za instrukcije jle i jmp za PC relativno adresiranje.

Rešenje

Videti ovde.

2. zadatak

Postavka

Posmatra se makro procesor sa ugnježdenim makro definicijama, bez ugnježdenih makro ekspanzija.

  1. Šta je rezultat makro ekspanzije zadatog teksta?
  2. 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.
  3. 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.ld ima 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   4  c
  6: 0000010 0000  NOTYP GLOB   4  d
  7: 0000013 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)         12

4. zadatak

Isti zadatak se našao na junskom roku 2022. godine

Postavka

Posmatra se JIT emulator i emuliranje sledećeg programa.

  1. 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).
  2. 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) i B<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.