регистры встроенного блока сборки реальны или фальшивы? - PullRequest
0 голосов
/ 14 ноября 2018

Microsoft Visual Studio имеет функцию под названием «Встроенная сборка», которая дает вам возможность писать свои коды x86 в программе на c ++ внутри блока __asm.

Теперь у меня есть вопрос об этой функции.

Являются ли регистры в этом блоке реальными регистрами или просто какой-то виртуализацией из регистров?

Улучшает ли использование этих регистров (например, eax, ebx и т. Д.)?

1 Ответ

0 голосов
/ 14 ноября 2018

Это настоящие регистры, те же, которые использует сгенерированный компилятором 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.

...