Ваш вопрос не говорит о том, на какую архитектуру вы ссылаетесь.
Говоря о проектах, которые не позволяют командам быть выровненными по байтам, описанное вами поведение отличается от процессора к процессору !
Сначала мы посмотрим на значение "адреса" на 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 во время выполнения инструкции.