Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2010, 13:38   #1
smileman
Пользователь
 
Аватар для smileman
 
Регистрация: 09.06.2008
Сообщений: 60
По умолчанию Создание exe-файла

Для удовлетворения любопытства, создаю минимодель простейшего компилятора. Пока остановился на стадии синтаксического разбора(выполняется операция "сдвиг-свертка"), следующим шагом будет построение триад, однако забегая вперед задумался над вопросом, как создать исполняемый файл. Прошу вкратце объяснить, как создается exe-шник, или даже просто com-файл. Заранее благодарен за внимание
smileman вне форума Ответить с цитированием
Старый 11.06.2010, 13:47   #2
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

разные ассемблеры это делают по разному, конкретизируй вопрос
по созданию компиляторов могу посоветовать
Уэзерелл Ч. "Этюды для программистов"
Книга американского специалиста по системному программированию — уникальный сборник задач по программированию из разных областей: моделирования, точности вычислений, обработки текстов, искусственного интеллекта, конструирования компиляторов. Большинство задач базируется на реальных и игровых ситуациях.
Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман Компиляторы. Принципы, технологии и инструментарий
рассматриваются главные принципы создания компиляторов, детально анализируются лексическая и синтаксическая составляющие, а также генерация кода. Особый акцент авторы сделали на вопросах оптимизации кода (в многопроцессорных системах в том числе). Очень большое внимание уделено также технологическим вопросам создания компиляторов и соответствующему инструментарию. Авторы подробно рассматривают такие темы, как теоретические вопросы языков программирования, построение вычислительных систем. Большое число практических примеров значительно упрощает процесс восприятия.
Д. Баррон "Ассемблеры и загрузчики", ниже предметный указатель из книги Баррона
Алфавитное индексирование 25 Блочная структура 57
Вектор переходов 34 Вложение макро 66
Второй просмотр 42 Вычисление адресов 43
Двоично-символический формат 10 Двоичный загрузчик 51
Директивы 15, 55 Значения по умолчанию 20, 8
Использования произведений таблица 36 Использования таблица 34
Ключевые слова 68 Линейный просмотр 24
Листинг 22 Литералы 14
Логарифмический поиск 25 Макрокоманда 64
Макроопределение 65 Макропроцессор 70
Метаассемблер 71 Метки 13
Метки в макро 69 Наложения 22 Настраивающий загрузчик 51
Область определения символов 17 Обработка текста 36
Объединитель 11 Определение символов 39
Первого просмотра блок-схема 41 Первый просмотр 39
Передач вперед таблица 61 Перекрестные ссылки 34
Перемешанные таблицы 26 Повторное ассемблирование 20
Полускомпилированная форма 10 Произведение символов 55
Псевдооперация 15 Распределение памяти 16, 56
Редактор связей 11, 52 Свободный формат 13
Связывающий загрузчик 56 Символьные выражения 31
Сравнение с образцами 62 Условное ассемблирование 19, 49
Условное ассемблирование в макро 69 Фиксированный формат 13
Форматы команд 47
Из реально существующих и активно развивающихся ассемблеров посмотрите исходники FASM'a

Последний раз редактировалось Mikl___; 11.06.2010 в 14:02.
Mikl___ вне форума Ответить с цитированием
Старый 11.06.2010, 14:01   #3
smileman
Пользователь
 
Аватар для smileman
 
Регистрация: 09.06.2008
Сообщений: 60
По умолчанию

Mikl___

На базе сделанного на настоящий момент, могу сказать, что мой "компилятор" может создать из исходного языка файл, подходящий для компиляции tasm'om.
Однако, хочется именно самому создатвать исполняемый файл.
Моя, так называемая, разработка несет только ознакомительный смысл- не более.
Прошу вкратце объяснить элементарный алгоритм создания exe-файла, если можешь.
Если нет, все равно премного благодарен за список лит-ры.
smileman вне форума Ответить с цитированием
Старый 11.06.2010, 14:16   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

