2012-03-03 17 views
11

Mam problem ze zrozumieniem, w jaki sposób instrukcja działa w procesorze MIPS. Moje dwa pytania:
a) Jaka jest wartość przechowywana w R31 po "JAL": PC + 4 lub PC + 8?
b) Jeśli to naprawdę PC + 8, co dzieje się z instrukcją na PC + 4? Czy jest on wykonywany przed skokiem, czy też nigdy go nie wykonuje?

w Patterson i Hennessy (czwarta edycja), str 113:

„jump-and-link instrukcja: instrukcja, która skacze do i adres, a jednocześnie oszczędza adres poniższej instrukcji w rejestrze ($ ra w MIPS)”

«licznik programu (PC): rejestr zawierający adres instrukcji w programie wykonywane»

Po przeczytaniu tych dwóch stwierdzeń wynika, że ​​wartość SA w $ ra powinien być (PC + 4).

Jednak w danych referencyjnych MIPS (zielona karta), które pochodzi z książki, algorytm Jal wykładowym jest zdefiniowane tak:
„Jump and Link: jal: J: R [31] = PC + 8 ; PC = JumpAddr „

Ten website stwierdza również, że«to naprawdę PC + 8», ale dziwnie, po czym mówi, że ponieważ rurociąg jest zaawansowanym wątek” my zakładamy, że adres zwrotny jest PC +4 ".
Pochodzę z zespołu 8086, więc zdaję sobie sprawę, że istnieje duża różnica między powrotem do adresu a podążającym za nim, ponieważ programy nie będą działały, jeśli po prostu założę coś, co nie jest prawdą. Dzięki.

Odpowiedz

12

Adres w USD jest naprawdę PC + 8. Instrukcja bezpośrednio po instrukcji jal znajduje się w "branch delay slot". Jest wykonywany przed wprowadzeniem funkcji, więc nie powinien być ponownie wykonywany po powrocie funkcji.

Pozostałe instrukcje rozgałęzień na Mipsach mają również szczeliny rozgałęzień.

Gniazdo opóźnienia służy do zrobienia czegoś pożytecznego w czasie potrzebnym do wykonania instrukcji jal.

+0

Wielkie dzięki! Co dziwne, wiele stron internetowych przedstawia złe informacje (PC + 4). – ReimannCL

1

Mam to samo pytanie. Wyszukałem tę znakomitą odpowiedź Richarda, a także inny link, który chcę dodać tutaj.

Łącze jest http://chortle.ccsu.edu/AssemblyTutorial/Chapter-26/ass26_4.html z tym wspaniałym wyjaśnieniem podwójnego dodania 4 do komputera. Tak więc faktyczne wykonanie ma dwie dodatki: 1) newPC = PC + 4 przez potok i 2) kolejne dodanie $ ra = newPC + 4 przez instrukcję jal skutkującą efektywnym $ ra = (adres instrukcji jal) +8.

Powiązane problemy