Если проект C++ создан с настройками по умолчанию, то при компонов-
ке, скорее всего, возникнет ошибка – не найдена функция myfuncs. Для её
устранения нужно указать объектный файл в настройках компоновщика (в
Visual C++ это делается через меню Project – Properties – Linker – Command
Line, где в Additional Options нужно написать имя файла myfuncs.obj). Аль-
тернативный вариант – добавить файл myfuncs.asm в проект (но тогда, воз-
можно, придётся настраивать поддержку ассемблера в Visual Studio). В дру-
гих средах разработки можно также найти аналогичные настройки.
Контрольные вопросы и задания
1. Если в C++ не отключено декорирование имён, то какое имя будет поме-
щено в объектный файл для функции int func(int x, double y) ?
2. В ассемблерных вставках нельзя использовать директиву OFFSET. А как
ещё можно загрузить в регистр адрес переменной?
3. Каким образом процедура на ассемблере должна возвращать значение,
чтобы из C++ её можно было вызывать как функцию?
4. Пусть в ассемблерном модуле стоит директива .model flat, stdcall, и вы не хо-
тите её изменять. Каким образом вызывать процедуры этого модуля из C++?
5. Каким образом в используемом вами компиляторе C++ сгенерировать ас-
семблерный листинг результата компиляции программы?
6. Предложите несколько способов, которые можно использовать при опти-
мизации кода с целью ускорения его работы.
Задания по программированию
1. Решите на языке С++ задачу №37 из проверяющей системы (в ней тре-
буется подсчитать количество простых чисел в диапазоне от 1 до n, где n не
превышает 10 млн.) Ввод и вывод сделайте средствами C++, а само вычисле-
ние простых чисел выполните с помощью ассемблерной вставки. В качестве
алгоритма рекомендуется использовать решето Эратосфена (изучалось в кур-
се «структуры и алгоритмы обработки данных»). Постарайтесь максималь-
но эффективно реализовать данный участок кода.
2. Можно не только вызывать ассемблерные процедуры из языка высоко-
го уровня, но и наоборот. В данной задаче вам предлагается запрограммиро-
вать такой пример.
Напишите ассемблерный модуль, содержащий процедуру BubbleSort для
сортировки массива целых чисел методом пузырька. В качестве аргументов
этой процедуре должен передаваться адрес массива, количество элементов в
нём и адрес функции сравнения пар элементов.
Затем напишите на языке C++ функцию сравнения CmpFunc, которой пе-
редаётся два целых числа и она возвращает -1, если первое число меньше
второго, 0, если они равны, и +1, если первое число больше второго.
В функции main заполните массив случайными числами и вызовите про-
цедуру BubbleSort, передав ей адрес массива, число элементов и адрес функ-
ции CmpFunc. Отсортированный массив выведите на консоль.