MIPS Assembly Linker упражнение - PullRequest
0 голосов
/ 10 декабря 2018

Мне дали раздаточный материал для упражнения с компоновщиком.Я знаю, что мне нужно распознать, какие инструкции нужно изменить, какие адреса включены в эти инструкции, и выяснить адрес.Но на практике я не знаю, что делать.Ниже приведено изображение указанного упражнения.Любая помощь приветствуется.

Упражнение с компоновщиком

1 Ответ

0 голосов
/ 12 декабря 2018

Если вы хорошо умеете вручную кодировать и декодировать инструкции, на самом деле это будет довольно просто для вас.Рассмотрим эту строку в нижней части, которая гласит:

38:    08000014    j    50 <check+0x50>

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

50:    8fc20000    lw v0,0(s8)

Мы должны принять во внимание две вещи: фактический адрес строки 50, а такжесодержимое строки 38, которая в настоящее время 08000014

Если я разобью 08000014 на двоичный файл, я получу:

0000 1000 0000 0000 0000 0000 0001 0100

Если я не сделаля не могу позволить себе роскошь уже знать, что это инструкция перехода (как в данном случае), как бы я выяснил, в каком она формате?По формату я имею в виду справочные данные MIPS, которые имеют форматы команд R , I и J .Вы должны взять 6 старших разрядов!

0000 10|00 0000 0000 0000 0000 0001 0100

Если бы 6 старших разрядов были равны 0, то мы были бы в формате R .Однако в этом случае 000010 - это 2 в двоичном виде.Если вы отсканируете столбец OPCODE / FUNCT в таблице данных, вы найдете 2 шестнадцатеричных в строке, которые соответствуют инструкции jump , которая имеет J формат:

6 bit opcode | 26 bit instruction

Если мы продолжим разбивать оставшуюся часть нашей двоичной последовательности вверх на группы по четыре:

0000 10|00 00|00 00|00 00|00 00|00 00|01 01|00

, а затем сместимся влево на два бита, мы получим:

0010 0000 0000 0000 0000 0000 0101 0000

Преобразуйте это обратно в гекс, чтобы получить:

2 0 0 0 0 0 5 0

Обратите внимание на 2 наименее значимых шестнадцатеричных значения.Они читают 50 .Стечение обстоятельств?Я думаю, что нет… Давайте продолжим ...

Обратите внимание, что адрес check равен 00400690 , и линия, к которой мы пытаемся перейти, смещена на 50 оттот.Это означает, что мы должны сделать некоторое шестнадцатеричное сложение.400690 + 50 = 4006E0

Возьмите это значение 20000050 и замените 6 младших разрядов на 4006E0 , чтобы получить ..... барабанная дробь ..... 204006E0 !Мы почти закончили, нам просто нужно отменить шаг, который мы сделали ранее.Возьмите это число и разбейте его на двоичные числа:

0010 0000 0100 0000 0000 0110 1110 0000

Затем сдвиньте все вправо на 2 бита, чтобы получить:

0000 1000 0001 0000 0000 0001 1011 1000

Затем преобразуйте обратно в гекс:

0 8 1 0 0 1 B 8

Это будет значение в столбце содержимого.Что касается адреса для этой инструкции перехода, мы просто делаем то, что мы сделали, чтобы найти адрес для строки 50. Инструкция перехода имеет 38 смещений от check , поэтому мы просто берем 00400690 и добавляем 38 к нему, чтобы получитьадрес этого слова, который 4006C8

...