    Утилита H2ASH переводит их в эквивалентные директивы TASM: 

    FALSE	EQU О 
    TRUE	EQU 1 
    NAMELEN	EOU 30 
    AODRLEN	EOU 30 
    CSZLEN	EQU 30 
    PHONELEN	EQU 13 

    Утилите H2ASH "по зубам" и более заковыристые объявления: 

    typedef struct record { 
      union { 
        long numrecs; 
        long custnum; 
      } info; 
      char name[NAMELEN]; 
      char addr[ADDRLEN]; 
      char csz[CSZLEN]; 
      char phone[PHONELEN]; 
      double balance; 
   } Record; 

       Эта структура легко преобразуется утилитой H2ASH, которая выдаст 
следующие эквивалентные директивы TASM: 

    tag$1UNION 
    numrecs	DD             ? 
    custnum	DD           ? 
    tag$1ENDS 

    record	STRUC 
    info tag$1 <>
    name DB 30 DUP ( ? ) 
    addr DB   30 DUP ( ? )
    csz DB     30 DUP ( ? )
    phoneDB  13 DUP ( ? )
    balance     DD   ?
    record	    ENDS 

    В дополнение к преобразованию существующих имен, таких, как numrecs и 
phone, утилита H2ASH создает все необходимые имена, подобные tag$l. Она также 
создает объявления, необходимые для вызова функций С или C++, для которых в 
программе есть прототипы: 

    GLOBAL С CreateDB	:NEAR 
    GLOBAL С OpenDB	:NEAR 
    GLOBAL С ReadRecord	:NEAR 
    GLOBAL С WriteRecord	:NEAR 


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

    Следующие программы демонстрируют, как писать внешние ассемблерные модули. 
Для изучения этого раздела вам необходимо приобрести и установить Turbo Assembler. 
Если же у вас нет TASM, пропустите весь материал  до раздела "Использование прерываний". 
    В листинге 17.5 вызывается функция Timer() для доступа к счетчику времени в 
компьютере, который хранится ло адресу 0000:046С и регулярно обновляется процедурой 
BIOS. Однако не спешите компилировать программу. Вы сделаете это позже, после 
создания внешнего модуля Timer(). 

    Листинг 17.5.  TESTTIME.CPP (проверка функции Tlmer())	

    1:   #include <conio.h> 
    2:   #include "timer.h" 
    3:
    4:  main() 
    5:  { 
    6:	while (!kbhit()) { 
    7:	  gotoxy( 1, wherey()); 
    8:	  cprintf("%ld" ,  Timer()); 
    9.  	} 
   10:  	getch(); // Ждать нажатия клавиши 
   11:	return 0; 
   12: }

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


    Глава 17. Оптимизация с помощью ассемблера	449     
    15 Освоение  C++4.5 
