Регистры встроенного блока сборки реальны или фальшивы?
Microsoft visual studio имеет функцию под названием "Встроенная сборка", которая дает вам возможность писать свои x86-коды в программе на C++ внутри блока __asm.
Теперь у меня есть вопрос об этой функции.
Регистры в этом блоке - реальные регистры или просто какая-то виртуализация из регистров?
Улучшает ли использование этих регистров (например, eax, ebx и т. Д.)?
1 ответ
Это настоящие регистры, те же самые, которые использует сгенерированный компилятором asm. После сборки вывода компилятора в машинный код, нет разницы между тем, какие инструкции пришли из встроенного asm, и какими инструкциями исполнил компилятор.
Улучшает ли использование этих регистров (например, eax, ebx и т. Д.)?
По сравнению с чем? Генерируемый компилятором код уже использует регистры, поэтому нет, обычно вы не можете превзойти компилятор, используя встроенный asm, если вы точно не знаете, что делаете. (например, вы прочитали и поняли все руководства по оптимизации Agner Fog, руководство по оптимизации Intel и т. д. См. дополнительные ссылки в https://stackru.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.