Системски софтвер/Фебруар 2023

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

Испит у фебруарском року 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. задатак

Поставка

Посматра се емулатор за HYPO машину заснован на динамичкој рекомпилацији. Емулатор је предвиђен за извршавање на amd64 архитектури.

  1. Приказати код којим је неопходно завршити сваки преведени блок без икаквих оптимизација по питању чувања вредности регистара, у случају када из блока има само један излаз (на крају блока се не налази инструкција условног скока).
  2. Приказати код који је на почетку сваког преведеног блока потребно уметнути како би се блок коректно извршио без обзира што се између претходног и посматраног блока извршавао и код емулатора.
  3. Приказати измене које у претходно приказаним сегментима кода настану уколико емулатор по сазнању да је одредишни блок преведен максимално оптимизује код по питању уштеде времена на инструкције за чување и рестаурацију вредности регистара, као и на код за повратак у емулатор (који више није потребан).
  4. Да ли је приликом превођења кода могуће у потпуности одстранити код за чување и рестаурацију вредности регистара у општем случају? Ако да, како? Ако не, зашто?

Решење

  1. lahf
    mov savedCPZ, ah
    mov savedA, al
    mov savedX, cl
    lea rdi, hypoMEM+n
    call branchHelper
    
  2. mov al, savedA
    mov cl, savedX
    mov ah, savedCPZ
    sahf
    
  3. Потребно је изменити код под а) избацивањем последње две линије и додавање инструкције jmp, која скаче на одредишни блок.
    lahf
    mov savedCPZ, ah
    mov savedA, al
    mov savedX, cl
    jmp blkX
    # lea rdi, hypoMEM+n
    # call branchHelper
    
  4. Не можемо да знамо шта ће се све дешавати између преласка са једног на други блок, самим тим нема гаранције да ће вредности регистара остати непромењене. Због тога, није могуће у општем случају отклонити рестаурацију.