lw
требует, чтобы адрес, который вы загружаете, был выровнен по словам (то есть адрес должен быть кратным 4).
Так давайте предположим, что у вас есть у вас есть этот массив, расположенный по адресу 0x1000:
array: .byte 0,1,2,3
И вы хотите загрузить вторые байты (1
), который расположен по адресу 0x1001, который не является словом -aligned. Это явно не сработает, если вы не сделали lw
с адреса 0x1000, а затем выполнили некоторые изменения и ANDing, чтобы получить байт, который вы хотели, что было бы настоящей проблемой в качестве программиста.
Или предположим, что вы хотите загрузить 0
, который является, расположенный по адресу, адресуемому словом, и сравните его с некоторой стоимостью. Таким образом, вы делаете lw
с адреса 0x1000, но теперь ваш целевой регистр будет содержать либо 0x00010203
, либо 0x03020100
(в зависимости от контентоспособности), а не только 0
. Поэтому, прежде чем выполнять сравнение, вам придется поразрядно И извлечь извлеченный байт.
Как я уверен, вы можете видеть, что было бы очень неудобно выполнять эти дополнительные шаги всякий раз, когда вы хотите обрабатывать отдельные байты данных, что в большинстве программ является довольно распространенной операцией.
Оригинальная Alpha не имела инструкций по загрузке/хранению субслов. Вы можете получить довольно далеко без них, но Alpha в конечном итоге пришлось расширить набор инструкций с этими инструкциями для многопроцессорных систем. – EOF