Системски софтвер/Септембар 2022 — разлика између измена
м (Pogresan addend) |
(→Решење) |
||
Ред 151: | Ред 151: | ||
3: 0000000 0000 SCTN LOC 4 .bss | 3: 0000000 0000 SCTN LOC 4 .bss | ||
4: 0000004 0000 NOTYP LOC 3 b | 4: 0000004 0000 NOTYP LOC 3 b | ||
5: 000001a 0000 OBJCT GLOB | 5: 000001a 0000 OBJCT GLOB 4 c | ||
6: | 6: 0000010 0000 NOTYP GLOB 4 d | ||
7: | 7: 0000013 0000 FUNC GLOB 1 a | ||
#.rela.text | #.rela.text | ||
Offset Type Symbol Addend | Offset Type Symbol Addend | ||
Ред 161: | Ред 161: | ||
#.rela.data | #.rela.data | ||
Offset Type Symbol Addend | Offset Type Symbol Addend | ||
0000002 R_X86_64_32 3 (.bss) | 0000002 R_X86_64_32 3 (.bss) 12 | ||
== 4. задатак == | == 4. задатак == |
Тренутна верзија на датум 17. август 2024. у 18:56
Испит из септембарског рока 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. задатак
Поставка
Посматра се макро процесор са угњежденим макро дефиницијама, без угњеждених макро експанзија.
- Шта је резултат макро експанзије задатог текста?
- Приказати операције над стеком параматера према редоследу њиховог извођења користећи нотације PUSH(...) и POP(...) при чему уместо три тачкице треба навести листу вредности које се смештају или скидају са стека.
- Приказати операције над стеком аргумената према редоследу њиховог извођења користећи нотације 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 емулатор и емулирање следећег програма.
- Означити све блокове који ће у току рада емулатора бити преведени. За сваки преведени блок навести јединствену идентификацију у облику
B<n>(<x>-<y>)
(<n>
је редни број блока у погледу тренутка његовог превођења при чему нумерација почиње од броја један, <x> је редни број прве а <y> редни број последње линије изворног кода блока). - Навести секвенцу извршавања. У секвенци извршавања могу се нађи само
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
Решење
Видети овде.