lw
требует, чтобы адрес, с которого вы загружаетесь, был выровнен по слову (т. е. адрес должен быть кратен 4).
Итак, допустим, что у вас есть этот массив, расположенный по адресу 0x1000:
array: .byte 0,1,2,3
И вы хотите загрузить второй байт (1
), расположенный по адресу 0x1001, который не выровнен по слову. Это явно не сработает, если только вы не выполнили lw
с адреса 0x1000, а затем не выполнили сдвиг и операцию И, чтобы получить нужный байт, что было бы настоящей проблемой для программиста.
Или предположим, что вы хотите загрузить 0
, который находится по адресу, выровненному по слову, и сравнить его с некоторым значением. Таким образом, вы выполняете lw
с адреса 0x1000, но теперь ваш целевой регистр будет содержать либо 0x00010203
, либо 0x03020100
(в зависимости от порядка байтов), а не только 0
. Поэтому перед выполнением сравнения вам нужно будет выполнить побитовое И, чтобы извлечь нужный байт.
Я уверен, вы понимаете, что было бы очень неудобно выполнять эти дополнительные шаги всякий раз, когда вы хотите обработать отдельные байты данных, что в большинстве программ является довольно распространенной операцией.
person
Michael
schedule
26.11.2016