Системски софтвер/К2 2022 — разлика између измена
Пређи на навигацију
Пређи на претрагу
(→2. задатак: rešenje?) |
м (Rešenja kolokvijuma) |
||
| Ред 3: | Ред 3: | ||
== 1. задатак == | == 1. задатак == | ||
=== Поставка === | |||
Дати код на асемблеру за ''amd64'' преводи се двопролазним асемблером. Резултат превођења је предмети програм по ''ELF'' формату. Приказати садржај: | Дати код на асемблеру за ''amd64'' преводи се двопролазним асемблером. Резултат превођења је предмети програм по ''ELF'' формату. Приказати садржај: | ||
# табеле симбола | # табеле симбола | ||
| Ред 21: | Ред 22: | ||
* Инструкција <code>call</code> користи ''PC'' релативно адресирање. Величина инструкције је шест бајтова (<code>0xff 0x15</code>). | * Инструкција <code>call</code> користи ''PC'' релативно адресирање. Величина инструкције је шест бајтова (<code>0xff 0x15</code>). | ||
* Инструкција <code>mov</code> користи апсолутно адресирање. Величина инструкције је осам бајтова (<code>0x48 0x8b 0x04 0x25</code>). | * Инструкција <code>mov</code> користи апсолутно адресирање. Величина инструкције је осам бајтова (<code>0x48 0x8b 0x04 0x25</code>). | ||
* Инструкција <code>jz</code> користи ''PC'' релативно адресирање. Величина инструкције је два | * Инструкција <code>jz</code> користи ''PC'' релативно адресирање. Величина инструкције је два бајта (<code>0x74</code>) или шест бајтова (<code>0x0f 0x84</code>) зависно од величине помераја. | ||
<syntaxhighlight lang="asm"> | <syntaxhighlight lang="asm"> | ||
.intel_syntax noprefix | .intel_syntax noprefix | ||
| Ред 42: | Ред 43: | ||
.end | .end | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Решење === | |||
{| class="wikitable" | |||
|+ <code>.symtab</code> | |||
|- | |||
! Num !! Value [hex] !! Size !! Type !! Bind !! Ndx !! Name | |||
|- | |||
| 0 || 0 || 0 || NOTYP || LOC || UND || | |||
|- | |||
| 1 || 0 || 0 || SCTN || LOC || 1 || .text | |||
|- | |||
| 2 || 0 || 0 || SCTN || LOC || 2 || .data | |||
|- | |||
| 3 || 4 || 0 || NOTYP || GLOB || *ABS* || f | |||
|- | |||
| 4 || 0 || 0 || NOTYP || GLOB || UND || a | |||
|- | |||
| 5 || A || 0 || NOTYP || LOC || 2 || b | |||
|- | |||
| 6 || 6 || 0 || NOTYP || LOC || 2 || c | |||
|- | |||
| 7 || 10 || 0 || NOTYP || LOC || 1 || d | |||
|- | |||
| 8 || 6 || 0 || NOTYP || LOC || 1 || e | |||
|} | |||
{| class="wikitable" | |||
|+ <code>.rela.text</code> | |||
! Offset !! Type !! Symbol !! Addend | |||
|- | |||
| 2 || PC32 || a || -4 | |||
|- | |||
| A || 32 || .data || 6 | |||
|- | |||
| 12 || PC32 || .data || 2 | |||
|- | |||
| 1A || 32 || .data || 6 | |||
|- | |||
| 1E || 32 || .text || 6 | |||
|} | |||
{| class="wikitable" | |||
|+ <code>.rela.data</code> | |||
! Offset !! Type !! Symbol !! Addend | |||
|- | |||
| 6 || 32 || .data || 18 | |||
|} | |||
{| class="wikitable" | |||
|+ <code>.text</code> | |||
! Offset | |||
! colspan="8" | Content | |||
! Instruction | |||
|- | |||
| 0000 || FF || 15 || 00 || 00 || 00 || 00 || || || <syntaxhighlight lang="asm" inline>call a[rip]</syntaxhighlight> | |||
|- | |||
| 0006 || 48 || 8B || 04 || 25 || 00 || 00 || 00 || 00 || <syntaxhighlight lang="asm" inline>mov rax, c</syntaxhighlight> | |||
|- | |||
| 000D || 74 || F6 || || || || || || || <syntaxhighlight lang="asm" inline>jz e</syntaxhighlight> | |||
|- | |||
| 0010 || 0F || 84 || 00 || 00 || 00 || 00 || || || <syntaxhighlight lang="asm" inline>jz c</syntaxhighlight> | |||
|- | |||
| 0016 || 48 || 8B || 04 || 25 || 00 || 00 || 00 || 00 || <syntaxhighlight lang="asm" inline>mov rax, b - f</syntaxhighlight> | |||
|- | |||
| 001D || 00 || 00 || 00 || 00 || || || || || <syntaxhighlight lang="asm" inline>.long e</syntaxhighlight> | |||
|} | |||
{| class="wikitable" | |||
|+ <code>.data</code> | |||
! Offset | |||
! colspan="8" | Content | |||
! Instruction | |||
|- | |||
| 0000 || 00 || 00 || 00 || 00 || 00 || 00 || || || <syntaxhighlight lang="asm" inline>.skip 6</syntaxhighlight> | |||
|- | |||
| 0006 || 00 || 00 || 00 || 00 || || || || || <syntaxhighlight lang="asm" inline>.long b + 0xe</syntaxhighlight> | |||
|} | |||
== 2. задатак == | == 2. задатак == | ||
| Ред 63: | Ред 137: | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
! Наредба | ! Наредба | ||
! Индекс класификације | ! Индекс класификације | ||
! Вредност | ! Вредност | ||
|- | |- | ||
| <code>DC LAB1</code> | | <code>DC LAB1</code> | ||
| Ред 72: | Ред 146: | ||
|- | |- | ||
| <code>DC 7 + LAB2</code> | | <code>DC 7 + LAB2</code> | ||
| 0 + 1.DAT | | 0 + 1.DAT = 1.DAT | ||
| | | 0x6b | ||
|- | |- | ||
| <code>LDA LAB2 - 1</code> | | <code>LDA LAB2 - 1</code> | ||
| 1.DAT | | 1.DAT - 0 = 1.DAT | ||
| | | 0x63 | ||
|- | |- | ||
| <code>ADX * - LAB3</code> | | <code>ADX * - LAB3</code> | ||
| 1.TXT | | 1.TXT - 1.TXT = 0 | ||
| | | 0x2 | ||
|} | |} | ||
[[Категорија:Системски софтвер]] | [[Категорија:Системски софтвер]] | ||
[[Категорија:Рокови]] | [[Категорија:Рокови]] | ||
Верзија на датум 15. јун 2022. у 10:49
Други колоквијум 2022. одржан је 14. маја. Колоквијум је трајао 90 минута и радио се у вежбанкама. Оба задатка су вредела 10 поена.
1. задатак
Поставка
Дати код на асемблеру за amd64 преводи се двопролазним асемблером. Резултат превођења је предмети програм по ELF формату. Приказати садржај:
- табеле симбола
- релокационих записа као и
- садржај секција.
Користити школски формат наведен у наставку:
| Num | Value | Size | Type | Bind | Ndx | Name |
|---|
| Offset | Type | Symbol | Addend |
|---|
При решавању усвојити следеће (хексадецималне вредности унутар заграда након податка о величини инструкције јесу први бајтови инструкције који представљају њен операциони код):
- Инструкција
callкористи PC релативно адресирање. Величина инструкције је шест бајтова (0xff 0x15). - Инструкција
movкористи апсолутно адресирање. Величина инструкције је осам бајтова (0x48 0x8b 0x04 0x25). - Инструкција
jzкористи PC релативно адресирање. Величина инструкције је два бајта (0x74) или шест бајтова (0x0f 0x84) зависно од величине помераја.
.intel_syntax noprefix
.extern a
.global f
.equ f, b-c
.text
call a[rip]
e: mov rax, c
jz e
jz c
d: mov rax, b - f
.long e
.data
.skip 6
c: .long b + 0xe
b:
.end
Решење
| Num | Value [hex] | Size | Type | Bind | Ndx | Name |
|---|---|---|---|---|---|---|
| 0 | 0 | 0 | NOTYP | LOC | UND | |
| 1 | 0 | 0 | SCTN | LOC | 1 | .text |
| 2 | 0 | 0 | SCTN | LOC | 2 | .data |
| 3 | 4 | 0 | NOTYP | GLOB | *ABS* | f |
| 4 | 0 | 0 | NOTYP | GLOB | UND | a |
| 5 | A | 0 | NOTYP | LOC | 2 | b |
| 6 | 6 | 0 | NOTYP | LOC | 2 | c |
| 7 | 10 | 0 | NOTYP | LOC | 1 | d |
| 8 | 6 | 0 | NOTYP | LOC | 1 | e |
| Offset | Type | Symbol | Addend |
|---|---|---|---|
| 2 | PC32 | a | -4 |
| A | 32 | .data | 6 |
| 12 | PC32 | .data | 2 |
| 1A | 32 | .data | 6 |
| 1E | 32 | .text | 6 |
| Offset | Type | Symbol | Addend |
|---|---|---|---|
| 6 | 32 | .data | 18 |
| Offset | Content | Instruction | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | FF | 15 | 00 | 00 | 00 | 00 | call a[rip]
| ||
| 0006 | 48 | 8B | 04 | 25 | 00 | 00 | 00 | 00 | mov rax, c
|
| 000D | 74 | F6 | jz e
| ||||||
| 0010 | 0F | 84 | 00 | 00 | 00 | 00 | jz c
| ||
| 0016 | 48 | 8B | 04 | 25 | 00 | 00 | 00 | 00 | mov rax, b - f
|
| 001D | 00 | 00 | 00 | 00 | .long e
| ||||
| Offset | Content | Instruction | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 0000 | 00 | 00 | 00 | 00 | 00 | 00 | .skip 6
| ||
| 0006 | 00 | 00 | 00 | 00 | .long b + 0xe
| ||||
2. задатак
Поставка
Одредити вредност при обради од стране асемблера за хипотетичку машину (уколико вредност није позната написати знак питања) и индекс класификације за сваки израз у оквиру изворног асемблерског кода датог у наставку.
BEG
USE LAB1
ORG 0x64
SCT DAT
LAB2 DC LAB1
DC 7 + LAB2
SCT TXT
LAB3 LDA LAB2 - 1
ADX * - LAB3
OTI
HLT
END
Решење
| Наредба | Индекс класификације | Вредност |
|---|---|---|
DC LAB1
|
1.unique() | ? |
DC 7 + LAB2
|
0 + 1.DAT = 1.DAT | 0x6b |
LDA LAB2 - 1
|
1.DAT - 0 = 1.DAT | 0x63 |
ADX * - LAB3
|
1.TXT - 1.TXT = 0 | 0x2 |