Дaнный симулятор (ссылка) предназначен для быстрого выявления грубейщих логических ошибок в коде, не является полноценным отладчиком и предназначен для предварительного ознакомления с ассемблером. В сети можно найти достаточно разных сервисов для отладки разного кода. В частности, для отладки x86-кода самым удобным, ИМХО, нахожу этот, хотя он значительно уступает сервисам профессиональной отладки. Но, когда дело доходит до MMX, SSE, AVX или просто x64, похожих сервисов находится крайне мало и зачастую они требуют регистрации. По-этому, на базе собственного движка «Койяанискаци» (ссылка), путём незначительной переработки, предпринимается попытка разработать некое подобие симулятора, позволяющего быстро построчно изучить действия инструкций процессора в совокупности или выявить некоторые неточности в составлении алгоритма. Пользоваться симулятором довольно просто. Например, в симуляторе нажав меню «File->New», затем «File->Bresenham's line to [x,y]-array (mmx)», поставив каретку на строку #50 и несколько раз нажимая клавишу «End», можно наблюдать за отрисовкой пикселей в графическом окне и изменениями в MMX-регистрах… После всякого изменения листинга тот подвергается парсингу с симуляцией, что требует какого-то времени. А дальше - перещаясь кареткой по строчкам листинга можно наблюдать за изменениями регистров «MM0…7» и остальных. Директивы ассемблера стандартны, но есть и специфические особенности: «MOVQ MM1,[high],[low]» имеет два указателя на переменные «high» и «low», которые загружаются в старшую и младшую половины соответственно. Это может быть полезным исключительно для предварительной инициализации регистров. Трюк работает со всеми операциями включительно «MOVQ MM1,[User_Y1],[User_X1]» / «MOV EAX,[User_Y2],[User_X2]» загружает координаты начальной или конечной точки проведённой пользовательской мышью линии на графическом холсте (НОВАЯ ФИШКА) «.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 Управление реализовано на интуитивном уровне, позволяющее перемещаться по инструкциям листинга и прослеживать их влияние на регистры. Интерфейс имеет ползунок для отслеживания/проматывания истории итераций в подобиях макроциклов, которые организуются оператором ассемблера «.REPEAT», позволяющего организовывать неуправляемые короткие макроциклы на уровне парсинга листинга, что может занять значительное время. Для исследования истории изменения регистров в макроцикле достаточно установить каретку на любую инструкцию в пределах цикла и серией нажатий на клавиши «End»/«Home» проматывать историю Назад/Вперёд соответственно. При этом ползунок будет оперативно отображать индекс итерации… Всякие изменения листинга сохраняются в локальном хранилище браузера и удаляются из него только пунтком меню «File->New». Потому можно многократно перезагружать страницу без потери своего листинга. Всякие изменения на графическом холста перезапускают транслятор листинга, что может занять значительное время. (НОВАЯ ФИШКА) (Возможно, в последующих реализациях вопрос со множеством трансляций листинга удастся решить псевдо-функциями: Сейчас эту задачу (ускорения) решает буфер массива инструкций с функцией «eval» в макроциклах…) Внимание! Автор не несёт никакой гарантии на точность симуляции, так как данная утилита разрабатывалась сугубо для личных нужд и имеет минимальный функционал, достаточный для исследования/отладки конкретных фрагментов кода. А дополнительные инструкции x86/x64 вносятся по мере необходимости. P.S.: Данная поделка никак не претендует на точность симуляции и разрабатывалась, прежде всего, для личных потребностей… Но, постараюсь в процессе достичь более точной и полной симуляции по мере надобности. Буду рад выслушать критику, предложения и замечания по всевозможным багам!
У меня почему-то черный текст на черном фоне и ничего не работает. В менюшках debug и cpu ничего нет.
Тaкое у меня бывает, если я жму свою кнопку «развернуть окно»… (Лучше жать «F11».) Сам «движок» я развернул на базе этого. Но в соседней теме никто не делал никаких замечаний и я ничего не знаю о глюках интерфейса у остальных пользователей… (Так функция кнопки «развернуть» просто подавлена…) На Вашем скриншоте вижу ещё одну проблему - заголовки окошек. Видимо, проблема CSS, так как вёрстка страниц - не мой конёк. Вот так у меня отображает это Chromium на Raspbian: Вот так отображает это Mozilla FireFox ESR: В двух разных браузеров особых проблем со стилем не замечалось. Спасибо.
Без разворачивания сразу так, понажимать F11 не помогает. Браузер опера, тот же хромиум, но в другом скине.
A, понятно… Подозреваю, проблема в стилях, где использовались цвета ActiveCaption/ButtonFace/CaptionText/Hightlight/HighlightText/MenuText, чтобы поддержать общий стиль системы (ссылка). Сейчас вижу (ссылка), что не везде это работает. Жаль… Но, как-то странно, что в двух браузерах стили нормально обрабатываются, а вот Opera - подвела! (До версии 12 был моим любимым браузером, пока не сменили они движок.) Спасибо! Теперь хоть ясно, куда копать… Менюшки - подавлены, так как всё копировалось с «Koyaanisqatsi-CPU»… Но сами менюшки отображались нормально? P.S.: Сейчас заглушил оригинальные системные стили стандартными цветами (в ущерб дизайну, конечно)… Вроде бы всё должно теперь отображаться? Навигация по строками листинга изменяет показания регистров (это важнее всего знать)?
Да, все отображается, при выделении строки показывает мгновенные значения регистров на момент исполнения. Напиши разрабам гидры, у тебя концепция эмулятора удобней, чем придумали они)
Вы единственный человек, обративший внимание именно на концепцию, а не фантики (интерфейс да бутафорскую реализацию). Именно подобную концепцию я вынашивал ещё начиная с «Visual Studio 6», так как отладка пустяковых инлайнов занимала уйму времени и требовала предельной концентрации! (Сделаешь лишний шаг отладчика и остаётся только гадать, какое значение было у такого-то регистра.) А ведь достаточно было в режиме отладки сохранять контекст процессора в буфер журнала отладки после выполнения каждой инструкции… P.S.: Сейчас ассемблер стал менее актуальным в своём чистом виде и специалистов всё меньше благодаря мощным компиляторам. Но подобные концептуальные фишки в отладчиках помогли бы привлечь больше программистов к низкому уровню и вернуть профессиональный интерес к ассемблеру…
Это всё равно, что вернуться обратно жить на деревья, как делали хвостатые предки. Даже если жить на деревьях здорово, этого скорей всего не будет.
Во-первых уже давно перейден Рубикон, за которым один человек, не опираясь на код, написанный тысячами-детсятками тысяч людей, ничего стоящего уже не напишет, здоровья не хватит. Во-вторых смартфоны-шмартфоны стали чуть ли не актуальней ПК, а выращенный ими ARM всюду лезет, куда не зовут (и уже даже влез в процессоры интел). Ассемблер бы тянул прогресс назад. Актуальности он не потеряет никогда, но популярным уже не будет.
Думaю, раз данный эмулятор пользуется спросом (в частности - в моём лице), то и на разрабатываемую мною поделку может обратить внимание узкая аудитория для ознакомления с азами составления алгоритмов на низком уровне. P.S.: Сегодня весь вечер ушёл на стилизацию интерфейса… Уйма времени ушло на html/css3-жонглёрство (без js), чтобы основное выпадающее меню не исчезало резко вне фокуса мыши, что может сильно нервировать в ряде случаев. Также, добавил несколько классических x86-инструкций и листинг демонстрационного кода. Да, теперь ещё поле листинга становится серым на время трансляции, хотя это и бесполезная визуальная фишка…
Двoе суток занимался косметикой интерфейса (в основном, чтобы внешне выглядило всё солиднее и не хуже, чем у подобных сервисов)… Теперь каретка в листинге или выделенный фрагмент (сессия оболочки) после перезагрузки страницы восстанавливаются всегда Позиция ползунка также запоминается, что позволяет всегда видеть конечный результат работы цикла и находить критические инструкции Добавлен пункт меню «View» для скрытия/показа окон Графики, Журнала, Регистров процессора и MMX Добавлен пункт меню «Window» для выбора общего стиля окон (стили «Macintosh», «Windows'9x», «DOS» и т.д…) Любой открытый пункт меню открывается и после перезагрузки страницы Хотелось бы узнать, у кого какие баги возникли (в симуляции или интерфейсе) и на каком браузере? Какие замечания или предложения по этому движку? Спасибо за участие!
Alikberov, спасибо за ваш труд, интересная реализация пару простеньких замечаний 1) можно легко испортить окошка регистров - там даже можно копи-паст делать и загнать интерфейс в такое состояние, что окошко теряет шапку и его нельзя двигать, также оно может собой перекрыть другие окна окошко MMX более стойкое - не позволяет копи-паст например Simulation History вообще нинзя 2) стиль Dark не очень читаем пример багов 1 + 2 Opera88/W7 3) есть у вас в планах добавить симуляцию команд и набор регистров YMM/ZMM?
Это окошко я больше проработал, но не до конца, чтобы понять вообще, как на уровне хуков ограничить действия пользователя, но позволить ему на лету редактировать состояния регистров. Конечно, в условиях симуляции, а не эмуляции, это не так легко организовать и на данный момент возможность редактирования поля регистров имеется лишь формальная, как резерв на будущее… До обработчика хуков x86/x64-регистров руки ещё не дошли, но там та же история, что и с MMX: Резерв на будущее… Можно заметить на функции «Ctx_SelectStart» (сейчас это строки с 3744) по сбитому общему стилю, что она ещё не дописана и является временной… Но, я учту это и исправлю. Или временно заглушу. Главное, что переключение стилей - вообще работает! (много нервов поедает вёрстка интерфейса, так как css не имеет режима пошаговой отладки. и полоса основной прокрутки листинга не работает, если указатель находится у самого края экрана) Спасибо. Теперь можно будет более серьёзнее проработать все стили. (Сейчас это строчки с 4092 по 4494: Буду рад рассмотреть предложения по стилям от пользователей.) При открытии темы под её заголовком имелся расчёт на поддерку SSE и AVX с соответствующим набором регистров. Но, пока на уровне MMX и x64 прощупывался сам механизм описания подобных операций. Лично я понял, частично, как компактно описать симуляцию некоторых операций. но не всех остальных. В частности, сейчас необходимо ввести элементарную простейщую инструкцию «LEA». Но для этого нужно описать парсинг всех режимов адресации x86/x64, что не так легко… Спасибо за тестирование и замечания. Подобный инструмент давно должен иметься на просторах сети и я временно вытащил его из собственных закромов в gist. Соответственно, перенести в github и открыть отдельный сайт как простейший быстрый сервис - было бы идеально. Лично мне нравятся сервисы, подобные WaveDrom или DigitalJS, позволяющие буквально на коленке описать некоторую мысль или проверить визуально узкое место в коде, так как открывается у любого пользователя по QR-коду и не нужно напрягаться с установкой. Как я уже сказал в самом начале темы, нередко пользовался Assembly x86 Emulator для отладки короткого кода, пока не потребовалось проверять MMX-цепочку и пришлось думать о своём инструменте для личных нужд. А более серъёзные песочницы требуют регистрации, взносов или сильно тормозят. --- Сообщение объединено, 16 июл 2022 --- Покa стили не трогал, прикрепил файл со скриншотами всех стилей, чтобы можно было сравнить, как это отображается у меня и в чём проблема отображения у пользователей.
Чтoбы решить вопросы и проблему стиля интерфейса, все эти дни уделил исключительно проработке взаимодействия с пользовательскими стилями. Теперь при двойном клике на любой пункт меню Window соответствующий стиль не только активируется, но и открывается в редакторе листинга, где можно активно экспериментировать. Также, работает и механизм подгрузки внешних стилей. Как пример вырви глаз стиля - ссылка. (Если интерфейс приобрёл ядовитые кислотные оттенки, значит подгрузка прошла удачно.) Таким образом, пользователь может разово подгружать свой собственный стиль (Номер 10) из gist-хранилища и стиль будет оставаться в памяти браузера, пока локальное хранилище сессий не удалится (например, меню File->New). P.S.: Был доработан механизм разбора секций листинга в редакторе… В частности, если раньше секция ассемблера определялась в тексте как «.assm», то теперь она определяется по ключам «::mmx»/«::x86»/«::x64»… Соответственно, секция стиля определяется как «::Style» или «::Style0»…«::Style10»… (Механизм не до конца проработан и могут быть глюки.)