Ассемблерная вставка - это возможность использовать в основном коде программы, написанном на языке высокого уровня, вставки из низкоуровневого кода. Это дает сразу несколько плюсов:
- Оптимизация. Один из самых главных плюсов. Возможность написать что-то на низком уровне, чтобы значительно упростить данную часть программы, убрав огромное количество ненужного кода, который бы появился при переводе компилятором кода с языка высокого уровня на более низкий.
- Прямой доступ к системе. Код на ассемблере позволяет выполнить прямое обращение к ядру операционной системы, что упростит программу и сделает ее более быстродействующей.
- Вызов специфических функций. Ассемблер дает возможность обращаться к специальным функциям процессоров различных типов, которые не предусмотрены в стандартных библиотеках.
Рассмотрим пример такой ассемблерной вставки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <iostream.h> //подключаем функцию вывода текста на экран cout int main() { long long a,b; asm{ CPUID RDTSC mov DWORD PTR[a], eax mov DWORD PTR[a + 4], edx } for(int i = 0; i < 10; i++) cout << " go next\n"; asm{ CPUID RDTSC mov DWORD PTR[b], eax mov DWORD PTR[b + 4], edx } long long c = b - a; cout << c; } |
В коде программы 2 вставки, каждая из них подсчитывает количество совершенных тиков таймера, собирает их в переменные a и b, и после этого на основе их разницы вычисляется затраченное на цикл количество тиков. Эти вызовы заняли сами по себе столь малое время и память, что их практически можно не брать в расчет. Чего бы не удалось достичь, будь это кодом на языке высокого уровня.
нет, ну такое не работает... Вы чего? Во первых не тот ассемблер, нужен AT&T, а не Intel. GCC это не понимает... Ну и там есть входные параметры и выходные... А тут нифига нет. Тут они непосредственно обращаются к внешним переменным. Так нельзя... Такие вставки даже сложнне чем ассемблерный модуль... Там оч сложный синтаксис. А это код очевидно под MSVS.
Да, всё правильно. Код в примере под MSVS. Ассемблерный код плохо переносится, поэтому, если нужна переносимость, то лучше без ассемблера.