2016-02-09 3 views
1

После вызова вызова Windows можно использовать только RAX, RCX, RDX, r8 и r9 без необходимости их сохранения (называемый изменчивым), а остальные называются энергонезависимыми (необходимо сохранить).Использовать регистры, не сохраняя их? (сборка)

Есть ли что-то не так, чтобы использовать регистры nonvolatiles, не сохраняя их? (Я часто делаю и до сих пор не встречал никаких проблем)

В соглашении о вызовах говорится, что для передачи целочисленных параметров используются только RCX, RDX, r8 и r9, а дополнительные - должны быть переданы в стек.

Есть ли недостатки в использовании r10 в качестве пятого параметра вместо стека? (зная, что память по крайней мере в 100 раз медленнее регистра, я стараюсь наилучшим образом использовать регистры)

Почему бы запрещающее соглашение останавливалось на 4 регистрах для передачи аргументов, когда имеется целый десяток дополнительных регистров?

+0

Большинство функций, вероятно, имеют в среднем 4 или меньше параметров (просто предположение). Если вы использовали все доступные регистры для параметров (и ваша функция имела множество параметров), вам нужно было бы сохранить содержимое регистров (например, в стеке), прежде чем вы сможете использовать их в своей функции. Вероятно, 64-битные разработчики ABI искали баланс. Некоторые регистры использовались для ускорения доступа к функциональным параметрам, но оставляют регистры доступными без накладных расходов, связанных с их сохранением. –

+4

Если вы используете энергонезависимые регистры, не сохраняя их, вам просто повезло, что ваша программа * кажется * работает. Это очень плохая практика и может привести к странному и прекрасному поведению позже. Если регистр отмечен как энергонезависимый, пожалуйста, за любовь к недоказанному всемогущему объекту или к следующему разработчику, которому может понадобиться поддерживать свой код. - Сохраняйте энергонезависимые регистры! –

+0

@MichaelPetch. Достаточно ли достаточно, чтобы выталкивать все энергонезависимые регистры один раз при входе в основную процедуру и восстанавливать их в конце программы, или они должны быть нажаты и вытащены из стека каждый раз, когда они будут перезаписаны? –

ответ

1

Написание этого вслух как ответ, поскольку я считаю, что @Michael Petch (и другие) следует подчеркнуть, для справки, с более чем комментарием.

Нарушение ABI Неплохая практика, это просто неправильно.
Не так, как такие вещи, как отсрочка висячего указателя, запись в память const и т. Д.


Смысл вполне очевиден: абонент, как правило, временные данные в энергонезависимую регистре, может быть индекс в строку, сумма, криптографической хэш или любой другой.


Если вы контролируете ABI, вы делаете правила; если вы этого не сделаете, вы этого не сделаете.

0

«Необходимо» для сохранения энергонезависимых регистров, чтобы вызывающий объект мог полагаться на него, чтобы оставить значения в этих регистрах неизменными.

Кроме того, подумайте, если вы напишете функцию, которая использует эти регистры в качестве параметров вместо стека, где бы вызывающий абонент должен хранить свои значения? Стек, в какой-то момент его нет.

Вы действительно можете вытолкнуть энергонезависимые регистры в стек и выталкивать их позже, если вам нужно.

Смежные вопросы