Взаимозаменяеми ли са 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] във всеки възможен ъглов случай, така че асемблерът може би не трябва да оптимизира това вместо вас. :P - person Peter Cordes; 23.01.2020