После вызова вызова Windows можно использовать только RAX, RCX, RDX, r8 и r9 без необходимости их сохранения (называемый изменчивым), а остальные называются энергонезависимыми (необходимо сохранить).Использовать регистры, не сохраняя их? (сборка)
Есть ли что-то не так, чтобы использовать регистры nonvolatiles, не сохраняя их? (Я часто делаю и до сих пор не встречал никаких проблем)
В соглашении о вызовах говорится, что для передачи целочисленных параметров используются только RCX, RDX, r8 и r9, а дополнительные - должны быть переданы в стек.
Есть ли недостатки в использовании r10 в качестве пятого параметра вместо стека? (зная, что память по крайней мере в 100 раз медленнее регистра, я стараюсь наилучшим образом использовать регистры)
Почему бы запрещающее соглашение останавливалось на 4 регистрах для передачи аргументов, когда имеется целый десяток дополнительных регистров?
Большинство функций, вероятно, имеют в среднем 4 или меньше параметров (просто предположение). Если вы использовали все доступные регистры для параметров (и ваша функция имела множество параметров), вам нужно было бы сохранить содержимое регистров (например, в стеке), прежде чем вы сможете использовать их в своей функции. Вероятно, 64-битные разработчики ABI искали баланс. Некоторые регистры использовались для ускорения доступа к функциональным параметрам, но оставляют регистры доступными без накладных расходов, связанных с их сохранением. –
Если вы используете энергонезависимые регистры, не сохраняя их, вам просто повезло, что ваша программа * кажется * работает. Это очень плохая практика и может привести к странному и прекрасному поведению позже. Если регистр отмечен как энергонезависимый, пожалуйста, за любовь к недоказанному всемогущему объекту или к следующему разработчику, которому может понадобиться поддерживать свой код. - Сохраняйте энергонезависимые регистры! –
@MichaelPetch. Достаточно ли достаточно, чтобы выталкивать все энергонезависимые регистры один раз при входе в основную процедуру и восстанавливать их в конце программы, или они должны быть нажаты и вытащены из стека каждый раз, когда они будут перезаписаны? –