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