Системски софтвер/К2 2022 — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
 
(Нису приказане 2 међуизмене другог корисника)
Ред 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>0x74</code>) или шест бајтова (<code>0x0f 0x84</code>) зависно од величине помераја.
* Инструкција <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  || 16          || 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>
|-
| 000E || 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"  
|-
|-
! Наредба<br />
! Наредба
! Индекс класификације
! Индекс класификације
! Вредност<br />
! Вредност
|-
|-
| <code>DC LAB1</code>
| <code>DC LAB1</code>
Ред 72: Ред 146:
|-
|-
| <code>DC 7 + LAB2</code>
| <code>DC 7 + LAB2</code>
| 0 + 1.DAT() = 1.DAT()
| 0 + 1.DAT = 1.DAT
| 0x6e
| 0x6b
|-
|-
| <code>LDA LAB2 - 1</code>
| <code>LDA LAB2 - 1</code>
| 1.DAT() - 0 = 1.DAT()
| 1.DAT - 0 = 1.DAT
| 0x66
| 0x63
|-
|-
| <code>ADX * - LAB3</code>
| <code>ADX * - LAB3</code>
| 1.TXT() - 1.TXT() = 0
| 1.TXT - 1.TXT = 0
| 0x65
| 0x2
|}
|}


[[Категорија:Системски софтвер]]
[[Категорија:Системски софтвер]]
[[Категорија:Рокови]]
[[Категорија:Рокови]]

Тренутна верзија на датум 27. август 2024. у 18:58

Други колоквијум 2022. одржан је 14. маја. Колоквијум је трајао 90 минута и радио се у вежбанкама. Оба задатка су вредела 10 поена.

1. задатак

Поставка

Дати код на асемблеру за amd64 преводи се двопролазним асемблером. Резултат превођења је предмети програм по ELF формату. Приказати садржај:

  1. табеле симбола
  2. релокационих записа као и
  3. садржај секција.

Користити школски формат наведен у наставку:

ТАБЕЛА СИМБОЛА
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

Решење

.symtab
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 16 0 NOTYP LOC 1 d
8 6 0 NOTYP LOC 1 e
.rela.text
Offset Type Symbol Addend
2 PC32 a -4
A 32 .data 6
12 PC32 .data 2
1A 32 .data 6
1E 32 .text 6
.rela.data
Offset Type Symbol Addend
6 32 .data 18
.text
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
000E 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
.data
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