1 (изменено: Alikberov, 2022-07-19 22:10:21)

Тема: MMX Симулятор

Всe, кто чуточку знаком с отладкой кода на низком уровне с помощью OllyDbg или в MS Visual Studio, знает, сколько нервов отнимает концентрация на конкретной проблемной инструкции кода, когда пытаешься предугадать последующее состояние всех регистров, опасаясь сделать лишний шаг и упустить ключевую проблемную инструкцию. Так как подавляющее большинство не предусматривают отката контекста процессора назад, даже на несколько единиц команд.

Нa просторах всемирной сети можно найти множество интересных простейших утилит, работающих прямо на странице браузера и не требующих установки.

Конечно, есть более функциональные профессиональные средства, но они требуют регистрации или предлагают ознакомительный ограниченный сервис.

Решил я для собственных потребностей набросать простенький движок по отладке узких мест в MMX-цепочках, так как в том же «Visual Studio» всегда не хватало отката во времени значений регистров.

Предлагаемый здесь отладчик (ссылка) не является полноценным ассемблером/эмулятором x86-архитектуры, а лишь собирает журнал изменения регистров (контекст процессора) построчно.
Тем самым, перемещая каретку по строкам листинга, в окошках с регистрами «x64»/«MMX»/«SSE» и «Canvas» синхронно будут отображаться все изменения, соответствующие действию конкретной инструкции на конкретной строке…

Интерфейс утилиты разрабатывался с максимальным акцентом на журналирование всего. Так, открытые пункты меню и выбранный стиль после перезагрузки страницы активируются вновь. Сохраняется содержимое редактируемого листинга (при условии наличия метки «revision ДАТА») и позиция каретки / выделение в нём.
Имеется поддержка подгрузки внешних листингов и стилей (ссылка на пример подгрузки вырви глаз стиля №10), которые также можно редактировать (двойной клик по любому пункту меню стилей загружает их в редактор).

Псевдо-ассемблер имеет собственные особенности и не транслирует текст инструкций в промежуточный псевдо-код, а симулирует исполнение сам на месте. Тем самым, имеются жёсткие ограничения на операциях работы с ОЗУ (которого нет) и циклы.

  • «MOVQ MM1,[high],[low]» имеет два указателя на переменные «high» и «low», которые загружаются в старшую и младшую половины соответственно. Это может быть полезным исключительно для предварительной инициализации регистров. Трюк работает со всеми операциями включительно

  • «.LOG "Any remark or comment"» заносит в журнал любую ремарку или комментарий

  • «.LOG "Specific for_mat_for_mmx_regs» предопределяет форматированный вывод MMX-регистров и заносит запись в журнал

  • «.LOG MM1» или «.LOG MM1,"Specific for_mat_for_mmx_regs"» печатает значение MMX-регистра, разделяя его шестнадцатеричные разряды знаком подчёркивания в указанных позициях

  • «.LOG CLEAR» очищает журнал

  • «.REPEAT» задаёт позицию начала макроцикла

  • «.REPEAT constant» или «.REPEAT variable» с числовой константой или именем переменной производит очередную итерацию макроцикла, пока их количество не достигнет определённой величины

  • «.CANVAS CLEAR» очищает графический холст

  • «.CANVAS MM1» ставит на графическом холсте очередной пиксель в позиции, определяемой в младших 16-битных словах рагистра MM1 как «X=LOWORD(MM1)» и «Y=HIWORD(MM1)», используя цвет из старших 32 бит MM1

  • «.CANVAS MM1,width» ставит на графическом холсте очередной пиксель в позиции, определяемой в младшем 32-битном слове регистра MM1 как виртуальный вектор на адрес пикселя в видеобуфере, с шириной строки, определяемой величиной width

Позицией ползунка можно выбирать конкретную итерацию макроцикла и отслеживать показания регистров в конкретный момент.
Зажимая клавиши «Home»/«End» в любом месте листинга можно прокручивать позицию ползунка и отслеживать историю отрабатывания инструкций внутри каждой итерации макроцикла…

P.S.: Движок регулярно дорабатывается и дополняется.
Ограниченная поддержка инструкций обуславливается пониженным спросом на подобные инструменты и достаточной функциональностью для моих персональных нудж.