SASM – IDE для ассемблера
Данным постом хочу представить сообществу проект, который время от времени писался мной последний год: SASM (SimpleASM) — IDE для разработки программ на языке ассемблера x86 и x86-64.
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.
Возможности

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

Один из самых сложных компонентов в программе — это отладчик. Возможностей у него не так много, но некий минимальный основной набор есть: он показывает текущую строку, делает шаг с заходом, без захода, продолжает выполнение/приостанавливает программу, можно ставить брейкпоинты, смотреть регистры и память. Также для тех кому базовых возможностей все же не хватает снизу окна реализована командная строка для ввода произвольных команд для 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» можно найти в справке.
Опции

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

Также в параметрах доступен выбор ассемблера (NASM, MASM, GAS или FASM) и разрядности (x86 или x64). Эти опции влияют на выбор программ — ассемблера и компоновщика, и опций для них. Также под новый ассемблер подстраивается подсветка и начальный текст. Пути и опции сборки можно задать и вручную.
Дополнительно
Программа содержит справку и примеры программ для каждого ассемблера — программы Hello World в папке Projects и начальные шаблоны, чтобы можно было сразу приступить к написанию кода.
На Windows все нужные для сборки программ компоненты уже включены в SASM. Программа работает «из коробки» — можно начинать программировать сразу же после запуска.
На Linux следует установить gcc, gdb и необходимый ассемблер.
Заключение
Больше информации о программе и исходники можно посмотреть по ссылкам выше. Качество кода в начале может быть не очень — только осваивал C++ и ООП, сразу на всякий случай прошу прощения.
Проект Open Source — так что, если вдруг кто-то хочет присоединиться и что-то поменять — Welcome!
Также буду рад отзывам, предложениям и сообщениям об ошибках. И конечно разумной критике, куда без нее.
34. Системный (ассемблерный) отладчик ос ms-dos — debug. Интерактивные типы отладчиков.
Отладчик (Debugger) — это программа, позволяющая увидеть ход выполнения отлаживаемой программы, менять содержимое регистров, памяти и т.д в процессе выполнения. Используется для исследования алгоритма работы программ, обнаружения ошибок. Под отладчиком можно увидеть результат выполнения команд процессора, функций ОС, что, вместе с документацией, очень полезно для обучения Assembler’у. Хорошое владение отладчиком особо необходимо начинающему программисту, т.к большую часть времени создания программы будет занимать ее отладка.
Программа-отладчик DEBUG является очень важным и необходимым инструментом для изучения работы ЭВМ, поставляемым в составе DOS. Программа DEBUG позволяет осуществлять три вида действий в отношении содержимого ПЗУ и ОЗУ:
1) выборку произвольного участка памяти и отображение его содержимого в двух форматах:
— формат не связанный с деассемблированием;
2) запись программ на машинном языке или на языке ассемблера и их выполнение;
3) исследование и отладку программ, хранящихся на диске или в памяти.
Программы, представленные на языке машинных команд (например, исполнительный модуль), чрезвычайно сложны для восприятия человеком. Процесс деассемблирования, реализуемый программой DEBUG, значительно облегчает процедуру интерпретации машинного языка.
Деассемблирование — это процесс трансляции или преобразования инструкций машинного языка, представленных в абсолютном шестнадцатеричном виде в символическую нотацию языка ассемблера.
Типы отладчиков.
Существуют следующие основные типы отладчиков:
• Ring3 отладчик: Отладчики этого типа, как правило, входят в пакет с компилятором. Представляют из себя обычную прикладную программу. Обладают очень ограниченной функциональностью. Позволяют отлаживать только прикладные программы. В TASM — TD (Turbo Debugger), В MASM — CodeView.
• Ring0 отладчик: Отладчики этого типа являются Ring0 драйверами ОС, поэтому имеют неограниченные возможности по управлению компьютером (доступ к памяти, регистрам, портам ввода-вывода и т.д). Позволяют отлаживать всё: прикладные программы, драйверы и т.д. Лучшими считаются SoftICE и KD.
35. Ассемблер для микропроцессоров с архитектурой intel 80×86. Общая характеристика языка, основные особенности и возможности. Инструментальные системы для разработки программ на языке Ассемблера.
Язык ассемблера представляет собой машинный язык в символической форме, которая более понятна и удобна человеку.
Язык ассемблера микропроцессора Intel 8086 является довольно сложным, что в первую очередь объясняется сегментной организацией памяти и одновременной адресацией четырех сегментов. В языке имеется более 100 базовых символических команд, в соответствии с которыми ассемблер генерирует более 3800 машинных команд. Кроме того, в распоряжении программиста имеется более 20 директив, предназначенных для распределения памяти, инициализации переменных, условного ассемблирования и т.д.
Исходная программа на языке ассемблера представляет собой последовательность операторов. Операторы обычно занимают одну строку. Ассемблер воспринимает операторы в свободном формате, т.е. элементам операторов не назначены фиксированные столбцы и между ними может быть любое число пробелов там, где это необходимо.
Операторы в исходной программе классифицируются как командные операторы, операторы распределения данных и директивы ассемблера.
Командные операторы определяют генерируемые ассемблером машинные команды; они содержат мнемонику и, при необходимости, один или два операнда. Каждый командный оператор порождает одну машинную команду, формат которой зависит от способа задания операндов.
Операторы распределения данных резервируют ячейки памяти для данных программы.
Директивы ассемблера содержат специальные указания для ассемблирующей программы и сами по себе не порождают никаких машинных кодов.
Языки программирования компьютеров делятся на 2 основные группы:
1) языки низкого уровня;
2) языки высокого уровня.
К языкам низкого уровня относятся языки Ассемблера. Свое название они получили от имени системной программы Ассемблер, которая преобразует исходные программы, написанные на таких языках, непосредственно в коды машинных команд. Термин «Ассемблер» произошел от английского слова assembler (сборщик частей в одно целое). Частями здесь служат операторы, а результатом сборки последовательность машинных команд. Процесс сборки называется ассемблированием.
Язык Ассемблера объединяет в себе достоинства языка машинных команд и некоторые черты языков высокого уровня. Ассемблер обеспечивает возможность применения символических имен в исходной программе и избавляет программиста от утомительного труда (неизбежного при программировании на языке машинных команд) по распределению памяти компьютера для команд, переменных и констант.
Ассемблер позволяет также гибко и полно использовать технические возможности компьютера, как и язык машинных команд. Транслятор исходных программ в Ассемблере проще транслятора, требующегося для языка программирования высокого уровня. На Ассемблере можно написать столь же эффективную по размеру и времени выполнения программу, как и программу на языке машинных команд. Это достоинство отсутствует у языков высокого уровня. Этот язык часто применяют для программирования систем реального времени, технологическими процессами и оборудованием, обеспечение работы информационно-измерительных комплексов. К таким системам обычно предъявляются высокие требования по объему занимаемой машинной памяти. Часто язык Ассемблера дополняется средствами формирования макрокоманд, каждая из которых эквивалентна целой группе машинных команд. Такой язык называют языком макроассемблера. Применение мак «строительных» блоков и приближает язык Ассемблера к языку высокого уровня.
Ассемблер машинно-зависимый язык, т. е. он отражает особенности архитектуры конкретного типа компьютера. Исходная программа, написанная на ассемблере, состоит из одного или нескольких исходных модулей, а каждый модуль – из операторов.
Специфические особенности языка
Ассемблер является языком программирования низкого уровня, составленная на нем программа представляет собой последовательность команд конкретной ЭВМ, чаще конкретного семейства ЭВМ, записанных в некой условной мнемонической форме. Именно машинная ориентация определяет достоинства и недостатки этого языка.
Неоспоримым достоинством ассемблера является возможность составления программ, рационально использующих все особенности системы команд конкретной ЭВМ. Он предоставляет неограниченные возможности для различного рода трюков (в хорошем смысле этого слова), тут все зависит от профессиональных навыков программиста и его изобретательности.
Другим положительным свойством является универсальность языка, — он позволяет составить программу для любой задачи, которая имеет решение и может быть решена на машинах данного семейства. Это утверждение основано на том очевидном факте, что любая программа, составленная на языке высокого уровня, при компиляции преобразуется в последовательность машинных команд.
Очевидным недостатком является низкий уровень абстрагирования от особенностей конкретной ЭВМ, необходимость знать и учитывать эти особенности. В то время как при работе с языками высокого уровня программист может полностью сосредоточить свое внимание на особенностях реализуемого алгоритма.
Что же касается инструментальных средств для разработки приложений на »чистом» ассемблере, то в последнее время появились очень мощные приложения такого рода, что вынуждает по-другому взглянуть на проблему. Из таких инструментальных средств проектирования можно выделить в первую очередь макроассемблер MASM32, а также AsmStudio и NASM. Эти и другие инструменты разработки программ имеют самый современный графический интерфейс. Не следует забывать и о том, для ассемблера разработаны многочисленные библиотеки функций, приближающие этот язык по своим функциональным возможностям к высокоуровневым средствам разработки приложений.
Turbo Assembler (TASM) — программный пакет компании Borland, предназначенный для разработки программ на языке ассемблера для архитектуры x86. Кроме того, TASM может работать совместно с трансляторами с языков высокого уровня фирмы Borland, такими как Turbo C и Turbo Pascal. Как и прочие программные пакеты серии Turbo, Турбо Ассемблер больше не поддерживается.
TASM до сих пор используется для обучения программированию на ассемблере под архитектуру x86.[источник не указан 487 дней] Многие находят его очень удобным и продолжают его использовать, расширяя набором дополнительных макросов.[источник не указан 487 дней]
Пакет TASM поставляется вместе с компоновщиком Turbo Linker и порождает код, который можно отлаживать с помощью Turbo Debugger.
По умолчанию TASM работает в режиме совместимости с другим распространённым ассемблером — Microsoft Macro Assembler, то есть TASM умеет транслировать исходники, разработанные под MASM. Кроме того, TASM имеет режим IDEAL, улучшающий синтаксис языка и расширяющий его функциональные возможности.
Microsoft Macro Assembler (MASM) — ассемблер для процессоров семейства x86. Первоначально был произведён компанией Microsoft для написания программ в операционной системе MS-DOS и был в течение некоторого времени самым популярным ассемблером, доступным для неё. Это поддерживало широкое разнообразие макросредств и структурированность программных идиом, включая конструкции высокого уровня для повторов, вызовов процедур и чередований (поэтому MASM — ассемблер высокого уровня). Позднее[когда?] была добавлена возможность написания программ для Windows. MASM — один из немногих инструментов разработки Microsoft, для которых не было отдельных 16- и 32-битных версий.
NASM (Netwide Assembler) — свободный (LGPL и лицензия BSD) ассемблер для архитектуры Intel x86. Используется для написания 16-, 32- и 64-битных программ.
MS-DOS и TASM 2.0. Часть 5. Ключевые понятия.

