Системски софтвер/Септембар 2022

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Испит из септембарског рока 2022. одржан је 14.09.

1. задатак

Исти задатак се нашао на јунском року 2022. године

Поставка

Посматра се процес асемблирања датог ивзорног асемблерског кода за amd64 архитектуру. Резултат асемблирања је предметни програм по ELF формату. Приказати садржај (1) табеле симбола и (2) релокационих записа строго поштујући школски формат и обавезно у складу са задатом нумерацијом симбола.

.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

Напомена: хексадецимални бројеви наведени у коментару изворног асемблерског кода представљају померај до почетка инструкције у том реду гледано од почетка секције којој инструкција припада. Такође, усвојити претпоставку да је величина операционог кода:

  • 2B за инструкцију call за PC релативно адресирање,
  • 4B за инструкцију mov за апсолутно адресирање и
  • 1B за инструкције jle и jmp за PC релативно адресирање.

Решење

Видети овде.

2. задатак

Поставка

Посматра се макро процесор са угњежденим макро дефиницијама, без угњеждених макро експанзија.

  1. Шта је резултат макро експанзије задатог текста?
  2. Приказати операције над стеком параматера према редоследу њиховог извођења користећи нотације PUSH(...) и POP(...) при чему уместо три тачкице треба навести листу вредности које се смештају или скидају са стека.
  3. Приказати операције над стеком аргумената према редоследу њиховог извођења користећи нотације PUSH(...) и POP(...) при чему уместо три тачкице треба навести листу вредности које се смештају или скидају са стека.
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

Решење

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. задатак

Поставка

Посматрају се два објектна програма levi.o и desni.o добијена помоћу GNU асемблера.

#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

Приказати излаз линкера izlaz.o тако да буде испоштовано све што је наведено у наставку:

  • строго поштујући школски формат и обавезно са нумерацијом у табели симбола према следећем редоследу: UND, .text, .data, .bss, b, c, d, a
  • повезивање се иницира следећом командом ld --relocatable -o izlaz.o -T script.ld levi.o desni.o
  • линкерска скрипта script.ld има следећи садржај:
SECTIONS
{
   .text : { *(.text) }
   .data : { *(.data) }
   .bss : { *.(bss) }
}

Решење

#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. задатак

Исти задатак се нашао на јунском року 2022. године

Поставка

Посматра се JIT емулатор и емулирање следећег програма.

  1. Означити све блокове који ће у току рада емулатора бити преведени. За сваки преведени блок навести јединствену идентификацију у облику B<n>(<x>-<y>) (<n> је редни број блока у погледу тренутка његовог превођења при чему нумерација почиње од броја један, <x> је редни број прве а <y> редни број последње линије изворног кода блока).
  2. Навести секвенцу извршавања. У секвенци извршавања могу се нађи само GP (сваки пут када се емулатор врати у главну петљу), BH (сваки пут када се позове функција која помаже у разрешавању скокова) и B<n> (сваки пут када се изврши дати блок у складу са ознакама из претходне тачке).
      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

Решење

Видети овде.