Прежде всего, lui
/ ori
создает значение в регистре сразу, без доступа к памяти данных. Они никоим образом не эквивалентны lw
. Возможно, вы думаете о li
, который является псевдоинструкцией для lui
и / или ori
. Только инструкции загрузки могут получить доступ к памяти; немедленные инструкции ALU берут данные из самой инструкции, но это не имеет значения.
MIPS предоставляет пары инструкций для загрузки / сохранения левой и правой частей слова без выравнивания. Магазины: SWL
(слева) и SWR
(слово магазина справа).
Их эффект зависит от режима endian вашего MIPS (он поддерживает big и little endian). MARS имитирует MIPS в режиме с прямым порядком байтов.
В режиме с прямым порядком байтов SWL $t1, buf
сохраняет старший байт $ t1 в первый байт buf
для выровненного buf
.
В режиме с прямым порядком байтов на адресе, который выровнен (например, sw
требует 1 ), SWR действует как SW, сохраняя все 4 байта.
Эти инструкции интересны тем, что они могут изменять от 1 до 4 байтов в слове. Включая 3 байта, которые вы не можете сделать с одним sb
(байт) или sh
(полуслово).
http://db.cs.duke.edu/courses/fall02/cps104/homework/lwswlr.html объясняет, как использовать инструкции SPARC с тем же именем. Я думаю, что MIPS (в режиме с прямым порядком байтов) будет таким же, а MIPS в режиме с прямым порядком байтов, как имитирует MARS, похож на это, но в обратном порядке.
Так что в режиме с прямым порядком байтов, я думаю, swl
эквивалентно sw
для выровненных адресов, но я не проверял.
Сноска 1:
MIPS32R6 удален LWL / R и требует LW для поддержки невыровненного сохранения / загрузки Википедия не упоминает магазины для этого, только загружает.
См. Также https://www.linux -mips.org / wiki / Alignment : Linux MIPS имеет опцию ядра для эмуляции невыровненной загрузки / хранения вместо доставки SIGBUS на невыровненных LW или SW.