Понимание того, как на самом деле работают `lw` и` sw` в программе MIPS - PullRequest
0 голосов
/ 10 января 2019

Мне трудно понять, что sw и lw делают в программе MIPS. Я понимаю эту тему так: мы используем lw для передачи данных из памяти в регистр и наоборот для sw. Но как именно это сделать?

Допустим, у нас есть следующая строка кода:

lw Reg.Dest, Offset(Reg.Source)
sw Reg.Source, Offset(Reg.Dest)

Если мы сконцентрируемся на lw, это, по сути, сохранение данных из памяти, Reg.Source и умножение адреса этих данных на Offset, всегда кратное $ 4 $, потому что регистры имеют дело с $ 32 $ битами и память использует $ 8 $ бит в конкретном адресе в регистре, который равен Offset + Reg.Source - поэтому, если мы скажем, что Offset = 16, Reg.Source = $s1 = 12, тогда регистр сохранит данные из памяти по адресу $ 28 $ в регистре.

Предполагая, что мое понимание lw правильно, мой вопрос тогда, как sw работает?

PS: Было бы замечательно, если бы ответы могли содержать только один пример строки, такой как sw $t0, 32($s3).

1 Ответ

0 голосов
/ 11 января 2019

lw (загрузка слова) загружает слово из памяти в регистр.

lw $2, 4($4) # $2 <- mem($4+4)

$ 2 - регистр назначения, а $ 4 - регистр адреса. А источником информации является память.

4 - это смещение, которое добавляется (не умножается) в регистр адресов. Этот вид доступа к памяти называется адресацией на основе и очень полезен во многих ситуациях. Например, если $ 4 содержит адрес структуры, смещение позволяет выбирать различные поля структуры. Или следующий или предыдущий элемент в массиве и т. Д. Смещение не обязательно должно быть кратным 4, но (адресный регистр + смещение) должно и в большинстве случаев оба равны.

Sw похож, но сохраняет регистр в памяти.

 sw $5, 8($7) # mem[$7+8] <- $5

Снова $ 7 - регистр, содержащий адрес памяти, 8 - смещение, а $ 5 - источник информации, которая будет записана в память.

Обратите внимание, что в отличие от других инструкций MIPS, первый операнд является источником, а не адресатом. Вероятно, это связано с тем, что регистр адресов играет одинаковую роль в обеих инструкциях, тогда как в lw он используется для вычисления адреса памяти источника данных, а в sw - адреса назначения памяти.

...