Взаимозаменяемы ли RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, R8-R15?

Являются ли регистры x64 взаимозаменяемыми в том смысле, что любая инструкция, которая работает с одной их комбинацией, будет работать с любой другой? Есть ли разница в производительности или какие-либо другие соображения, которые отличают их друг от друга, помимо названий?


person Alexei Averchenko    schedule 28.12.2013    source источник
comment
На самом деле я не уверен, но смотрю на Руководства Intel очень помогут. Они немного объемны, но они рассказывают вам все, что вы можете / не можете делать с каждой инструкцией, а также дают предложения по оптимизации.   -  person chbaker0    schedule 28.12.2013


Ответы (2)


Есть некоторые ограничения и некоторые отличия в кодировке.

rspesp и т. Д.) Нельзя использовать в качестве индексного регистра. Есть много инструкций, которые принимают аргументы или возвращают результаты в определенных регистрах - например, инструкции сдвига переменных принимают свой аргумент только в cl.

Арифметические инструкции (и test) имеют короткие кодировки для rax плюс 32-битное немедленное:

8:  48 05 ff ff 00 00       add    $0xffff,%rax
e:  48 81 c3 ff ff 00 00    add    $0xffff,%rbx

Я уверен, что есть еще кое-что, что я не могу вспомнить в данный момент: проконсультируйтесь с руководством по архитектуре, чтобы узнать подробности.

person gsg    schedule 28.12.2013

Нет. Хотя большинство инструкций x86, а также x86_64 могут использовать любые регистры в качестве GPR, некоторые инструкции работают только с определенным регистром или набором регистров, например movabs, mul, div ...

Более подробную информацию об использовании неявного реестра см. здесь

См. Также Взаимозаменяемы ли регистры данных EAX, EBX, ECX и EDX

person phuclv    schedule 28.12.2013
comment
Также существуют различия в режимах адресации (например, отсутствует [rbp]. Вы должны подделать его с помощью [rbp + 0]), и старшие регистры кодируют менее компактно. - person Raymond Chen; 28.12.2013
comment
Кроме того, при адресации с помощью (r) bp или (r) sp в качестве селектора сегмента по умолчанию используется SS, а в других регистрах используется DS. Они не обязательно равны. - person PMF; 28.12.2013
comment
@PMF: в 64-битном режиме единственная разница в том, что вы можете получить исключение #SS вместо #GP, если попытаетесь удалить неканонический адрес из RBP или RSP. В 64-битном режиме база сегмента для SS и DS фиксируется на 0 и полностью игнорируются префиксы переопределения сегментов SS и DS. См. Почему использование переопределения сегмента DS: недопустимо в 64-битном режиме?. Но да, это означает, что [rbp + rdi*1 + 0] не совсем то же самое, что [rdi + rbp*1] во всех возможных угловых случаях, поэтому ассемблер, возможно, не должен оптимизировать это для вас. :П - person Peter Cordes; 23.01.2020