... увеличивает расстояние ветви, используя относительную к ПК адресацию, относящуюся к количеству слов в следующей инструкции вместо количества байтов.
Это предложение только означает:
Инструкция 0x1000nnnn (b nnnn
), хранящаяся по адресу X, перейдет к инструкции по адресу X+4+4*nnnn
, а не кинструкция по адресу X+4+nnnn
.
В предложении ничего не говорится о регистре ПК и о его значении.
Я заметил, что регистр $pc
не 't следует этому правилу и всегда сохраняет адрес байтовой памяти.
Разве регистр $pc
не должен быть чем-то подобным до выполнения приведенных ниже инструкций, расположенных в адресах инструкций?
Вопрос здесь такой: что такое регистр $pc
?
На некоторых процессорах (например, ARM) есть инструкции, которые в MIPS записываются как addu $t0,$t0,$pc
язык ассемблера.Говоря о таких процессорах, легко ответить на вопрос:
Значение регистра $pc
- это значение, которое будет добавлено к $t0
, если будет выполнена инструкция addu $t0,$t0,$pc
.
В реальных процессорах MIPS (не в эмуляторах MIPS) регистр ПК представляет собой некий вид памяти (30-разрядная защелка), который может содержать 30 бит информации.
Однако, когда речь идет об информации, хранящейся в некоторыхПамять, мы должны определить, как интерпретировать информацию:
Биты 10000111
можно интерпретировать как 135 (без знака), 87 (BCD), -121 (дополнение к двум), -120 (дополнение к одному), -7 (знак и абсолют), SOME_ENUM_CONSTANT
(перечисление), -0,09, 0,7, 1,35 (различные варианты с плавающей и фиксированной точкой) ...
Хорошо определено, что биты 0000...011100
в реестре ПК укажите инструкцию по адресу 0x70.Однако не определено, должно ли это значение быть записано как PC=0x1C
или как PC=0x70
.
. Поэтому в некоторых эмуляторах MIPS может отображаться $pc=0x400000
, а в другом - $pc=0x100000
для * 1054.* то же самое значение в реестре ПК!
Тем не менее, я думаю (почти) все эмуляторы MIPS будут отображать $pc=0x400000
, потому что пользователи интересуются адресом, на который указывает инструкция.