Была эта проблема, о которой спрашивали о внедрении байта загрузки в один цикл данных без необходимости изменять память данных, и решение было кое-чем ниже.
альтернативный текст http://img214.imageshack.us/img214/7107/99897101.jpg а>
На самом деле это вполне реальный вопрос; большинство систем памяти полностью основаны на словах, и отдельные байты обычно обрабатываются только внутри процессора. Когда вы видите «ошибку шины» на многих компьютерах, это часто означает, что процессор пытался получить доступ к адресу памяти, который не был правильно выровнен по словам, и система памяти вызвала исключение. В любом случае, поскольку байтовые адреса могут не быть кратными 4, мы не можем передать их в память напрямую. Тем не менее, мы все равно можем получить любой байт, потому что каждый байт можно найти в каком-то слове, а все адреса слов кратны 4. Итак, первое, что мы делаем, - это проверяем правильность слова. Если мы возьмем старшие 30 бит адреса (например, ALUresult [31-2]) и объединим их с двумя нулевыми битами на нижнем конце (это то, что на самом деле делает блок «сдвиг влево 2»), мы получим байтовый адрес слова, содержащего желаемый байт. Это просто собственный адрес байта, округленный до числа, кратного 4. Это изменение означает, что lw теперь также будет округлять адреса до кратных 4, но это нормально, поскольку невыровненные адреса в любом случае не будут работать для lw с этой памятью. Ед. изм. Хорошо, теперь мы получаем слово данных из памяти. Как нам получить из него нужный нам байт? Обратите внимание, что байтовое смещение в слове задается двумя младшими битами адреса байта. Итак, мы просто используем эти 2 бита для выбора соответствующего байта из слова с помощью мультиплексора. Обратите внимание на использование нумерации байтов с прямым порядком байтов, подходящей для MIPS. Затем мы должны расширить байт нулями до 32 бит (то есть просто объединить его с 24 нулями на его верхнем конце), потому что проблема требует этого. На самом деле, это была небольшая ошибка в вопросе: на самом деле инструкция lbu ноль расширяет байт, а знак lb расширяет его. Ну что ж. Наконец, мы должны расширить мультиплексор, управляемый MemtoReg, для приема одного нового ввода: расширенного нуля байта для случая lb. Управляющий сигнал MemtoReg должен быть расширен до 2 бит. Исходные регистры 0 и 1 меняются на 00 и 01 соответственно, и мы добавляем новый регистр 10, который используется только в случае lb.
Я не совсем понимаю, как это работает, даже после прочтения объяснения, особенно о сдвиге влево, результат ALU на 2 даст байтовый адрес ... как это возможно ?? так что, если я хочу загрузить полуслова, я бы сделал один сдвиг влево и получил бы адрес полуслова ?? Что было бы лучше для загрузки байта, загрузки половины слова путем изменения памяти данных? (вопрос выше накладывает ограничения, которые мы не можем изменить в памяти данных)