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`?
Odpowiedz
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
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
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 –
Tak, funkcja dekrementacji jest prawdopodobnie efektem ubocznym kodowania instrukcji, trudno sobie wyobrazić przypadek, w którym byłoby przydatne. – Jester
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