Являются ли регистры x64 взаимозаменяемыми в том смысле, что любая инструкция, которая работает с одной их комбинацией, будет работать с любой другой? Есть ли разница в производительности или какие-либо другие соображения, которые отличают их друг от друга, помимо названий?
Взаимозаменяемы ли RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, R8-R15?
Ответы (2)
Есть некоторые ограничения и некоторые отличия в кодировке.
rsp
(и esp
и т. Д.) Нельзя использовать в качестве индексного регистра. Есть много инструкций, которые принимают аргументы или возвращают результаты в определенных регистрах - например, инструкции сдвига переменных принимают свой аргумент только в 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
Я уверен, что есть еще кое-что, что я не могу вспомнить в данный момент: проконсультируйтесь с руководством по архитектуре, чтобы узнать подробности.
Нет. Хотя большинство инструкций x86, а также x86_64 могут использовать любые регистры в качестве GPR, некоторые инструкции работают только с определенным регистром или набором регистров, например movabs, mul, div ...
Более подробную информацию об использовании неявного реестра см. здесь
См. Также Взаимозаменяемы ли регистры данных EAX, EBX, ECX и EDX
#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