Битва трансляторов Крис Касперски Хакер, номер #092, стр. 092-118-6 Наконец, ни у кого нет гарантий, что создатель FASM'а не утратит к нему интереса, а ведь без поддержки новых процессорных инструкций всякий транслятор обречен на медленное, но неизбежное вымирание. Открытость исходных текстов тут не поможет, ведь помимо них нужна еще и команда. Дожны быть «носители знания», способные удержать детали проекта у себя в голове, а тот факт, что FASM написан на себе самом, увы, читаемости листингам отнюдь не добавляет. NASM Транслятор NASM (расшифровывается как Netwide Assembler – расширенный ассемблер) возник тогда, когда не было ни одного хорошего свободного ассемблера под x86. FASM'а тогда еще не существовало. MASM/TASM стоили денег и работали только под MS-DOS/Windows. Единственный более-менее работающий транслятор под UNIX – GAS (GNU Assembler) — завязан на компилятор GCC и имеет такой ужасный синтаксис, что писать на нем могут только мазохисты. Остальные ассемблеры (типа A86, AS86) не позволяют писать 16/32-разрядный код или раздаются практически без документации. Кончилось это дело тем, что группа программистов во главе с Петром Анвином (Peter Anvin) решила разработать собственный ассемблер. MASM-подобный синтаксис, мощная макросистема (впрочем, несовместимая с MASM'ом), поддержка всей линейки x86 процессоров, вплоть до IA64 в x86-режиме, богатство выходных файлов (bin, aout, aoutb, coff, elf, as86, obj, win32, rdf, ieee), генерация отладочной информации в форматах Borland, STABS и DWARF2 вкупе с портами под MS-DOS, Windows, Linux и BSD обеспечили NASM'у неслабую популярность, но без ярко выраженного фанатизма, характерного для FASM'а. Количество ошибок в трансляторе довольно много, причем, в отличие от работающих продуктов (MASM/TASM), при «хитрых ошибках» NASM не падает, а генерирует ошибочный (по структуре) объектный файл. Плюс, конечно же, как это принято в Open Source-community, полное игнорирование баг-репортов, «неудобных» для авторов (разработчики даже утверждают, что ошибок в их трансляторе вообще нет, в смысле им не известен ни один). Тем не менее, в последней версии NASM'а, в зависимости от значения ключа -On, код может сгенерироваться в 2-х или более экземплярах или может пропасть весь экспорт (pubdef'ы). К минусам NASM'а можно отнести и отсутствие поддержки уникода, платформы AMD x86-64, формата отладочной информации CodeView и некоторые странности синтаксиса. В частности, команда «mov eax, 1» не оптимизируется, и транслятор умышленно оставляет место для 32-разрядного операнда. Если же мы хотим получить «короткий» вариант, то размер операнда необходимо специфицировать явно: «mov eax, byte 1», что очень сильно напрягает, или использовать опцию «-On» для автоматической оптимизации. Также необходимо принудительно указывать длину переходов short или near, иначе очень легко нарваться на ругательство «short jump out of range». Впрочем существует возможность настроить транслятор на генерацию near-переходов по умолчанию. Гораздо хуже, что NASM не помнит типы объявляемых переменных и не имеет нормальной поддержки структур. |