SASM – IDE для ассемблера

Здравствуйте, уважаемые хабравчане!

Данным постом хочу представить сообществу проект, который время от времени писался мной последний год: SASM (SimpleASM) — IDE для разработки программ на языке ассемблера x86 и x86-64.

image

SASM — простая кроссплатформенная (доступна на Windows и Linux) среда разработки для языков ассемблера NASM, MASM, GAS, FASM с подсветкой синтаксиса и отладчиком. Программа работает «из коробки» и хорошо подойдет для начинающих изучение языка ассемблера. Основана на Qt. Распространяется по свободной лицензии GNU GPL v3.0.

Исходники лежат в репозитории на GitHub.
Бинарники можно скачать на сайте программы.

Под катом Вы найдете немножко истории и более подробное описание возможностей.

Откуда все пошло


На 1 курсе в моём университете проходил учебный курс «Архитектура и язык ассемблера», в котором мы изучали ассемблер NASM и сдавали задачи на нем в ejudge контестах. Привыкший к использованию IDE при программировании до этого, я был не очень рад компилить все в командной строке. Удобных на мой взгляд IDE для NASM не было. Универсальные решения типа Geany мне не очень нравились (хотя на вкус и цвет товарища нет — кто-то пользовался всем этим и был доволен). Да и хотелось уже сделать что-нибудь большое и заодно выучить C++.
Итак, было решено написать свою IDE для NASM, в первую очередь для себя и может быть однокурсников.

Опыта написания GUI у меня до этого не было. После недолгих раздумий было решено использовать Qt — хороший бесплатный фреймворк, заодно и кроссплатформенный. Сначала был написан просто текстовый редактор с простой подсветкой, логом построения и окнами ввода/вывода. Гордо называемая «IDE» программа умела собирать текст, который был в текстовом редакторе и запускать построенную программу.
Затем я, немного подучив регулярные выражения, сделал красивую подсветку. Прикрутил отладчик (GDB). Добавил вкладки и всякие простые фичи в текстовом редакторе типа поиска и комментирования куска кода. Постепенно допиливал программу до более-менее нормального вида, исправлял ошибки.

Весной этого года SASM был включен в вышеописанный учебный курс, и первокурсники уже пользовались им. Недавно добавил в программу поддержку и других ассемблеров, кроме NASM — MASM, FASM и GAS.

Возможности


image

Во-первых, это просто редактор кода с подсветкой, вкладками и возможностями построения и выполнения программы. Возможен запуск в отдельном окне.
В логе указывается информация о времени работы программы. Есть 2 формы для ввода и вывода. Как я уже говорил, программа изначально предназначалась для сдачи контестов. Две последние возможности очень удобны для этого. Если все-таки понадобиться сохранить exe’шник, это можно сделать в меню «Файл».

Отладчик

image

Один из самых сложных компонентов в программе — это отладчик. Возможностей у него не так много, но некий минимальный основной набор есть: он показывает текущую строку, делает шаг с заходом, без захода, продолжает выполнение/приостанавливает программу, можно ставить брейкпоинты, смотреть регистры и память. Также для тех кому базовых возможностей все же не хватает снизу окна реализована командная строка для ввода произвольных команд для GDB.

Да, отладчик реализован на базе GDB. Сделать его было не очень просто из-за ограничений ассемблера. В частности, NASM не умеет генерировать нормальную отладочную информацию и приходится определять текущее местонахождение в программе, ставя в соответствие листинг, генерируемый ассемблером и текущий адрес в счетчике команд EIP.

Библиотека макросов для NASM

В SASM включена библиотека макросов для ввода/вывода «io.inc», используемая в курсе «Архитектура и язык ассемблера» и немного переписанная для отладки и поддержки 64-битного режима. Она очень удобна на начальных этапах обучения — позволяет выводить данные, не задумываясь о соглашениях и правилах вызова функций.

Например, чтобы вывести число содержащееся в регистре EAX, достаточно написать

PRINT_DEC 4, eax ; 4 - количество байт

вместо

section .data
    format db "%d", 0
section .text
    push eax
    push format
    call printf
    add esp, 8

Команды, содержащиеся в «io.inc» можно найти в справке.

Опции

image

В настройках программы можно полностью настроить текстовый редактор — задать цветовую схему, выбрать шрифт, задать начальный текст.
Там же задается язык (доступны русский и английский).

image

Также в параметрах доступен выбор ассемблера (NASM, MASM, GAS или FASM) и разрядности (x86 или x64). Эти опции влияют на выбор программ — ассемблера и компоновщика, и опций для них. Также под новый ассемблер подстраивается подсветка и начальный текст. Пути и опции сборки можно задать и вручную.

Дополнительно

Программа содержит справку и примеры программ для каждого ассемблера — программы Hello World в папке Projects и начальные шаблоны, чтобы можно было сразу приступить к написанию кода.

На Windows все нужные для сборки программ компоненты уже включены в SASM. Программа работает «из коробки» — можно начинать программировать сразу же после запуска.
На Linux следует установить gcc, gdb и необходимый ассемблер.

