    Для ассемблирования модулей порознь воспользуйтесь опцией TASM /ml для 
генерации глобальных имен с различением строчных и прописных букв. Например, 
введите команду tasm /ml timer для ассемблирования TIMER.ASM в TIMER.OBJ, 
скомпилируйте TESTTIME.CPP командой Ьсс -с testtime и скомпонуйте модули, 
введя bcc testtime.obj timer.obj. 
    Хотя это и не отражено в приведенных примерах, ассемблерные модули часто 
нуждаются в экспорте данных так же, как и кода. С помощью директивы DATASEG 
начните сегмент данных и задайте имя для глобальной переменной: 

		 IDEAL 
		MODEL small 
		DATASEG     ;Начать сегмент данных 
		PUBLIC _MyVar 
   _MyVar 		DW	0    ;Переменная размером в слово 
		CODESEG
    ;  В этом месте в модуле располагаются функции 
    END 

    В главном модуле C++ объявите переменную MyVar (без лидирующего символа 
подчеркивания) с помощью директивы extern: 

     extern int MyVar; 

    Теперь вы можете пользоваться переменной MyVar так же, как при ее 
определении в модуле C++. Нет неходимости в использовании опции "С" в 
директиве extern, как это делается с функциями, поскольку имена переменных 
C++ не модифицирует. 
    Для доступа к переменным C++ из внешних ассемблерных модулей следует 
воспользоваться директивой ЕXTRN. Например, если объявлена глобальная 
переменная 

    int Global; 

d ассблерном модуле можно сослаться на переменную Global как на 
внешнюю WORD _Global следующим образом:

    IDEAL 
    MODEL small 
    DATASEG 
    EXTRN _Global:WORD     ; Внешняя переменная размером в слово 
    ; Вставьте в этом месте другие объявления данных 
    CODESEG 
    ;Вставьте в этом месте функции модуля 
    END 

    В листинге 17.8 демонстрируется функция Timer() в альтернативном стиле 
MASM. Ассемблируйте этот модуль с помощью команды tasm /ml timer.rasm, затем 
скомпилируйте и скомпонуйте приложение так же, как и раньше, с помощью команды bcc 
testtime timer.obj. 

    Листинг  17.8.  TIMER.MSM (демонстрация функции Timer() в синтаксисе MASM) 

    1:   .MODEL small 
    3.   .CODE 
    4:    PUBLIC	_Timer 
    5: 
    6:    _Timer	PROC 
    7:   xor ax, ax 
    8:   mov es, ax 
    9:   mov di, 0046CH 
    10: mov ax, WORD PTR es[di] 
    11: mov dx, WORD PTR es[di+2] 
    12. ret 
    13: _Timer	ENDP 
    14: 
    15:  END


    Использование прерываний 

    Прерывания останавливают выполнение программы, затем какое-то время выполняются 
некоторые действия, вновь возобновляется выполнение программы с того же места, 
на котором она была прервана. Компютерные стройства могут вырабатывать сигнал 
прерывания, чтобы уведомить компьютер о таких внешних событиях, как нажатие на 
клавишу или щелчок мыши. Процедура обработки прерывания реагирует на сигнал 
прерывания и возвращает управление прерванной программе, выполняя инструкцию 
iret (interrupt return — возврат из 


    Глава 17 Оптимизация с помощью ассемблера     451 
