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