Помогите найти адрес из инструкции MIPS в шестнадцатеричном виде - PullRequest
0 голосов
/ 01 сентября 2011

Привет, я застрял в своем задании, которое требует от меня написать программу на c, которая читает входной файл, такой как этот:

Registers
r1 = 0c100009

Instructions
0c100009
3c071001
8ce20011
84e33080
80e48000
ace2ffff
a4e39001
a0e48088
03e00008

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

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

8ce20011

до

100011 00111 00010 0000000000010001 

что составляет

lw $t3 17($s7)

но я не знаю, как рассчитать адрес и количество байтов. Я должен игнорировать все инструкции, которые не сохраняются и не загружаются.

А также, что это означает, что знак расширяется?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 02 сентября 2011

Вы на правильном пути.

Код операции 8ce20011 разбирается на "lw v0, 17 (a3)" или эквивалентно "lw $ 2,17 ($ 7)"

В вашем примере "lw $ t3, 17 ($ 7)"Вам необходимо знать текущее значение $ 7 (то есть $ a3), прежде чем вы сможете рассчитать адрес, с которого он загружается.Подсказка: посмотрите на предыдущую инструкцию.Инструкция «lw» загружает слово или 4 байта.

Между прочим, «lw» со смещением, равным 17, которое не выровнено по границе слова, является недопустимым и вызывает ловушку в MIPS.

Расширение знака

...