MARS Simulator имеет относительную к ПК адресацию, обозначающую количество байтов вместо слов? - PullRequest
0 голосов
/ 29 мая 2019

В настоящее время я читаю книгу Дэвида Паттерсона и Джона Хеннеси под названием: «Организация и дизайн компьютеров - 4-е издание». В какой-то момент книга говорит:

Поскольку все инструкции MIPS имеют длину 4 байта, MIPS растягивает расстояние ветви, имея относительную к ПК адресацию, относящуюся к числу слова для следующей инструкции вместо количества байтов.

Как только я прочитал это, я подошел к симулятору MARS, чтобы увидеть это на практике. К моему удивлению, я заметил, что регистр $ pc не следует этому правилу и всегда хранит адрес байтовой памяти.

Разве регистр $ pc не должен выглядеть примерно так до выполнения приведенных ниже инструкций, расположенных в адресах инструкций?

Instruction Address |    $pc Content
                    |
    0x00400000      |     0x00100000
    0x00400004      |     0x00100001
    0x00400008      |     0x00100002
      ....          |         ....

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Другой способ взглянуть на это: младшие 2 бита ПК установлены на 0.

По вашему предложению старшие 2 бита будут установлены на 0. И jr $ra или другие инструкции перехода к регистру также должны сдвинуть регистр влево вместо простой установки $pc = function-pointer.

(В противном случае разница будет видна с точки зрения архитектуры, и при доступе к коду в качестве данных или наоборот придется смещаться для преобразования адреса данных в адрес кода для того же слова.)


Как указывает Шут, $pc - это обычный указатель на командное слово, подобно тому, как MIPS используется для работы с . MIPS использует адресно-байтовую память, но загрузки слов должны быть выровнены (до MIPS32r6). Так что $pc увеличивается на 4 вместо масштабируется на 4 при каждом использовании.

Единственное масштабирование, необходимое для фактического проектирования, - это немедленные изменения для ветви (I-тип) и скачка (J-тип). См. Как рассчитать целевой адрес перехода и целевой адрес филиала? как это работает. Вопрос только в том, в какую позицию вы подключаете непосредственные биты в сумматор, оставляя младшие биты равными нулю. И это происходит только при расшифровке этих инструкций; все остальное просто работает с обычными байтовыми адресами.

0 голосов
/ 30 мая 2019

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

Это предложение только означает:

Инструкция 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, потому что пользователи интересуются адресом, на который указывает инструкция.

...