Domanda

Ho una domanda da compiti a casa.

Ho un'istruzione BNE a 0x88888888 e ho bisogno di dire qual è la gamma di salto legale.

La mia teoria è che l'offset mi dice che posso andare:

    .
  • da 0x8888888 - 4 * 2 15
  • a 0x888888888 + 4 * (2 15 -1)

    Io davvero non capisco perché e come funziona, qualcuno può spiegarlo?

È stato utile?

Soluzione

Trova un riferimento di istruzioni che mostra la codifica delle istruzioni come http://en.wikipedia.org/wiki / MIPS_Architecture

000100ss sssttttt CCCCCCCC CCCCCCCC
.

S e T tengono paragonati i registri, 5 bit, dà registro 0 - 31 ciascuno. I 16 bit inferiori sono l'offset in unità di istruzioni.

(per i MIPS) da una prospettiva di programmatori Assumi il contatore del programma è 1 istruzioni in anticipo, 4 byte. Quindi per indirizzo 0x88888888 I tuoi calcoli con l'indirizzo 0x88888888 + 4= 0x8888888c.

La codifica delle istruzioni utilizza il complemento TwoS, quindi il tuo ramo in avanti massimo è 0x7FFF Istruzioni 0x7FFF << 2= 0x1FFFC Bytes. Il ramo massimo di arretrato è 0x8000 quando il segno esteso è 0xFFFF8000, in Bytes 0xFFFF8000 << 2= 0xFFFE000

0x8888888C + 0x0001FFC = 0x888A8888
0x8888888C + 0xFFFE000 = 0x88868888
.

La regolazione del contatore del programma è piuttosto semplice da capire da uno smontaggio del codice di lavoro generato da un assemblatore di lavoro. (più il riferimento alle istruzioni almeno abbastanza per vedere il numero di bit che devi usare).

00002030 <back>:
    2034:
    2038:   1443fffd    bne v0,v1,2030 <back>
    203c:   00000000    nop
    2040:   1443fffb    bne v0,v1,2030 <back>
    2044:   00000000    nop
    2048:   1443fff9    bne v0,v1,2030 <back>
    204c:   00000000    nop
    2050:   14430003    bne v0,v1,2060 <fore>
    2054:   00000000    nop
    2058:   14430001    bne v0,v1,2060 <fore>
    205c:   00000000    nop

00002060 <fore>:
.

0x1443FFD e 0x1443FFFB sono 8 byte a parte e due istruzioni a parte. La differenza tra gli offset nell'istruzione è un conteggio di 2 in modo che implica la codifica è in unità di istruzioni / parole non byte né halfwords. Il riferimento in avanti è più facile da fare prima 0x2060 - 0x2050 è 0x10 bytes, che è 4 istruzioni. L'offset è 3 istruzioni, 0x2060 meno 3 istruzioni sono 0x2054 Le istruzioni successive dopo quella che fa la BNE (rende molto senso, pipeline o meno il PC è solitamente almeno nelle istruzioni successive entro il tempo che si esegue l'esecuzione e Quando esegui la matematica con il PC il PC ha già fatto questo andare avanti). Questo può essere verificato con gli altri tre rami. 0x2058 dice la testa di istruzioni di Branch One se non uguale, il che implica che il PC sia 0x205C, uno a venire. 0xFFFD, invertire e aggiungere 1= 2 + 1= 3 Pertanto andare indietro Tre e arrivare a 0x2030 È necessario essere a 0x203C, uno davanti all'istruzione codificata. 0xFFFB 4 + 1= 5, 5 istruzioni Indietro, il che significa che si avvia a 0x2044, l'istruzione dopo il ramo codificato con un 0xFFFB.

Altre istruzioni Imposta che non è così semplice. Il braccio è abbastanza semplice, sia la modalità del braccio che del pollice che si assumono due istruzioni in anticipo dall'indirizzo contenente l'inizio dell'istruzione, quindi in modalità thumb 4 byte, modalità ARM 8 Bytes. Anche il pollice2 che è principalmente istruzioni a 32 bit, il contatore del programma di una prospettiva di programmatori è 2 istruzioni in anticipo.

Set di istruzioni della lunghezza della parola variabile, che non sono regolari come braccio, MIPS, ecc. L'hardware utilizza una regola fissa come con il pollice2 nonostante l'indirizzo effettivo sia prefettato. Oppure devi sapere dalla dimensione dell'istruzione in cui il contatore del programma sarà e usa questo riferimento. Si noti che forse il primo tagliato a questi processori il contatore del programma era giusto in una o due istruzioni in anticipo quando eseguiti, ma il tubatorio sepolto in molti di loro (braccio, MIPS) l'indirizzo di prefetch potrebbe essere regolare ma molto più avanti o quando Vai superscalar con la previsione del ramo, i recupes possono essere ovunque, anche i registri toccanti nell'hardware (buoni progetti hardware non modificano nulla su una semplice lettura, scrive solo, non leggi un valore e un point automatico un puntatore hardware per esempio, almeno per hardware PCI (E) che può essere utilizzato su molti processori).

Altri suggerimenti

Questo riferimento di spin dice:

.

Istruzioni per i rami Utilizzare un campo di offset a 16 bit firmato;Quindi possono saltare 2 15 -1 istruzioni (non byte) in avanti o 2 15 istruzioni all'indietro.

Poiché le istruzioni sembrano essere sempre larghe 4 byte, il tuo ragionamento appare giusto, ma hai scambiato i segni.

Il ramo massimo di arretrato (verso un indirizzo inferiore) è di 2 15 -1 istruzioni, I.e. 32767 istruzioni o 131068 byte, in modo da poter raggiungere 0x88888888 - 131068 = 8886888c.

Allo stesso modo, il ramo di forward massimo ti porta a 0x88888888 + 131072 = 0x888a8888.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top