Dlaczego rejestr ARM PC wskazuje na instrukcję po wykonaniu następnej?

Zgodnie z ARM IC.

W ARM state, wartością komputera jest adres bieżącej instrukcji plus 8 bajtów.

In Thumb state:

  • dla instrukcji B, BL, cbnz i CBZ, wartością komputera jest adres bieżącej instrukcji plus 4 bajty.
  • dla wszystkich innych instrukcji, które używają etykiet, wartością komputera jest adres bieżącej instrukcji plus 4 bajty, z bitem[1] wyniku wyczyszczonym do 0, aby to zrobić / align = "left" /

Mówiąc po prostu, wartość rejestru PC wskazuje na instrukcję po następnej instrukcji. Tego nie rozumiem. Zwykle (szczególnie na x86) rejestr licznika programu jest używany do wskazywania adresu następnej instrukcji do wykonania.

Więc, jakie są przesłanki leżące u tego podłoża? Może warunkowa egzekucja?

2 answers

To paskudny kawałek abstrakcji.

Oryginalny projekt ARM miał 3-stopniowy rurociąg (fetch-decode-execute). Aby uprościć projekt, zdecydowali się na odczyt komputera jako wartości aktualnie w liniach adresowych pobierania Instrukcji, a nie wartości aktualnie wykonywanej instrukcji sprzed 2 cykli. Ponieważ większość adresów względnych PC jest obliczana w czasie łącza, łatwiejsze jest, aby asembler/łącznik zrekompensował to przesunięcie 2-instrukcji, niż zaprojektować wszystkie logika "poprawienia" rejestru PC.

Oczywiście, to wszystko jest mocno na stosie "rzeczy, które miały sens 30 lat temu". Teraz wyobraź sobie, co jest potrzebne, aby utrzymać znaczącą wartość w tym rejestrze na dzisiejszym etapie 15+, wielokrotnych emisji, poza kolejnością potoków, a może docenisz, dlaczego trudno jest znaleźć projektanta CPU, który uważa, że ujawnienie komputera jako rejestru jest dobrym pomysłem.

Mimo to, na plusie, przynajmniej nie jest tak straszne jak delay slots . Zamiast, w przeciwieństwie do tego, co myślisz, warunkowe wykonanie każdej instrukcji było tak naprawdę tylko kolejną optymalizacją wokół tego przesunięcia wstępnego. Zamiast zawsze przyjmować opóźnienia w przepłukiwaniu rurociągów podczas rozgałęziania kodu warunkowego (lub wykonywania tego, co pozostało w potoku jak szalona osoba), możesz całkowicie uniknąć bardzo krótkich odgałęzień; rurociąg pozostaje zajęty, a dekodowane instrukcje mogą po prostu wykonywać jako NOPs, gdy flagi nie pasują*. W dzisiejszych czasach mamy skuteczne odgałęzienia i kończy się to bardziej przeszkodą niż pomocą, ale na 1985 było fajnie.

* "...zestaw instrukcji z największą liczbą NOP na planecie."

 43
Author: Notlikethat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-24 00:09:23

To prawda...

Jeden przykład jest poniżej: Program C:

int f,g,y;//global variables
int sum(int a, int b){
     return (a+b);
}
int main(void){
    f = 2;
    g = 3;
    y = sum(f, g);
    return y;
}

Skompilować do montażu:

    00008390 <sum>:
int sum(int a, int b) {
return (a + b);
}
    8390: e0800001 add r0, r0, r1
    8394: e12fff1e bx lr
    00008398 <main>:
int f, g, y; // global variables
int sum(int a, int b);
int main(void) {
    8398: e92d4008 push {r3, lr}
f = 2;
    839c: e3a00002 mov r0, #2
    83a0: e59f301c ldr r3, [pc, #28] ; 83c4 <main+0x2c> 
    83a4: e5830000 str r0, [r3]
g = 3;
    83a8: e3a01003 mov r1, #3
    83ac: e59f3014 ldr r3, [pc, #20] ; 83c8 <main+0x30>
    83b0: e5831000 str r1, [r3]
y = sum(f,g);
    83b4: ebfffff5 bl 8390 <sum>
    83b8: e59f300c ldr r3, [pc, #12] ; 83cc <main+0x34>
    83bc: e5830000 str r0, [r3]
return y;
}
83c0: e8bd8008 pop {r3, pc}
83c4: 00010570 .word 0x00010570
83c8: 00010574 .word 0x00010574
83cc: 00010578 .word 0x00010578

Zobacz powyższą wartość PC LDR--tutaj służy do załadowania adresu zmiennej f, g, y do r3.

    83a0: e59f301c ldr r3, [pc, #28];83c4 main+0x2c
    PC=0x83c4-28=0x83a8-0x1C = 0x83a8

Wartość PC jest tylko kolejną instrukcją wykonującą bieżącą instrukcję. ponieważ ARM używa instrukcji 32-bitowej, ale używa adresu bajtowego, więc + 8 oznacza 8-bitową długość dwóch instrukcji.

So attached ARM archi ' s 5 stage pipe linefetch, decode, execute, memory, writeback

Arm ' s 5 stage pipeline

Rejestr PC jest dodawany o 4 zegary, więc gdy instrukcja jest bąbelkowana do wykonania -- bieżąca Instrukcja, rejestr PC jest już 2 zegara minął! teraz jest + 8. to w rzeczywistości oznacza: PC wskazuje instrukcję "fetch", bieżąca instrukcja oznacza instrukcję "execute", więc PC oznacza następną, która zostanie wykonana.

BTW: zdjęcie pochodzi z książki Harrisa book of Digital Design and Computer Architecture ARM Edition [6]}

 0
Author: Harry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-10 11:21:34