Чтобы идти дальше, нам необходимо получить ключевую информацию об определённых понятиях, научиться использовать в работе отладчики и дизассемблеры — программы, которые помогут нам изучать и анализировать наш код.
- Шестнадцатеричная система счисления.
- Данные.
- Регистры.
- Указатель.
- Команды ассемблера.
- Процедура (подпрограмма, функция).
- Стек.
Каждая программа содержит ошибки. Выявление и исправление ошибок обычно занимает около 90% всего времени, затрачиваемого на написание программы, и только 10% времени тратится на написание кода.
Для «копания» в своём или чужом коде существуют отладчики и дизассемблеры.
Отладчики и дизассемблеры.
Сразу скажем, что скачать отладчики и дизассемблеры, необходимые для дальнейшей работы можно с нашего сайта, они находятся в архиве с остальными программами для изучения ассемблера для DOS (DOS-1.rar).
Отладчик даёт возможность проследить выполнение запущенной программы пошагово в режиме непосредственной её работы.
Встроенные в среду программирования любого языка отладчики позволяют отслеживать выполнение кода именно того языка, с помощью которого вы создаёте программу. Однако, есть «стандартные» отладчики, которые позволяют распотрошить любой исполняемый файл, показав пошаговое выполнение инструкций. Там балом правит исключительно ассемблер!
Дизассемблер — это программа, позволяющая преобразовать исполняемый файл в код на языке ассемблера.
Пока мы с вами изучаем программирование на ассемблере в системе MS-DOS, воспользуемся отладчиком Turbo Debugger, дизассемблерами Sourcer и IDA. Рассмотрим краткие характеристики и особенности указанных программ. Более подробно отладчики и дизассемблеры мы рассмотрим попозже.
Turbo Debugger.
Отладчик машинного уровня от фирмы Borland, предназначенный для отладки исполняемых файлов MS-DOS. Входит в пакеты Turbo Assembler (TASM), Turbo Pascal (TP) и Turbo C (TC).

