2016-11-26 14 views
6

В наборе инструкций RISC MIPS у нас есть байт загрузки (lbu), загрузите половину слова (lhu) и загрузите слово (lw). Мне кажется, что все, что может сделать lbu и lhu, может быть достигнуто с помощью lw.MIPS: Зачем нам загружать байт, когда у нас уже есть загрузочное слово?

Итак, почему дизайнеры MIPS представили lbu и lhu? В каких обстоятельствах (желательно не-неясных) они могут быть полезны? Возможно, lw занимает больше времени, чем lbu, хотя оба являются одиночными инструкциями?

+1

Оригинальная Alpha не имела инструкций по загрузке/хранению субслов. Вы можете получить довольно далеко без них, но Alpha в конечном итоге пришлось расширить набор инструкций с этими инструкциями для многопроцессорных систем. – EOF

ответ

6

lw требует, чтобы адрес, который вы загружаете, был выровнен по словам (то есть адрес должен быть кратным 4).

Так давайте предположим, что у вас есть у вас есть этот массив, расположенный по адресу 0x1000:

array: .byte 0,1,2,3 

И вы хотите загрузить вторые байты (1), который расположен по адресу 0x1001, который не является словом -aligned. Это явно не сработает, если вы не сделали lw с адреса 0x1000, а затем выполнили некоторые изменения и ANDing, чтобы получить байт, который вы хотели, что было бы настоящей проблемой в качестве программиста.

Или предположим, что вы хотите загрузить 0, который является, расположенный по адресу, адресуемому словом, и сравните его с некоторой стоимостью. Таким образом, вы делаете lw с адреса 0x1000, но теперь ваш целевой регистр будет содержать либо 0x00010203, либо 0x03020100 (в зависимости от контентоспособности), а не только 0. Поэтому, прежде чем выполнять сравнение, вам придется поразрядно И извлечь извлеченный байт.

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

+0

Майкл - спасибо. Что касается сомнения, которое у меня было о времени выполнения, я полагаю, что 'lw' и' lbu' занимают одинаковое время, не так ли? То есть, если нам нужно было ждать памяти, требуемое время ожидания не изменилось бы между этими двумя, исправьте? – flow2k

+1

@ flow2k: нулевое расширение байта в 32-разрядный регистр по существу бесплатное в аппаратном обеспечении, и, надеюсь, хорошая реализация может эффективно выбрать правильное слово для извлечения из кеша. Я ожидал бы, что LW и LBU будут работать одинаково, но вполне возможно, что LBU имеет несколько более высокую задержку в некоторых реализациях. Если LHU работает на невыровненных половинах, ему может потребоваться загрузить один байт из каждой из двух соседних строк кеша. Это может быть медленнее все время, или только медленнее при разбиении на кеш-строки. (Полностью создавая материал, основанный на моих знаниях архитектуры x86 и архитектуры процессора, IDK, что такое MIPS HW). –