Это настоящие регистры, те же, которые использует сгенерированный компилятором asm. После сборки вывода компилятора в машинный код, нет разницы между тем, какие инструкции пришли из встроенного asm, и какими инструкциями они были созданы.компилятор.
Улучшает ли использование этих регистров (например, eax, ebx и т. д.)?
По сравнению с чем? Код, сгенерированный компилятором, уже использует регистры, поэтому нет, обычно вы не можете превзойти компилятор, используя встроенный asm, если вы точно не знаете, что делаете. (например, вы прочитали и поняли все Руководства по оптимизации Agner Fog , руководство по оптимизации Intel и т. Д. Дополнительные ссылки см. В https://stackoverflow.com/tags/x86/info).
C ++-коде для проверки гипотезы Коллатца быстрее, чем рукописная сборка - почему? - хороший пример того, что рукописный asm хуже, чем asm, сгенерированный компилятором.
Чем больше вы (или компилятор) храните переменные в регистрах, тем лучше, когда они часто меняются. Вы не можете избегайте использования регистров, потому что x86 не имеет инструкций «память в память», кроме нескольких специальных инструкций. Но вы можете (и должны) избегать использования памяти.
И даже в этом случае слабый синтаксис in-asm в MSVC делает невозможным передачу данных во встроенный asm без перенаправления их через память, поэтому вам нужно написать целый цикл в asm для уменьшениясъел эти накладные расходы.
См. В чем разница между 'asm', '__asm' и '__asm __'? и более подробно об этом, а также пример окончательного вывода компиляторадля простой функции, использующей встроенный asm MSVC, который также показывает сгенерированные компилятором инструкции.
(Вы можете сделать это самостоятельно для любого кода, используя https://godbolt.org/. См. также Как удалить "шум""из вывода сборки GCC / clang? для получения дополнительной информации о просмотре вывода компилятора.)
Большинство причин в https://gcc.gnu.org/wiki/DontUseInlineAsm применимы как к MSVC asm, так и к GNU C asm.