Почему счетчик программ увеличивается на 1, если память организована как word, и на 2 в случае байтов?

#assembly #memory #cpu-architecture

#сборка #память #архитектура процессора

Вопрос:

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

Комментарии:

1. это все равно что хранить обувь в шкафу в коробках, а не держать ее свободно. В одном случае вам нужно сосчитать более N ящиков, причем коробка с обувью является единицей измерения. В другом случае вам нужно сосчитать более N * 2 единиц обуви, чтобы найти конкретную пару. Или по какой-то причине найти конкретный левый ботинок. Вам либо нужно сосчитать в единицах коробки, затем внутри коробки взять левую туфлю, либо вы пересчитываете некоторое количество обуви в единицах обуви.

Ответ №1:

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

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

Сначала мы рассмотрим значение «адреса» на 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 во время выполнения команды.

Комментарии:

1. Первые два поколения DEC Alpha были похожи на адреса LittleMIPS: byte, но фактически были возможны только выровненные 4-байтовые и 8-байтовые загрузки / сохранения. Не было никаких инструкций lbu / sb или lhu / sh для загрузки / сохранения чего-либо более узкого, чем 32-разрядное слово, пока расширение ISA не добавило их. (Области MMIO могут быть сопоставлены специальной области byte<-> word физического адресного пространства, что позволяет писать драйверы для устройств PCI со смежными байтовыми регистрами.)

2. Я имел в виду процессор 8086.

3. @KuldeepSarma Адресация на 8086 работает аналогично 68000. Однако, в отличие от 68000, процессоры x86 также знают инструкции длиной всего 8 бит. Это также означает, что инструкции могут начинаться с любого адреса. Счетчик программ увеличивается на 1, если команда имеет длину 8 бит, и увеличивается на 2, если она имеет длину 16 бит.

Ответ №2:

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

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

Комментарии:

1. Извините, я полностью проигнорировал тот факт, что инструкции состоят из 16 бит, что составляет 2 байта. Таким образом, в системе с байтовой организацией каждая команда будет занимать 2 байта. Следовательно, следующая команда будет на расстоянии 16 бит или 2 байта от текущей команды. Вот почему, чтобы получить следующую команду, мы должны добавить 2 к счетчику программ.

2. @KuldeepSarma: да, это верно. Если это отвечает на ваш вопрос, пожалуйста, установите флажок «принять» под стрелками голосования.