2015-03-05 28 views
6

Jestem nowy w architekturze PowerPC i szukam niektórych zdemontowanych kodów z instrukcją bcctr. Mimo że instrukcja precyzuje, w jaki sposób działa instrukcja bcctr, nie wyjaśnia, z czego zwykle byłaby używana. Czy możesz wymyślić przykłady takich zastosowań i szczegółowo określić, jaka jest rola rejestru ctr? Domyślam się, że jest on używany dla pośrednich gałęzi (na przykład do wykonywania wywołań do wskaźników funkcyjnych lub vtables), ale cel "dekrement ctr register, a następnie branch to ctr" nie jest dla mnie wcale jasny. Podwójne użycie z rejestru jako licznika i jako adresu docelowego jest szczególnie mylące.Jaki jest cel instrukcji PowerPC `bcctr`?

+2

myślę, że to po prostu użyteczna alternatywa dla 'bclr', dzięki czemu można zachować cokolwiek adres znajduje się w' LR' i mieć alternatywny adres docelowy dla warunkowej oddział w CTR (oczywiście nie używaj dekrementacji w tym kontekście). Zobacz: http://www.mactech.com/articles/mactech/Vol.10/10.09/PowerPCAssembly/index.html –

+2

Tak, funkcja dekrementacji jest prawdopodobnie efektem ubocznym kodowania instrukcji, trudno sobie wyobrazić przypadek, w którym byłoby przydatne. – Jester

+0

Instrukcja sugeruje, że jest używana do obliczania instrukcji 'goto',' switch'. Może zapisać jedną lub dwie instrukcje, jeśli są sprytnie używane. – EOF

Odpowiedz

8

bcctr (i jego bezwarunkowa wariant, bctr) jest powszechnie stosowany do oddziałów do wskaźnika funkcji.

Zestaw instrukcji Power ISA ma dwie instrukcje¹, które są dostępne dla rozgałęzienia do adresu w rejestrze: blr (rejestr połączenia między oddziałami) i bctr (rejestr oddziału do rejestru kont). Używanie bctr oznacza, że ​​możemy zachować rejestr linków.

W tym przypadku nie ma nic szczególnego w korzystaniu z rejestru ctr tutaj - to tylko adres, na który się rozgałęziamy. W strumieniu pojawi się instrukcja mtctr, w której załadujemy adres do rejestru ctr.

Użyjesz też prawdopodobnie bctrl: ustawi to rejestr linków na aktualny adres + 4, a następnie rozgałęzi się do licznika. Umożliwia to powrót wywołania (za pomocą wskaźnika funkcji), poprzez rozgałęzienie z powrotem do rejestru połączeń.

¹: w trybie nieuprzywilejowanego, przynajmniej

2

patrząc na ISA POWER widzę:

bcctr = skok warunkowy do hrabiego Zarejestruj

Zastosowanie: bcctr B0, BI, BH

algorytmu:

cond_ok <- BO_0 | (CR_{BI+32} ≡ BO 1) 
if cond_ok then NIA <- {iea} CTR_{0:61} || 0b00 
if LK then LR <- {iea} CIA + 4 

BI + 32 określa bit rejestru warunku do przetestowania. Pole BO służy do rozstrzygnięcia oddziału zgodnie z opisem na rysunku 44. Pole BH jest używane zgodnie z opisem w Rysunek 46. Adres miejsca rozgałęzienia to CTR 0:61 || 0b00, przy 32-bitowym adresie docelowym oddziału o wysokim priorytecie ustawionym na 0 w trybie 32-bitowym. Jeśli LK = 1 to efektywny adres instrukcji następującej po instrukcji rozgałęzienia jest umieszczany w Rejestrze linków. Jeśli określono opcję "zmniejszenie i test CTR" (BO 2 = 0), formularz instrukcji jest nieprawidłowy.

Źródło: Power ISA Version 2.07