Заключение


Больше информации о программе и исходники можно посмотреть по ссылкам выше. Качество кода в начале может быть не очень — только осваивал C++ и ООП, сразу на всякий случай прошу прощения.

Проект Open Source — так что, если вдруг кто-то хочет присоединиться и что-то поменять — Welcome!
Также буду рад отзывам, предложениям и сообщениям об ошибках. И конечно разумной критике, куда без нее.
Поделиться публикацией
Комментарии 39
    +6
    Бинарники класть в репозиторий с кодом — не лучшая идея, всё-таки есть в GH поддержка релизов, чтобы хостить их на GH.
    Я сейчас хотел под OS X собрать, но что-то через мобильный канал выкачиватся долго, значит не сегодня.
      +1
      Да, я знаю. Но это было сделано из соображений того, чтобы можно было сразу запустить программу на Windows после клонирования и сборки. Не знаю как это сделать без бинарников ассемблеров в репозитории.
        +11
        На гитхабе есть раздел «releases» у каждого проекта, туда и надо было засунуть.
      +11
      Уникальная возможность увидеть теги Qt и Assembler вместе =).
        +8
        Попробовал и ткнул Donate

          +2
          Спасибо!
          +1
          Есть ли возможность выложить бинарник для Mac OS X?

            +1
            У меня нет Mac OS — так что я не могу. Но теоретически программу можно собрать под нее.
            Однако там есть некоторые системно-зависимые куски кода, которые тестировались только на Windows и Linux. Возможно их нужно будет немного подправить.
            +1
            Интересно, разрабы KolibriOS оценят?
              +14
              Только если автор перепишет редактор на ассемблере.
                +2
                Моя первая мысль, когда я начал читать: среда для asm может быть написана только на asm.
                  0
                  Уже есть такой :-) Но от IDE не так много пользы, если компилировать, запускать программы и отлаживать для KolibriOS из него нельзя. Я лично пишу просто в Notepad++.
              +1
              Зачёт, просто зачёт… и уважуха!!!))
                +1
                5! Автоматом!!!
                Работа классная!
                +1
                Возможности оценить сейчас нету, но видно что проделана хорошая работа, молодец!
                  +3
                  Планируется ли добавление поддержки других ассемблеров, к примеру, JWasm?
                    +1
                    Возможно, если будет время. Проект открытый — так что можете и сами попробовать. Вообще добавить ассемблер не очень сложно — достаточно написать реализацию абстрактного класса Assembler и добавить выбор нового ассемблера в настройки.
                    0
                    Плюсую. А ARM есть возможность прикрутить?
                      0
                      Не сталкивался с ARM. Но если для него бинарники строятся по сути такими же программами-ассемблерами, как и для PC, то прикрутить можно. Смотрите мой ответ на комментарий выше.
                      +1
                      Автор просто молодец)
                        0
                        Очень интересный проект!
                        Будет ли возможность компилировать *.dll или, к примеру, *.lib, чтобы потом через C++ собрать полноценную библиотеку с ядром, написанным на asm?
                          0
                          Вообще это не вписывается в начальную концепцию. Однако можно в опциях прописать соответствующие параметры и потом сохранять результат через «Сохранить .exe» в меню «Файл».
                          +2
                          Не хватало его, когда был студентом… Тогда и сам подумывал о написании) Хорошая работа!
                            +3
                            За io.inc отдельное спасибо!

                            BTW, я тут недавно от нечего делать набросал asmtidy для интеловского синтаксиса, использую его для форматирования ассемблерных исходников в разных редакторах. Сюда не прикручивается, а как раз в тему бы оказалось…

                            P.S. оно на перле, посмотреть тут можно: ato.su/asmtidy/
                              +2
                              Вы прямо реализовали мою детскую фантазию!) Да наверное не только мою) Тоже посещали мысли нечто подобное попробовать, но как-то не сложилось… Помню, были когда-то некие аналоги, даже названия уже забыл, но во многом уступали, в частности, в методологии разработки/лицензии (закрытая проприетарщина), их обогнали редакторы исходного кода, из-за которых они стали бесполезны и как-то тихо затухли… Будет круто, если вы не забросите проект, а продолжите развивать по всем направлениям, в частности добавив поддержку ассемблеров arm и других архитектур, стандартную библиотеку, сниппеты, скриптинг/автоматизация/апи, справку по командам, больше интерактива и «умности», было бы круто увидеть шаблоны проектов различного типа приложений для основных платформ, в идеале с возможностью проектирования UI в графическом редакторе IDE в design-time режиме (да-да, были и такие попытки)… :D Понимаю насколько это титанично и звучит как тяжелая наркомания (думаю, сообщество не оставит, времена меняются: проф. коммунитиз (тут упоминалась колибриось?), вендорный суппорт, опен сорц, краудфандинг, краудсорсинг шагают по планете), но без этого моя детская фантазия будет неполной :>
                              Чота грузанул я вас, в общем, успехов! :)
                                +4
                                Пользуясь случаем, передаю привет от первокурсников нашего общего университета! Все очень благодарны за вашу работу. (Правда, сам я по старой привычке жил и работал в vim… :) )
                                  +1
                                  Интересная разработка, а вы в сторону RadASM не смотрели? Мне в своё время хватало с лихвой его возможностей.
                                    0
                                    Thank you for visiting RAD Software! Unfortunately, we had to temporarily shut down this website because several files have been (with high probability falsely) classified as malware which caused our hosting provider to shut down the whole CherryTree network.

                                    Ай лолд! :D
                                      0
                                      RadASM конечно же смотрел. Но там немного другая концепция. Я хотел сделать простую IDE, чтобы можно было сразу запустить и без особых настроек начать программировать. RadASM наоборот сделан более сложным и настраиваемым. К тому же, как я писал, в первую очередь SASM предназначался для контестов — там можно легко потестировать программу с помощью полей ввод и вывод.

                                      Отладчик запустить внутри в нем тоже не получилось. Можно отлаживать только в ollydbg (что было бы вполне приемлимо, если бы не макросы, которые разворачиваются ассемблером в большой непонятный набор инструкций).

                                      Из маленьких багов, которые бросились в глаза — мышка почему-то не прокручивает исходный код (Windows 8).
                                      Да и на Linux его нет.
                                        0
                                        В RadASM я писал несколько лет и не могу сказать, что для запуска обязательно нужно что-то сначала настраивать: создали проект под нужный ассемблер — и вперед творить. Я правда все на MASM32 сидел да на WINAPI, может с другими иная ситуация.
                                          0
                                          Я проверял на NASM, так как в принципе для этого ассемблера все и писалось изначально. Там пришлось настраивать опции компиляции, что я делал наугад (там использовались цифры для обозначения входных/выходных файлов на каждом этапе сборки), потому что справка оказалась пустой.
                                          Такое чувство, что это все нормально работало ранее (и опции были правильные, и справка, и мышка) и просто не работает на новых версиях Windows.

                                          С MASM32 и правда ситуация получше. Настраивать пути и опции не нужно — все сразу собралось. И даже мышка работает. После некоторых шаманств, отладчик внутри запустился и даже остановился на каком-то брейкпоинте, но никакие другие команды в нем не работали. Может я делал что-то не так, может опять же все это из-за Windows 8.
                                            0
                                            Может и с версией ОС дело, я еще на XP его использовал.
                                            А справка там вроде как в HLP, который уже в семерке открывается только, если доставить приложение.
                                      0
                                      А как должна кнопка «Step over» работать? В такой конструкции:

                                      mov esi,http1
                                      mov ebx,h1_length
                                      call check_http
                                      mov esi,http2
                                      mov ebx,h2_length
                                      call check_http

                                      она у меня не проскакивает через call_http, а заходит внутрь.
                                        0
                                        Должна проскакивать. Возможно, функция check_http не формирует фрейм:
                                        функция должна быть записана в виде
                                            push ebp
                                            mov ebp, esp
                                            <произвольный код>
                                            mov esp, ebp
                                            pop ebp ;или leave вместо последних 2 инструкций
                                            ret

                                        Это написано в справке. Если функция не формирует фрейм, GDB может неправильно распознавать функцию и соответственно «Step over» будет работать неправильно. Более того, может неправильно работать определение текущей строки при отладке.
                                          0
                                          А, точно, фрейма нет.

                                          В любом случае уже чешу репу: а не добавить ли куда-нибудь в Settings пункт External Tools? Ну, менюху для настройки внешних утилит. Вот два кандидата (для меня лично) уже есть: 1) форматирование исходников и 2) загрузка внешнего отладчика (привык к nemiver)
                                            0
                                            Ну да, хорошо бы добавить.
                                        +2
                                        Круто! Приятные впечатления начались с того, что ваше приложение у меня собралось без лишних вопросов и с первого раза (Ubuntu 12.04 LTS x86-64).
                                        Следующее приятное впечатление — поддержка русского языка в очень качественном виде.

                                        Теперь я обращусь к вам с просьбой, или, если хотите, с фичериквестом. Пожалуйста, если это не очень сложно, добавьте возможность добавлять в список регистров, содержимое которых отображается при отладке, регистры различных процессорных расширений, в том числе — ymm (регистры расширений AVX/AVX2). Вы будете пионером в этом, если мои наблюдения не устарели за несколько месяцев. Просьба не совсем праздная и согласуется с образовательными целями вашего проекта. Нам (мат-мех СПбГУ), и не только нам, читается вот этот замечательный курс, в который входят расширения AVX/AVX2. Автор курса традиционно проводит его на базе Visual Studio, которая до сих пор (см. поправку выше) не умеет отображать регистры ymm. Если фича у вас появится, обязательно посоветую вашу IDE автору курса.

                                        Удачи в дальнейшей работе.
                                          0
                                          Классно, что ассемблер сейчас преподают с оглядкой на современность, а не закопавшись на уровне команд 286.
                                            +2
                                            Спасибо. Я добавил возможность просмотра всего списка регистров. Теперь ее можно включить в настройках.

                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                          Самое читаемое