Прежде всего, у вас есть для использования регистров, которые поддерживают инструкции, которые вы хотите использовать. Многие инструкции в x86 (и других архитектурах, хотя и в меньшей степени) имеют некоторые ограничения на то, как поддерживаются регистры.
Возьмите, например, определенные команды умножения и деления двойных регистров, которые, в частности, включают eax и edx в определенных случаях использования.
Далее вы хотите использовать эффективные регистры, т.е. регистры:
, для которых кодировки короче ( здесь Хорошая дискуссия на x64 по поводу длины инструкции). Короткие кодировки позволяют лучше использовать ресурсы кэша, что позволяет более эффективным программам более крупных программ работать.
, которые не обременены, то есть из-за соглашений о вызовах, то есть они не используют не несут дополнительных (определенных программным обеспечением / соглашением о вызовах) накладных расходов за их использование - если только эти накладные расходы уже не оплачены!
, которые являются конечными получателями создаваемых значений: например, если второй параметр, затем регистр, который соответствует второму значению, которое должно быть передано (снова в соответствии с соглашением о вызовах). Если мы можем поместить значение в правильный регистр (если это необходимо для передачи или возврата значений), тогда мы можем для go инструкции перемещения данных (или копирования).