
    Написание внешних модулей на Турбоассемблере

    Встраиваемые операторы BASM особенно подходят для небольших оптимизаций - 
несколько инструкций здесь, несколько там, или же в отдельной функции, которую 
необходюю ускорить. Более продуктивная работа на ассемблере требует 
дополнительных возможностей автономного Турбоассемблера (Turbo Assembler ), 
поставляемого Borland отдельно. 
    ТASM — замечательный продукт. Он может ассемблировать законченные 
приложения, написанные полностью на ассемблере. Он также может похвастаться 
множеством опций и директив: от простых инструкций резервирования памяти до 
сложных макросредств. В TASM имеется даже нечто подобное струкктуре класса, чем 
вы можете воспользоваться для написания объектно-ориентированных модулей 
на ассемблере. 
    Основная ценность TASM для программистов на С и C++ заключается, тем не
менее в создании объектных (с расширением .OBJ) модулей для, их компоновки 
вместе со скомпилированными программами. Вы  можете задать прототип функции 
С или C++, написать операторы, в которых она вызвается, и реализовать ее  
полностью на ассемблере. 
    Как и встраиваемый код BASM, внешние ассемблерные модули при написании
требуют внимательности и усидчивости. Всегда следует сначала удостовериться в том, 
что хлопоты окупятся сторицей, не  стоит переводить либо полностью, либо большую 
часть вашего кода в ассемблер в надежде повысить его производительность.. 
Определите критические участки кода и сконцентрируйтесь на том, чтобы заставить 
их работать как можно быстрее. 

    Использование утилиты H2ASH 

    Наиболее трудоемкий процесс в написании внешних ассемблерных модулей — 
разработка интерфейса с внутренней структурой данных программы. Ассемблер не 
предназначен для шишшивш аяврвяяй над структурами, массивами, строками С, а 
также классами C++, однако вы можете воспользоваться несколькими "трюками" для 
доступа к объектам этих и других типов из операторов ассемблер». 
    Утилита H2ASH.EXE, поставляемая вместе с TASM, может помочь вам сократить
время поиска ответа на вопрос: "Как мне получить доступ к программным данным 
с помощью ассемблерных инструкций и директив?" H2ASH преобразует объявления, 
содержащиеся в заголовочных файлах С и C++ в эквивалентные объявления TASM, 
хранимые в файлах с расширением .ASH (заголовочный файл ассемблера). Вы можете 
воспользоваться этими объявлениями для доступа к вашим программным данным или
же, руководствуясь ими, написать свои собственные директивы. 
    Утилита H2ASH поддерживает большинство конструкций С и классов C++. Она
обрабатыввает файлы #include и может пользоваться преимуществами идеального 
режима — расширенный MASM-подобный синтаксис TASM. К сожалению, H2ASH не 
распознает множественного наследояая, виртуальных базовых классов и 
шаблонов. Она также выдает предупреждения для элементов, подобных макросам, 
которые не транслируются так просто в директивы TASM. Следует рассматривать 
H2ASH как рекомендацию, а  не последнее слово в преобразовании объявлений С и 
C++ в ассемблерный код. Для 32-битового кода, сясяует пользоваться утилитой H2ASH32. 

   ЗАМЕЧАНИЕ

   Прочитайте текстовой файл TSM-UTIL.TXT , содержащийся в каталоге\DOC, для того чтобы 
больше узнать об утилите H2ASH.

    Продемонстрируем работу утилиты H2ASH, обработав с ее помощью несколько
образцов заголовочных файлов. Например, найдите заголовочный файл DB.H 
(листинг 11.15) из главы 11. Перейдите в каталог, содержащий этот файл, и 
введите команду h2ash db.h для создания нового файла DB.ASH с эквивалентными 
директивами TASM. Поскольку в DB.H включается заголовочный файл STDIO Н. 
утялита H2ASH преобразует содержащиеся в нем объявления так же, как в DB.H. 
(Во время выполнения H2ASH может предупреждать вас время от времени о макросах 
и других элементах, которые нельзя преобразовать.) 
    Несмотря на несовершенство результатов, утилита H2ASH мастерски справляется 
с преобразованием большинства объявлений. Например, в DB.H определяются 
следующие константы: 

   #define FALSE 0 
   #define TRUE 1 
   #define NAHELEN 30 
   #define ADDRLEN 30 
   #define CSZLEN 30 
   #define PHONELEN 13
    
    
    448     Часть IV. Разработка приложении 

