Почему счетчик программы увеличивается на 1, если память организована как слово, и на 2 в случае байтов? - PullRequest
3 голосов
/ 14 марта 2019

Если в компьютере инструкция состоит из 16 битов и если память организована в виде 16-битных слов, то адрес следующей инструкции оценивается путем добавления единицы в адрес текущей инструкции. В случае, если память организована как байты, которые могут быть адресованы индивидуально, тогда нам нужно добавить два в текущем адресе инструкции, чтобы получить адрес следующей инструкции, которая должна быть выполнена последовательно. Почему это так?? Пожалуйста, объясните эту концепцию. Я новичок в компьютерной организации и программировании на ассемблере, поэтому любая помощь приветствуется. Спасибо.

Ответы [ 2 ]

4 голосов
/ 15 марта 2019

Ваш вопрос не говорит о том, на какую архитектуру вы ссылаетесь.

Говоря о проектах, которые не позволяют командам быть выровненными по байтам, описанное вами поведение отличается от процессора к процессору !

Сначала мы посмотрим на значение "адреса" на 8-битных процессорах. На таких процессорах адрес увеличивается на 1 при переходе от одного байта к следующему байту в памяти:

Address   Meaning
0         1st byte in memory
1         2nd byte in memory
2         3rd byte in memory
3         4th byte in memory
4         5th byte in memory
...

68000 использует аналогичную адресацию, как 8-битные процессоры. Однако память фактически организована в 16-битных единицах, и инструкции должны начинаться с четного адреса и кратны 16-битному. Поэтому программный счетчик всегда содержит четное значение. Он будет увеличиваться на 2 или кратно 2 во время каждой инструкции.

(Использование нечетных адресов разрешено только для побайтного доступа к памяти (чтение / запись), который фактически выполняет 16-битный доступ к памяти в фоновом режиме.)

Для TMS9900 (16-битный процессор) адрес увеличивается на 1 для 16 бит; Доступ к промежуточным байтам возможен, но адреса формируются путем добавления 0x8000:

Address   Meaning
0         1st byte in memory
0x8000    2nd byte in memory
1         3rd byte in memory
0x8001    4th byte in memory
2         5th byte in memory
...

Здесь программный счетчик может содержать нечетное или четное значение, но не значение выше 0x7FFF, поскольку это будет относиться к байту, который не выровнен по 16 битам. Конечно, программный счетчик будет увеличиваться на 1 , если длина инструкции составляет 16 бит.

TMS320 не разрешает адресацию нечетных байтов:

Address       Meaning
0             1st + 2nd byte in memory
not possible  2nd + 3rd byte in memory
1             3rd + 4th byte in memory
2             5th + 6th byte in memory
...

В этом варианте программный счетчик также будет увеличиваться на 1 , если длина инструкции составляет 16 бит.

LittleMIPS (или похожий; я не помню правильного названия) - это уменьшенный процессор MIPS, предназначенный для студентов, изучающих дизайн микрочипов. Он допускает только 32-битный доступ к памяти и только 4 выровненных адреса:

Address       Meaning
0             1st to 4th byte in memory
1             address does not exist
2             address does not exist
3             address does not exist
4             5th to 8th byte in memory
5             address does not exist
...

В этом случае программный счетчик всегда будет содержать кратное число 4. Поскольку каждая инструкция имеет длину ровно 4 байта, программный счетчик будет увеличиваться на 4 во время выполнения инструкции.

3 голосов
/ 14 марта 2019

Если наименьшая адресуемая единица составляет 2 байта, то смежные 2-байтовые слова инструкций разделяются только на 1 адрес.

Весь смысл адресно-адресной памяти состоит в том, чтобы не тратить адресный бит внутри байта-слово в системе, которая не может в первую очередь загружать / хранить байты.

...