Online Compiler Nasm

; Реши задачу: ;Задача 1-Fill: Заполнение пропусков ;После независимого выполнения приведенных ниже фрагментов кода на языке ассемблера, значения регистра eax были сохранены и записаны. Восстановите объявления переменных в шестнадцатеричной записи, оставляя ? на месте тех шестнадцатеричных цифр, однозначно восстановить которые невозможно. ;x dw 0x????, 0x???? ;movsx eax, word [x+1] ;shr eax, 2 ;shl eax, 2 ;; EAX = 0x3cf0 ;y dd 0x???????? ;mov eax, dword [y] ;rol eax, 48 ;xor ah, 0xfe ;; EAX = 0x85ea99bc ;z db 0x??, 0x??, 0x??, 0x?? ;mov eax, dword [z] ;lea eax, [2*eax] ;add eax, eax ;; EAX = 0xf20e6c48 ;Выводите искомые шестнадцатеричные числа со всеми ведущими нулями без префикса 0x, разделяя их произвольным количеством пробельных символов.
Этот код содержит три независимых фрагмента, каждый из которых восстанавливает начальные значения переменных по известному результату в eax. В каждом фрагменте выполняются операции, которые частично или полностью обратимы, но некоторые биты могут быть потеряны.

- В первом фрагменте movsx расширяет знак из 16-битного слова, затем сдвиги shr и shl обнуляют два младших бита. Значит, исходное слово должно быть таким, чтобы после расширения знака и обнуления двух младших битов получилось 0x3cf0. Обратите внимание, что movsx читает слово по адресу x+1, то есть из второго байта массива x, а не из первого.

- Во втором фрагменте rol eax, 48 — это циклический сдвиг 32-битного значения на 48 бит, что эквивалентно сдвигу на 16 бит (48 mod 32 = 16). Затем xor ah, 0xfe меняет старший байт младшей половины. Восстановите исходное значение y, выполнив обратные операции в обратном порядке.

- В третьем фрагменте lea eax, [2*eax] умножает eax на 2, затем add eax, eax удваивает результат, то есть итоговое умножение на 4. Исходное значение z должно быть в 4 раза меньше результата, но учтите, что умножение может привести к потере младших битов, если они не кратны 4.