Системски софтвер/Фебруар 2023 — разлика између измена
Пређи на навигацију
Пређи на претрагу
(Prepisan februarski rok od juče) |
(→Решење) |
||
| Ред 40: | Ред 40: | ||
=== Решење === | === Решење === | ||
<div class="abc-list"> | |||
# <syntaxhighlight lang="asm"> | |||
lahf | |||
mov savedCPZ, ah | |||
mov savedA, al | |||
mov savedX, cl | |||
lea rdi, hypoMEM+n | |||
call branchHelper | |||
</syntaxhighlight> | |||
# <syntaxhighlight lang="asm"> | |||
mov al, savedA | |||
mov cl, savedX | |||
mov ah, savedCPZ | |||
sahf | |||
</syntaxhighlight> | |||
# Потребно је изменити код под а) избацивањем последње две линије и додавање инструкције jmp, која скаче на одредишни блок. <syntaxhighlight lang="asm"> | |||
lahf | |||
mov savedCPZ, ah | |||
mov savedA, al | |||
mov savedX, cl | |||
jmp blkX | |||
# lea rdi, hypoMEM+n | |||
# call branchHelper | |||
</syntaxhighlight> | |||
# Не можемо да знамо шта ће се све дешавати између преласка са једног на други блок, самим тим нема гаранције да ће вредности регистара остати непромењене. Због тога, није могуће у општем случају отклонити рестаурацију. | |||
</div> | |||
[[Категорија:Рокови]] | [[Категорија:Рокови]] | ||
[[Категорија:Системски софтвер]] | [[Категорија:Системски софтвер]] | ||
Верзија на датум 18. август 2025. у 14:43
Испит у фебруарском року 2023. године одржан је 10. фебруара и трајао је два сата.
1. задатак
Поставка
Одредити вредност при обради од стране асемблера за хипотетичку машину (уколико вредност није позната написати знак питања) и индекс класификације за сваки израз у оквиру изворног асемблерског кода датог у наставку.
BEG
USE LAB1
ORG 0x60
SCT DAT
LAB2 DC LAB1
DC 7 + LAB2
SCT TXT
LAB3 LDA LAB2 - 1
ADX * - LAB3
END
Решење
Јако сличан задатак појавио се на другом колоквијуму 2022. године, где је решен.
2. задатак
- Исти задатак као из јунског рока 2022. године.
3. задатак
- Исти задатак као из августовског рока 2022. године.
4. задатак
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Поставка
Посматра се емулатор за HYPO машину заснован на динамичкој рекомпилацији. Емулатор је предвиђен за извршавање на amd64 архитектури.
- Приказати код којим је неопходно завршити сваки преведени блок без икаквих оптимизација по питању чувања вредности регистара, у случају када из блока има само један излаз (на крају блока се не налази инструкција условног скока).
- Приказати код који је на почетку сваког преведеног блока потребно уметнути како би се блок коректно извршио без обзира што се између претходног и посматраног блока извршавао и код емулатора.
- Приказати измене које у претходно приказаним сегментима кода настану уколико емулатор по сазнању да је одредишни блок преведен максимално оптимизује код по питању уштеде времена на инструкције за чување и рестаурацију вредности регистара, као и на код за повратак у емулатор (који више није потребан).
- Да ли је приликом превођења кода могуће у потпуности одстранити код за чување и рестаурацију вредности регистара у општем случају? Ако да, како? Ако не, зашто?
Решење
lahf mov savedCPZ, ah mov savedA, al mov savedX, cl lea rdi, hypoMEM+n call branchHelper
mov al, savedA mov cl, savedX mov ah, savedCPZ sahf
- Потребно је изменити код под а) избацивањем последње две линије и додавање инструкције jmp, која скаче на одредишни блок.
lahf mov savedCPZ, ah mov savedA, al mov savedX, cl jmp blkX # lea rdi, hypoMEM+n # call branchHelper
- Не можемо да знамо шта ће се све дешавати између преласка са једног на други блок, самим тим нема гаранције да ће вредности регистара остати непромењене. Због тога, није могуће у општем случају отклонити рестаурацију.