С помощью ключевого слова asm в С++-программу встраивается код, написанный на языке ассемблера.
Несмотря на то что C++ — всеобъемлющий и мощный язык программирования, возможны ситуации, обработка которых для него оказывается весьма затруднительной. (Например, в C++ не предусмотрена инструкция, которая могла бы запретить прерывания.) Чтобы справиться с подобными специальными ситуациями, C++ предоставляет средство, которое позволяет войти в код, написанный на языке ассемблера, совершенно игнорируя С++-компилятор. Этим средством и является инструкция asm, используя которую можно встроить ассемблерный код непосредственно в С++-программу. Этот код скомпилируется без каких-либо изменений и станет частью кода вашей программы, начиная с места нахождения инструкции asm.
Общий формат использования ключевого слова asm имеет следующий вид.
asm ("код");
Здесь элемент код означает инструкцию, написанную на языке ассемблера, которая будет встроена в программу. При этом некоторые компиляторы также позволяют использовать и другие форматы записи инструкции asm.
asm инструкция;
asm инструкция newline
asm {
последовательность инструкций
}
Здесь элемент инструкция означает любую допустимую инструкцию языка ассемблера. Поскольку использование инструкции asm зависит от конкретной реализации среды программирования, то за подробностями обратитесь к документации, прилагаемой к вашему компилятору.
На момент написания этой книги в среде Visual C++ (Microsoft) для встраивания кода, написанного на языке ассемблера, предлагалось использовать инструкцию _ _asm. Во всём остальном этот формат аналогичен описанию инструкции asm.
Осторожно!Для использования инструкции asm необходимо обладать доскональными знаниями языка ассемблера. Если вы не считаете себя специалистом по этому языку, то лучше пока избегать использования инструкции asm, поскольку неосторожное ее применение может вызвать тяжелые последствия для вашей системы.
Спецификация компоновкиСпецификатор компоновки позволяет определить способ компоновки функции.
В C++ можно определить, как функция связывается с вашей программой. По умолчанию функции компонуются как С++-функции. Но, используя спецификацию компоновки, можно обеспечить компоновку функций, написанных на других языках программирования. Общий формат спецификатора компоновки выглядит так:
extern "язык" прототип_функции
Здесь элемент язык означает нужный язык программирования. Все С++-компиляторы поддерживают как С-, так и С++-компоновку. Некоторые компиляторы также позволяют использовать спецификаторы компоновки для таких языков, как Fortran, Pascal или BASIC. (Эту информацию необходимо уточнить в документации, прилагаемой к вашему компилятору.)
Следующая программа позволяет скомпоновать функцию myCfunc() как С-функцию.
#include
using namespace std;
extern "C" void myCfunc();
int main()
{
myCfunc();
return 0;
}
// Эта функция будет скомпонована как С-функция.
void myCfunc() {
cout << "Эта функция скомпонована как С-функция.\n";
}
На заметку.Ключевое слово extern — необходимая составляющая спецификации компоновки. Более того, спецификация компоновки должна быть глобальной; ее нельзя использовать в теле какой-либо функции.
Используя следующий формат спецификации компоновки, можно задать не одну, а сразу несколько функций.
extern "язык" {
прототипы_функций
}
Спецификации компоновки используются довольно редко, и вам, возможно, никогда не придется их применять. Основное их назначение — позволить применение в С++-программах кода, написанного сторонними организациями на языках, отличных от C++.
Операторы указания на члены ".*" и "->*"Операторы указания на член позволяют получить доступ к члену класса через указатель на этот член.