Turbo Debugger (TD) — известнейший DOS отладчик от Borland.
Позволяет просматривать отладочную информацию, добавленную при создании программ в качестве комментариев и исходного кода.
Отладчик классического вида, работает спокойно и правильно, как в чистом DOS, так и в эмуляторе DOSBox.
Sourcer.
Перечисляя отладчики и дизассемблеры прошлого, нельзя не обратить вынимание на Sourcer — в своё время очень известный и популярный дизассемблер DOS программ. Славится очень корректным нахождением так называемых перекрёстных ссылок, что облегчает жизнь хакеру, специализирующемуся на реверс-инженеринге и просто программисту, отлаживающему код.

Sourcer — известнейший
дизассемблер DOS программ.
IDA — Interactive DisAssembler.
IDA — любимый дизассемблер известного хакера Криса Касперского. Многие отладчики и дизассемблеры позавидовали бы глобальности этой программы. Из особенностей можно отметить возможность написания достаточно сложных программ-макросов на встроенном Си-подобном языке, содержащих алгоритмы анализа и отладки приложений.
Получил своё развитие в среде Windows, причем понимает 64 битный код. Генерирует логическую схему программы. При помощи декомпилятора Hex-Ray из дизассемблерного кода создаёт достаточно живой код на Си.

Ассемблер для dos — интерактивный дизассемблер IDA.
Наряду со своими внушительными возможностями обладает одним недостатком — сложностью изучения в полном объёме. Необходимо запомнить кучу горячих клавиш, особенностей и фишек. IDA требует такого же изучения, как отдельный язык программирования в приложении к конкретной среде разработки.
Мы рассмотрели только наиболее удобные и функциональные отладчики и дизассемблеры программ операционной системы MS-DOS, которые будем использовать при дальнейшем изучении ассемблера.
Инструкция по использованию отладчика с редактором emacs для языка ассемблера (GNU Assembler)
gdb — отладчик, предназначенный для использования прежде всего как бэкенд отладки, это мощная программа с огромным набором возможностей, но предоставляющая достаточно примитивный интерфейс пользователя. Гораздо более удобный интерфейс обеспечивается фронтендами — программами-оболочками к отладчику gdb.
Как интерфейс к gdb можно использовать и редактор emacs!
Откроем программу из задания 1 в редакторе emacs.

