2015-03-05 19 views
6

Sono nuovo nell'architettura PowerPC e sto osservando un codice smontato con l'istruzione bcctr. Sebbene il manuale specifichi in che modo funziona l'istruzione bcctr, non spiega per che cosa verrebbe normalmente usata. Puoi trovare esempi di tali usi e dettagli su quale ruolo gioca il registro ctr? La mia ipotesi migliore è che sia usato per i rami indiretti (ad esempio per implementare le chiamate a puntatori di funzioni o vtables), ma lo scopo di "decrement ctr register e then branch to ctr" non mi è affatto chiaro. Il doppio uso del registro come contatore e come indirizzo di destinazione è particolarmente confuso.Qual è lo scopo dell'istruzione PowerPC `bcctr`?

+2

Penso che sia solo una valida alternativa alla 'bclr', in modo da poter mantenere ciò che l'indirizzo è in' LR' e avere un indirizzo di destinazione alternativa per un ramo condizionale in 'CTR' (ovviamente non si usa il decremento in questo contesto). Vedi: http://www.mactech.com/articles/mactech/Vol.10/10.09/PowerPCAssembly/index.html –

+2

Sì, la funzione di decremento è probabilmente un effetto collaterale della codifica delle istruzioni, difficile immaginare un caso in cui sarebbe utile – Jester

+0

Il manuale suggerisce che è usato per le dichiarazioni 'goto',' switch' calcolate. Potrebbe salvare un'istruzione o due se usata in modo intelligente. – EOF

risposta

8

Il bcctr (e la sua variante incondizionato, bctr) è generalmente utilizzato per sportelli a un puntatore a funzione.

Il set di istruzioni Power ISA ha due istruzioni¹ che sono disponibili per la diramazione a un indirizzo in un registro: blr (registro da diramazione a collegamento) e bctr (da ramo a registro contatore). L'utilizzo di bctr significa che possiamo conservare il registro dei collegamenti.

In questo caso, non c'è niente di speciale nell'usare il registro ctr qui - è solo l'indirizzo a cui ci rivolgiamo. Ci sarà un'istruzione mtctr prima nello stream, dove verrà caricato un indirizzo nel registro ctr.

Probabilmente verrà utilizzato anche lo bctrl: questo imposta il registro di collegamento sull'indirizzo corrente + 4, quindi esegue un ramo sul contatore. Ciò consente alla chiamata (tramite il puntatore della funzione) di tornare, passando nuovamente al registro dei collegamenti.

¹: in modalità non privilegiata, almeno

2

guardando l'ISA POWER, vedo:

bcctr = salto condizionato al conte Registrati

Usage: bcctr B0, BI, BH

Algoritmo:

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 specifica il bit del registro delle condizioni da testare. Il campo BO viene utilizzato per risolvere il ramo come descritto in nella Figura 44. Il campo BH viene utilizzato come descritto in Figura 46. L'indirizzo di destinazione della diramazione è CTR 0:61 || 0b00, con 32 bit di ordine superiore dell'indirizzo di destinazione del ramo impostato su 0 in modalità a 32 bit. Se LK = 1, l'indirizzo effettivo dell'istruzione che segue l'istruzione Branch viene inserito nel registro dei collegamenti. Se è specificata l'opzione "decremento e test CTR" (BO 2 = 0), il modulo di istruzioni non è valido.

Fonte

: Power ISA Version 2.07