    Эквивалентный оператор BASM выглядит несколько иначе: 

    asm mov ах,  сх;	/* Задать ах равным сх */ 

    Для документирования оператора asm следует использовать комментарии С или 
C++. Точка с запятой завершает оператор, однако ее присутствие необязательно. 
Вы можете написать оператор следующим образом: 

    asm mov ах,  сх	/* Задать ах равным сх */ 

    Можно также использовать комментарии C++: 

    asm mov ах,  сх	// Задать ах равным сх 

    Несколько операторов asm следует заключать в фигурные скобки. Каждый 
оператор asm — это оператор С, и правила, касающиеся составных операторов, 
относятся к asm в такой же степени, как и к if, while и друг гим конструкциям: 

    asm { 
    pushbp	// Запомнить Ьр в стеке 
    mov bp,  sp                  // Задать Ьр равным sp 
    ........ // Вставить другие операторы asm в этом месте 
    pop bp	// Восстановить Ьр 

    Можно воспользоваться точкой с запятой для разделения нескольких 
операторов в одной строке, что сохранит немного места в тексте вашей 
программы. Этот популярный прием следует использовать для запоминания и 
извлечения из стека необходимых регистров: 
    
    asm { 
    push ax; push bx; push ex; push dx 
    .... // Вставить другие операторы в этом месте 
    pop dx; pop сх; pop bx; pop ax; 
    } 

    Глобальные операторы asm, не принадлежащие ни одной из функций, 
ассемблируются в сегмент данных программы. Существует не так уж много 
ситуаций, в которых данный прием по-настоящему необходим, однако, если вы 
хотите вставить участок кода в сегмент данных, вы можете это сделать. Просто 
пишите ваши операторы asm вне реализаций функций. 
    Локальные операторы asm, которые располагаются внутри функций, 
ассемблируются BASM в поток кода в той же позиции. Компилятор предотвращает 
большинство конфликтов, возникающих между результатами BASM и близлежащими 
операторами C++, однако, чтобы быть уверенным в успехе, имеет смысл сравнивать 
исходный текст и результаты компиляции с помощью опции -S. 

    Оптимизация функций 

    Основная причина использования ассемблера в программах совместно с C++ — 
повышение производительности. Сначала с помощью ваших собственных тестов или 
даже лучше, с помощью тестов Turbo Profiler определите функции, выполнение 
которых отнимает большую часть общего времени выполнения. Оптимизация таких 
критических функций может значительно повысить производительность вашей программы. 

    ЗАМЕЧАНИЕ 

    Фредерик П. Брукс в книге The Mythical Man-Month (Мифический 
человеко-месяц) выдвигает предположение о том, что все проблемы быстродействия 
можно решить переводом от одного до пяти процентов программ в оптимизированный 
язык ассемблера. Оптимизация же остальных программ даст незначительные результаты. 

    Рассмотрим простой пример — функцию MySquare(), возвращающую квадрат целого значения: 

    int MySquare(int n) { 
    return n * n; 
    } 

    Скомпилируем программу с этой функцией с помощью опции -S. В результате 
получим следующий ассемблерный код (с добавленными поясняющими комментариями): 

	push	bp	;Сохранить регистр указателя базы 
   	mov	bp, sp	;Адресовать стек регистром Ьр 
	mov	bx, word ptr [bp+4]	;Записать int n в bx 
	mov	ax, bx	;Переслать bx в ах 
	Imul	bx	;Умножить ах на bx 
	jmp	short @2@58	;Перейти к следующей команде 
@2@58: 
	pop	bp	Восстановить регистр Ьр 
	ret		Вернуться в место вызова 


    444     Часть IV. Разработка приложений 
