2016-04-10 12 views
5

Według Intel w x64 następujące rejestry nazywane są rejestrami ogólnego przeznaczenia (RAX, RBX, RCX, RDX, RBP, RSI, RDI, RSP i R8-R15) https://software.intel.com/en-us/articles/introduction-to-x64-assembly.Dlaczego rpb i rsp są nazywane rejestrami ogólnego przeznaczenia?

W poniższym artykule napisano, że RBP i RSP są rejestrami specjalnego przeznaczenia (RBP wskazuje na podstawę bieżącej ramki stosu, a punkt RSP na górę bieżącej ramki stosu). https://www.recurse.com/blog/7-understanding-c-by-learning-assembly

Teraz mam dwa sprzeczne stwierdzenia. Oświadczenie firmy Intel powinno być zaufane, ale co jest poprawne i dlaczego RBP i RSP na ogół nazywają ogólny cel?

Dzięki za pomoc.

+4

Możesz używać obu jako rejestrów ogólnego przeznaczenia, co oznacza, że ​​zwykłe instrukcje arytmetyczne i logiczne działają z nimi dobrze. 'rbp' jest dość powszechnym celem, wskaźnik ramki jest po prostu konwencją. – Jester

+0

Każdy rejestr ma jakąś specjalność (z wyjątkiem R8-R15), dla niektórych instrukcji. Dla RSP jest to specjalne dla 'push' /' pop'/'call' /' ret', więc większość kodu nigdy go nie używa do niczego innego. Ale w kontrolowanym warunkowym (jak brak obsługi sygnału) nie * masz *, aby użyć go do wskaźnika stosu. na przykład możesz go użyć do odczytu tablicy w pętli z 'pop', np. [w tej odpowiedzi na kod-golfa] (https://codegolf.stackexchange.com/questions/133618/extreme-fibonacci/135618#135618). (Właściwie użyłem 'esp' w kodzie 32-bitowym, ale tę samą różnicę). –

+0

Zgaduję, że jeśli rozszerzysz definicję "specjalności" na kodowanie, nawet 'r13' jest trochę wyjątkowe, chociaż nie jest tak naprawdę funkcjonalne, że nadal możesz efektywnie używać każdego trybu adresowania (nawet jeśli zespół czasami wkłada ukryte zerowe przemieszczenie dla ciebie). – BeeOnRope

Odpowiedz

8

Ogólny cel oznacza, że ​​wszystkie te rejestry mogą być używane z dowolnymi instrukcjami wykonującymi obliczenia z rejestrami ogólnego przeznaczenia, podczas gdy, na przykład, nie można robić, co się chce, za pomocą wskaźnika instrukcji (RIP) lub rejestru flag (RFLAGS).

Niektóre z tych rejestrów zostały zaprojektowane do użycia w konkretnym celu, a często są. Najważniejsze z nich to RSP i RBP.

Jeśli musisz ich użyć do własnych celów, powinieneś zapisać ich zawartość przed zapisaniem czegoś innego w środku i przywrócić je do pierwotnej wartości, gdy skończysz.

+0

Niektóre kompilatory mogą nie używać wskaźników ramek, w takim przypadku RBP staje się komputerem ogólnego przeznaczenia. – rcgldr

+2

Zauważa się, że użycie 'rpb' jako wskaźnika ramki jest zasadniczo całkowicie _convention_ i tak naprawdę nie ma żadnego wsparcia CPU (w rzeczywistości, Windows 64 ABI pozwala ci użyć dowolnego rejestru jako wskaźnika ramki i nie preferuje' ' rbp'). Jest to bardzo odmienne od 'rsp', które jest ściśle związane z jego funkcją na poziomie sprzętowym, ponieważ jest niejawnie używane przez' push', 'pop' i przyjaciele. – BeeOnRope

+0

@BeeOnRope Dzięki za komentarz, odpowiedź zaktualizowana. – jlliagre

Powiązane problemy