Перейдем к отладчику, используя команду M-x gdb (напомним, что клавиша M — Meta — на большинстве современных клавиатур соответствует Alt). Набираемая команда отображается в нижней части экрана.

Редактор предложит запустить gdb с указанными ключами. Согласимся.

Теперь мы имеем возможность выполнять команды gdb. При этом команды можно не набирать, а использовать кнопки на панели инструментов.

Однако, emacs предоставляет и еще более комфортный интерфейс. В меню Gud выберем раздел Gud-MI, а в нем пункт Display Other Windows. Теперь наряду с консолью gdb мы видим исходный код, регистры и их значения, консоль ввода-вывода и другие окна.

Установим контрольную точку. Это можно сделать, кликнув левой кнопкой мыши слева от нужной строки исходного кода.

Запускаем программу, нажав на кнопку Run с зеленой иконкой Go. Выполнение программы будет остановлено перед строкой с установленной контрольной точкой. В окне Registers отображаются регистры и их текущие значения.


Кнопкой Next Line выполним строку программы. Обратите внимание, что ввод данных со стандартного потока ввода и вывод в стандартный поток вывода обеспечивается через окно input/output, а значения переменных изменяются соответственно выполняемым инструкциям. Напомним, что команда Step Line в большинстве случае эквивалентна, но если, в выражении присутствует вызов функции, то Step Line переходит к ее инструкциям (вход в функцию), а Next Line выполняет строку за один шаг в любом случае.

Выполним еще один шаг. Обратите внимание на изменения.

Выполним оставшуюся часть программы, нажав на Continue.

Покажем пример подмены значения регистра. Пусть в ходе работы программы регистр eax получил значение 2345.

Щелкнув средней кнопкой мыши по значению в окне Registers, мы можем подменить его, напечатав новое значение

Набираем новое значение и подтверждаем изменение клавишей Enter.

Выполняя программу далее, убедимся, что в вычислениях используется новое значение.