Компиляция — процесс преобразования текcта программы написанного на языке высокого уровня в машинный язык (здесь под понятие языка высокого уровня и ассемблер попадает). Программы, осуществляющие преобразование — компиляторы. В русскоязычной литературе еще можно встретить термин "трансляция", синоним "компиляции". Результат компиляции объектные файлы (*.obj). Линковка, она же компоновка, этап следующий за компиляцией. Компоновщик (также реда́ктор свя́зей, англ. linker, link editor) — программа, которая производит компоновку — принимает на вход один или несколько объектных модулей и собирает по ним исполняемый модуль. Для связывания модулей, компоновщик использует таблицы имён, созданные компилятором в каждом из объектных модулей. Такие имена могут быть двух типов: Определённые или экспортируемые имена — функции и переменные, определённые в данном модуле и предоставляемые для использования другим модулям Неопределённые или импортируемые имена — функции и переменные, на которые ссылается модуль, но не определяет их внутри себя Работа компоновщика заключается в том, чтобы в каждом модуле разрешить ссылки на неопределённые имена. Для каждого импортируемого имени находится его определение в других модулях, упоминание имени заменяется на его адрес. источник - ru.wikipedia.org В MASMе компиляцию творит утилита masm.exe (masm32.exe). Линковкой занимается link.exe. ml.exe - утилита, которая объединяет эти два процесса.
Как вариант. Пишешь несколько ф-ций, сохраняешь их в одном asm-файле. Компилируешь - получаешь obj-файл. Создаешь еще один файл, в котором прописываешь прототипы, сохраняешь, например, с расширением ".h". В другом аsm-файле, из которого ты собираешься дергать эти функции, прописываешь строчку "include <имя файла.h>. obj можно закинуть в *.lib с помощью утилиты lib.exe. Кстати, такая утилита есть не только в MASMе. В OpenWatcom есть тоже. Теперь, чтобы линкер нашел твою библиотеку, указываешь ее (путь к ней) в командной строке. Как? - можно спросить у самого линкера, либо глянуть в доках к пакету. И еще, при таких извращениях советую обращать внимание на модель памяти, имена сегментов и конвенции вызовов. Если все делать правильно, то можно писать один проект на разных языках, в разных средах и т.д.
Привет Barbos, пасиба за разъяснения, однако хотелось бы с прискорбием сообщить, что в папке bin masm'a10 нет masm.exe и утилиты lib.exe Есть 8 и 9 масмы, ктонить помнит там есть? и можно ли распаковать их не устанавливая? ... (наверное можно - на другой диск) Хорошая статья - "Как сделать инвокабельную библиотеку"... попробовать сделать dll и потом из неё lib? проблема - возникает идея, появляется функция, она отлаживается, всё ок, потом - валяется где-то, её искать надо... а хорошо бы - попроще как-нибудь добавлять новую функцию в библиотеку и прикручивать к коду, в случае необходимости..
Интересный момент. lib.exe могет как собирать, так и разбирать либы. а в пакете OpenWatcom есть утилита wdis.exe, с ее помощью можно декомпилить объектные файлы. Полезная штука. Правда под виндой я OpenWatcom не юзал, но в DOSовской версии точно есть.
Есть (в фасме) макросы которые делают импорт, надо только перечислить имена функций. Если макроса под рукой нет, то ченить типа Код (Text): data import dd 0,0,0,rva aUSER32, rva MessageBoxA, 0,0,0,0,0 end data MessageBoxA dd rva aMessageBoxA,0 aUSER32 db "USER32.DLL",0 aMessageBoxA db 0,0,"MessageBoxA",0 набрать недолго, да и сам макрос занимает строчек 8
он работает под вынь16, вынь32, дос, линь, кнх4, альфа, ппс, и еще куча всего. В сорцовый пакет входит много не входящего в стандартный бинарный.
driver IMHO Barbos не прав -- в masm.8-masm.10 компилятор ml, который при отсутствии ключа /c подключает компоновщик link.exe, если указан ключ /Bl<linker> будет использован какой-либо другой компоновщик. Компилятор masm.exe я нашел в MASM.610
вопрос так и не решён - возможно ли сделать утилиту, которая будет делать библиотеку из асм файлов, в которых прописаны функции - просто открываешь файл - нажимаешь кнопку - создать там библиотеку или добавить туда эту функцию,..... уверен что возможно... надо репу чесать...
driver Редактировать *.lib можно на уровне obj-файлов, которые в ней содержаться, т.е. добавить/доставть/удалить. Чтобы редактировать на уровне функций, тебе соответственно понадобятся исходные тексты данного obj-файла. Редактируешь исходник, компилишь новый *.obj, заменяешь в *.lib старый *.obj на новый. А что бы было то это достигается путем автоматизации процесса