2012-04-11 19 views
5

Jeśli rozumiem to poprawnie, licznik programu wskazuje adres instrukcji do wykonania iw większości przypadków dodajesz cztery do licznika programu, aby przejść do następnego adresu instrukcji. Ale powiedz, że masz licznik programu, który wskazuje na słowo (np. Słowo 15) w pamięci i chcesz przejść do następnej instrukcji, czy powinieneś dodać 4 bezpośrednio do 15, aby uzyskać następną instrukcję? Wszelkie wyjaśnienia byłyby mile widziane.Licznik programu?

Odpowiedz

6

To coś nazywa się wskaźnikiem instrukcji. Gdy procesor dekoduje bieżącą instrukcję, znajduje liczbę bajtów, jaką zajmuje, i wie, ile dodać do aktualnej wartości wskaźnika instrukcji, aby przejść do następnej instrukcji, tak aby po wykonaniu instrukcji bieżącej procesor wiedział, co dalej.

Na przykład, procesor zaczyna się od wskaźnika instrukcji przechowującego wartość 15, jak w twoim przykładzie - wygląda na to, co dzieje się pod tym adresem, zdarza się, że jest instrukcja zajmująca 5 bajtów, nie ma problemu - dodaje 5 do bieżąca wartość i to daje 20, a więc wskaźnik instrukcji przechowuje teraz wartość 20, a procesor wykonuje następnie bieżącą instrukcję.

+1

Twój przykład ma sens, ale skąd pochodzi komputer + 4, jeśli to, co dodasz, zależy od tego, co jest pod tym adresem? – Ockham

+1

@ user28694: To zależy od procesora. Niektóre procesory mają zestaw instrukcji, w którym wszystkie instrukcje mają taką samą długość, więc mogą +4 bezwarunkowo. Niektóre procesory będą miały instrukcje o zmiennej długości i będą decydować, którą instrukcję mają do czynienia, używając pierwszych bajtów samej instrukcji. – sharptooth

+0

Nie są [instrukcje MIPS wszystkie 32-bitowe] (http://en.wikipedia.org/wiki/MIPS_architecture#MIPS_I_instruction_formats)? –

2

Nigdy nie przesuwasz bezpośrednio licznika programu - CPU robi to za Ciebie, wykonując program. Jako programista manipulujesz licznikiem programu, wykonując różne instrukcje skoku (warunkowe, bezwarunkowe, przeskoki do podprogramu, itp.) Jednym z przypadków, gdy musisz dodać offset do licznika programu, jest rozgałęzienie kodu niezależnego od pozycji. Jednak nawet w tym przypadku nie dodajesz rozmiaru instrukcji do licznika programu: zamiast tego podajesz przesunięcie miejsca, do którego chcesz przejść, wykonując "rozgałęzienie do adresu względnego".

+0

Co powiesz na to, kiedy piszemy bootloader, który przejdzie do kodu aplikacji, który znajduje się pod adresem 0x4000? W tym przypadku bezpośrednio zmieniamy licznik programu na bezwzględny adres. – eepty

+0

@eepty Tak mówi drugie zdanie: robisz to za pomocą instrukcji skoku, a nie instrukcji ustawiania rejestru. – dasblinkenlight