У меня есть вопрос о единицах смещения, используемых в инструкциях MIPS32.Я только что заметил, что инструкции доступа к памяти, такие как lw $t0, offset($s1)
, имеют offset
единицы байт , в то время как инструкции ветвления, такие как beq $r1, $r2, L1
и jump j SOMEWHERE
, имеют единицы word .
IIRC, MIPS требует, чтобы все данные / инструкции были сохранены выровнены в памяти по адресу, кратному 4, т.е. 0x0, 0x4, 0x8, ... etc
.Если это так, то почему бы не включить offset
в lw/sw
единицы word , чтобы диапазон был больше?Это из-за lb/sb
, который использует единицу байта?Так что Особых случаев недостаточно, чтобы нарушать правила ["] Хороший дизайн требует хороших компромиссов. [."] * Здесь применимо 1024 *?
Мне также интересно, что произойдет, если я использую lw
для загрузки данных по адресу, который не кратен 4?