smileman
Подготовленный текст является исходными данными для специальных программ, называемых ассемблерами. Задача ассемблеров – преобразовать текст программы в форму двоичных команд, которые могут быть выполнены микропроцессором. Если обнаружены синтаксические ошибки, то результирующий код создан не будет. Процесс создания исполняемого файла происходит в две стадии:
.asm --> .obj --> .exe/.dll/.com
На первой стадии (.asm --> .obj) из ассемблерного файла путем компиляции получается файлы промежуточного объектного кода, имеющего расширение .obj (при этом могут использоваться дополнительные inc-файлы). Файл с расширением .obj содержит оптимизированный машинный код, при условии, что не встретились синтаксические и семантические ошибки. Если в исходном файле с программой на языке ассемблера обнаруживаются ошибки, то программисту выдается список обнаруженных ошибок, в котором ошибки указываются с номером строки, в которой они обнаружены. Программист циклически выполняет действия по редактированию и компиляции до тех пор, пока не будут устранены все ошибки в исходном файле. На этом этапе уже возможно получение готовой программы, но чаще всего в ней не хватает некоторых компонентов. Если компилятор по какой-либо причине (неверно прописан путь к такому файлу или файл отсутствует) не может найти inc-файл, то выдается предупреждение и obj-файл получен не будет.
Ассемблирование, как правило, проходит в два приема. При первом проходе переводятся мнемонические команды, десятеричные числа и символы в соответствующие машинные коды, подсчитывается, сколько какая команда занимает места, обнаруженные имена, введенные пользователем (константы, метки, переменные) их тип и числовое значение записывается в таблицу с каких адресов начинаются процедуры, адреса меток, адреса начала/конца сегментов и т. д., при втором проходе подставляются адреса начала процедур, заменяются названия меток на адреса.
В результате ассемблирования получается так называемый «объектный файл». В качестве дополнительной возможности ассемблер может создать файл листинга программы.
Обычно для получения файлов объектного кода необходимо выполнить соответствующую программу ассемблера (программы MASM.EXE и ML.EXE фирмы Microsoft и TASM.EXE или TASM32.EXE фирмы Borland) указав в командной строке имя файла с текстом программы. Например, если у текстового файла с исходным текстом программы название prog.asm
ml prog.asm
или
tasm prog.asm
Эта форма вызова является минимально необходимой, кроме имени текстового файла, необходимо указывать опции ассемблирования. Более подробную информацию об опциях программы ассемблирования следует искать в документации к этим программам.
Компоновка программы
Следующая стадия (.obj --> .exe/.dll/.com), называется линковкой или компоновкой и служит для замещения символьных имен, используемых программистом на реальные адреса.
Сравните шестнадцатеричное содержимое OBJ и EXE файла, который у вас получился. В EXE-файле присутствует та же последовательность байтов, что и в OBJ-файле. Но помимо этого еще присутствует: имя ассемблированного файла, версия ассемблера, «имя собственное» сегмента и так далее.
Это «служебная» информация, предназначенная для тех случаев, когда ваш исполнимый файл вы хотите собрать из нескольких. При разработке больших приложений исходный текст состоит, как правило, из нескольких модулей (файлов с исходными текстами), потому что хранить все тексты в одном файле неудобно – в них сложно ориентироваться. Каждый модуль по раздельности компилируется в отдельный файл с объектным кодом. В каждом из этих файлов прописаны свои сегменты кода/данных/стека, которые затем надо объединить в одно целое. А исполнимый файл нам нужно получить только один – с единым сегментом кода/данных/стека. Именно это LINK и делает: завершает определение адресных ссылок и объединяет, если это требуется, несколько программных модулей в один. И этот один у нас и является исполнимым
Кроме того, к нашим модулям надо добавить машинный код подпрограмм, реализующих различные стандартные функции (например, вычисляющих математические функции SIN или LN). Такие функции содержатся в библиотеках (файлах со стандартным расширением .LIB), которые либо поставляются вместе с компилятором, либо создаются самостоятельно. Поэтому процесс подготовки обязательно включает в себя этап компоновки, когда определяются все неизвестные при раздельном ассемблировании адреса совместно используемых переменных или функций.
Процесс объединения объектных модулей в один файл осуществляется специальной программой-компоновщиком или сборщиком (программа LINK.EXE фирмы Microsoft и TLINK.EXE фирмы Borland), которая выполняет связывание объектных модулей и машинного кода стандартных функций, находя их в библиотеках, и формирует на выходе работоспособное приложение – исполнимый код для конкретной платформы.

Последний раз редактировалось Mikl___; 11.06.2010 в 14:20.
Mikl___ вне форума Ответить с цитированием
Старый 11.06.2010, 14:17   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Исполнимый код – это законченная программа с расширением COM, DLL или EXE, которую можно запустить на компьютере с установленной операционной системой, для которой эта программа создавалась. Имя исполняемого файла задастся именем первого .OBJ файла:
link prog1.obj prog2.obj
Содержимое объектного файла анализируется компоновщиком. Он определяет, есть ли в программе внешние ссылки, то есть, содержит ли программа команды вызовов процедур, находящихся в одной из библиотек объектных модулей (link library). Компоновщик находит эти ссылки в объектном файле, копирует необходимые процедуры из библиотек, объединяет их вместе с объектным файлом и создает исполняемый файл (executable file). В качестве дополнительных возможностей компоновщик может создать файл перекрестных ссылок, содержащих план полученного исполняемого файла.
Загрузка программы
Компонент операционной системы, называемый загрузчиком (loader), считывает данные из исполняемого файла, загружает программу в память и передает управление по адресу точки входа. В результате программа начинает выполняться.
В тех случаях, когда при написании новой программы на языке ассемблера требуется лишь незначительные изменения машинных кодов, иногда быстрее и удобнее внести изменения непосредственно в исполняемый файл, а не проходить всю цепочку редактирования исходной программы и осуществлять ее повторную трансляцию с внесенными изменениями. Для этого существуют специальные шестнадцатеричные редакторы (типа hiew -Hacker Viewer), которые позволяют рассматривать файлы с бинарным (машинным) кодом в виде последовательности ассемблерных команд. Эту же технологию применяют в тех случаях, если исходный текст программы не доступен (взлом программы).

