2012-04-11 4 views
5

Если я правильно понимаю это, счетчик программ указывает на адрес исполняемой команды и в большинстве случаев вы добавляете четыре к счетчику программ, чтобы перейти к следующему адресу инструкции. Но скажите, что у вас есть счетчик программ, указывающий на слово (например, слово 15) в памяти, и вы хотите перейти к следующей инструкции, предположите ли вы добавить 4 непосредственно к 15, чтобы получить следующую инструкцию? Любое объяснение будет оцененоСчетчик программ?

ответ

6

Эта вещь называется указателем инструкции. Как только процессор декодирует текущую инструкцию, он найдет, сколько байтов он занимает, и знает, сколько добавить к текущему значению указателя инструкции, чтобы перейти к следующей команде, чтобы при выполнении текущей команды процессор знал, что делать дальше.

Так, например, процессор начинается с указателя на указатель, сохраняющего значение 15, как в вашем примере - он выглядит, что происходит с этим адресом, бывает инструкция, занимающая 5 байтов, без проблем - она ​​добавляет 5 к текущее значение, и это дает 20, и поэтому указатель инструкции теперь сохраняет значение 20, а затем процессор выполняет текущую инструкцию.

+1

Ваш пример имеет смысл, но откуда стоит ПК + 4, если то, что вы добавляете, зависит от того, что на этом адресе? – Ockham

+1

@ user28694: Это будет зависеть от процессора. Некоторые процессоры имеют набор команд, где все команды имеют одинаковую длину, поэтому они могут +4 безоговорочно. Некоторые процессоры будут иметь инструкции переменной длины, и они решат, с какой инструкцией они справляются с использованием первых байтов самой инструкции. – sharptooth

+0

Не [инструкции MIPS все 32-разрядные версии] (http://en.wikipedia.org/wiki/MIPS_architecture#MIPS_I_instruction_formats)? –

2

Вы никогда не запускаете счетчик программ напрямую - CPU делает это за вас, выполняя свою программу. В качестве программиста вы управляете счетчиком программ, выполняя различные инструкции перехода (условные, безусловные, переходы к подпрограмме и т. Д.). Один конкретный случай, когда вам нужно добавить смещение к счетчику программы, - это когда вы вставляете в независимый от позиции код. Однако даже в этом случае вы не добавляете размер инструкции в счетчик программ: вместо этого вы предоставляете смещение места, к которому вы хотели бы перейти, выполнив «ветвь в относительный адрес».

+0

Как насчет того, когда мы пишем загрузчик, который перейдет на код приложения, который находится по абсолютному адресу 0x4000? В этом случае мы напрямую сменим счетчик программ на абсолютный адрес. – eepty

+0

@eepty Вот что говорит второе предложение: вы делаете это с инструкцией перехода, а не с инструкцией по настройке регистра. – dasblinkenlight

Смежные вопросы