C/C++

Что такое вставка на ассемблере?

Программирую на С++ в Visual Studio и параллельно изучаю ассемблер на основе компилятора NASM. Говорят, что ассемблер нужно изучать, чтобы делать вставки в коде для его оптимизации. Я не могу понять как это работает. В моем представлении вставка на ассеблере это исполняемый файл exe, который вызывается в коде с++, правильно ли я понимаю? На каком компиляторе ассемблера лучше всего писать вставки в код? Как вообще работает вставка на ассемблере? Стыдно спрашивать, какой компилятор встроен в __asm?
Вставка на ассемблере - это когда код ассемблера пишут прямо в файле C++
По-хорошему ассемблер должен компилироваться отдельно и линковаться с C++ (или другим языком). Всю программу на ассемблере пишут только фанатики этого языка.
МЯ
Михаил Яковенко
58 065
Лучший ответ
В современных компиляторах особого смысла что-то оптимизировать, поэтому ассемблер используют только для таких действий, которые нельзя написать на С или С++, например, сохранение и восстановление регистров процессора, изменение режима работы и т. п. операций, которые обычно спрятаны внутри ядра операционной системы.
1. В микрософтовском x64 с++ компиляторе возможность делать ассемблерные вставки отключена и это правильно - такие исходники не переносимы на другие платформы и для них нет возможности настройки внешнего ассемблера. По прежнему можно компилить x64, x86 или дотнет приложение с отдельными ассемблеровскими файлами в проекте.
2. > В моем представлении вставка на ассеблере это исполняемый файл exe, который вызывается в коде с++, правильно ли я понимаю?
нет, не правильно
3. > На каком компиляторе ассемблера лучше всего писать вставки в код?
На компиляторе вставки не пишут. Вставки пишут на языке ассемблера, диалект которого зависит от целевой платформы проекта и используемого компилятора с/с++.
4. > Как вообще работает вставка на ассемблере?
Компилятор находит вставку по ключевому слову и в зависимости от архитектуры проекта компилирует ассемблеровский код в машинный, который в итоге вместе с плюсовым попадает в объектный файл, соответствующий текущему исходнику, т. е. в ту же единицу трансляции.
5. Стыдно спрашивать, какой компилятор встроен в __asm?
В микрософтовском компиляторе с++ для x86 вставку в плюсовый или сишный файл будет компилировать все тот же cl, отдельный asm/il-файл будет собран ml, ml64, ilasm или внешним, если настроены.
Дополню то, что MSVC компилятор поддерживает только MASM (Microsoft Macro Assembler) работающий только на Windows, а например GCC использует GAS (GNU Assembler).

Ассемблерная вставка может выглядеть так (реализация зависит от компилятора)
__asm__(
"mov eax, 2"
"mov ebx, 2"
"add eax, ebx"
);