LEN
находится внутри .data
сегмента со смещением +0, которое является адресом 0x0000100100000000
(начало сегмента .data
).
Таким образом, инструкции lw
извлекают данные изадрес 0x0000100100000000+0
и 0x0000100100000000+4
, который вычисляется из $1 + 0
и $1 + 4
.
lui
устанавливает это значение в $1
.
Дважды, поскольку ассемблер MARSсвоего рода «тупой», производящий собственные инструкции MIPS фиксированным способом, не оптимизируя особые случаи, когда значение уже находится в регистре $1
.Некоторые из псевдо-инструкций могут быть даже реализованы более эффективным способом, если вы проверите их все, это не значит, что MARS производит наиболее оптимальный вариант.
Вы можете теоретически удалить вторую lui
в данном конкретном случае.случай, не влияющий на результат, но удаление первого lui
заставит lw
получить доступ к совершенно другой области памяти (так как регистр $1
будет содержать другое значение).
EDIT: btwВы зарезервировали только один .word
для LEN, поэтому второй lw
извлекает значение вне этого слова, обычно в более сложном источнике, который будет ошибкой / оплошностью.
И если вы зарезервируете LEN
после того, как какая-то другая .data
память уже использовалась, за lui
будет следовать ori
, чтобы поместить в $1
полный адрес, включая младшие 16 бит.Это одна из редких оптимизаций MARS: удалить ori
«адреса загрузки», когда младшие 16 битов равны нулю.
Я думаю, ld
будет выглядеть как lui, ori, lw, lui, ori, lw
, то естьбыть еще более избыточным.