0x1b430010
в t1
как число (32-разрядное целое число без знака), представляющее адрес памяти. lui + ori
строит эту константу в t1
из частичных непосредственных значений, закодированных непосредственно в кодах операций lui/ori
(каждая команда MIPS кодируется как 32-битное слово, поэтому часть этих битов образует шаблон, известный ЦП как инструкция lui
или ori
инструкция, а оставшиеся 16 битов IIRC образуют непосредственное значение, которое будет использоваться инструкцией).
lw $t0,0($t1)
совсем другой, сначала он будет использовать значение в t1
(измененное постоянным «смещением» +0 - это то, что «0» перед скобками) в качестве адреса памяти, то есть ЦП установит адрес шины подключаются к значению 0x1b430010, и затем он сигнализирует микросхеме памяти, что должен использовать эти адресные провода и выполнять загрузку памяти с этого адреса, устанавливая значение чтения для шинных проводов данных. Как только микросхема памяти будет сигнализировать ЦПУ, что данные были прочитаны, а провода данных находятся в правильном состоянии, ЦП сохранит это состояние как новое значение t0
.
Короче говоря, он загрузит слово из памяти компьютера по адресу 0x1b430010 в регистр t0
- но каково фактическое значение, хранящееся в памяти, это невозможно определить из вашего короткого фрагмента.
JFYI: память в MIPS адресуется байтами (адресная шина имеет ширину 28 или 30 бит или полная 32). Вероятно, зависит от конкретного целевого HW = ширина адресной шины определяет максимальную область, которую вы можете адресовать, то есть ограничивает максимально возможная доступная память в адресном пространстве ЦП). Таким образом, устанавливая определенный адрес, вы можете читать / изменять любой байт памяти (при условии, что у вас достаточно привилегий для этого, и это не только постоянная память или свободное пространство, не отображаемое каким-либо чипом памяти).
Есть небольшая загвоздка, что инструкции загрузки / сохранения слова требуют (чтобы упростить конструкцию HW блока управления памятью) адрес памяти, чтобы он был "выровнен по словам", т.е. делился на 4 (равняется "нижние два бита равны нулю") , Аналогично для чтения полуслов адрес памяти должен быть выровнен по полуслову (делится на 2 = бит нулевого адреса). Если вы работаете с невыровненными буферами данных, вы должны загружать их по одному байту (и составлять значение слова из четырехбайтных чтений), чтобы избежать сбоя при доступе к невыровненной памяти, используя lw
по неправильному адресу.
Значение 0x1b430010 делится на 4 (нижние четыре бита равны нулю, хотя двух будет достаточно, на самом деле это делится на 16), и этот адрес памяти, вероятно, указывает на область .data
, поэтому lw
из там должно работать без проблем.