Это взгляд со стороны программиста, со стороны разработчика компилятора все наверное по-другому

Последний раз редактировалось Mikl___; 11.06.2010 в 14:33.
Mikl___ вне форума Ответить с цитированием
Старый 11.06.2010, 15:54   #6
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

Учи PE формат и вперед. На васме есть пример собрания исполняемого файла вручную.
Д'якон вне форума Ответить с цитированием
Старый 19.06.2010, 08:23   #7
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

В целом Miki___ дал довольно исчерпывающий ответ.
Добавлю. Если компилятор совсем уж простой, то можно обойтись и без .obj файла. Для перевода в exe достаточно иметь таблицу соответствия мнемонических команд с машинными. Но два прохода компилятор должен делать обязательно, так как при первом проходе компонуется машинный код без адресов переходов, а на втором проходе они расставляються в соответствии с таблицей меток.
После этого производится запись файла в двоичном формате с расширением exe.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 19.06.2010 в 08:26.
Smitt&Wesson вне форума Ответить с цитированием
Старый 21.06.2010, 03:44   #8
ir0407
Пользователь
 
Аватар для ir0407
 
Регистрация: 16.04.2007
Сообщений: 14
По умолчанию

Исполняемый файл может быть в двух форматах. COM и EXE. DLL-это, можно сказать, разновидность EXE. Разница между COM и EXE в том, что:
1. В EXE-файлах присутствует заголовочная часть с некоторым набором служебных таблиц для ОС(размером 512 байт или более), а COM-файлы заголовка не имеют и представляют собой обычный бинарник предназначенный для работы в пределах одного сегмента памяти DOS.
2. Стандартный размер COM-файла не может быть более 64 кБ, а EXE-файл может иметь любой объем.

Чтоб создать EXE-файл нужно знать структуру MZ и PE заголовков исполняемых файлов. Прочесть о них можно например вот здесь и здесь.
ir0407 вне форума Ответить с цитированием
Старый 21.06.2010, 11:36   #9
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Цитата:
Сообщение от ir0407
В EXE-файлах присутствует заголовочная часть с некоторым набором служебных таблиц для ОС(размером 512 байт или более)
Это компилятор MASM создает для EXE DOS программ заголовок 512 байт, а другие компиляторы могут и уменьшить заголовок
В аттаче ЕХЕ, которое выводит Hello, world! созданное компилятором WASM
Вложения
Тип файла: rar WASM.rar (954 байт, 52 просмотров)
Mikl___ вне форума Ответить с цитированием
Старый 04.11.2010, 13:35   #10
whw
Новичок
Джуниор
 
Регистрация: 04.11.2010
Сообщений: 1
По умолчанию из asm в exe

Подскажите Please?
Есть файл qwe.asm созданный IdaPro после открытия ей некоторого .exe который был создан программой LabView.
Допустим он подкорректирован ,теперь нужно снова получить .exe файл 32 bit.
Есть установленная программа MASM32 вместе с WINASM ,
Есть также PE EXPLORER 1.99 для извлечения .res файлов ,если это нужно.
Другие программы не ставятся у меня win7 64 bit.
В командной строке задаю C:\masm32\bin>ml /c /coff qwe.asm
qwe.asm- лежит в папке bin , выдаёт кучу ошибок ,скриншот прилагаю.
Изображения
Тип файла: jpg scrin.jpg (282.3 Кб, 148 просмотров)

Последний раз редактировалось whw; 05.11.2010 в 09:33. Причина: опечатка
whw вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание exe файла anton23 Win Api 6 21.06.2012 11:30
Создание exe-файла palach777 Помощь студентам 5 05.06.2010 16:39
создание автономного exe-файла m_kostik Общие вопросы C/C++ 1 23.02.2010 20:32
создание exe-файла Игорь11071990 Помощь студентам 0 06.12.2009 12:04
Создание исполняемого EXE-файла Jean-Esther Помощь студентам 5 03.03.2009 21:52