Синтаксис режима адресации MIPS: constant($reg)
.
($t2)
допускается в качестве специального сокращения для 0($t2)
. Эта же инструкция может сделать
lb $t3, 13($t2)
для загрузки (и расширения знака) байта из памяти по адресу 13 + $t2
в регистр $t3
.
Единственный режим адресации MIPS - reg + sign_extended_imm16
; инструкции загрузки / сохранения (включая lb
и lbu
) I-типа. Пропуск 0 в 0 ($ t2) - это просто синтаксис уровня источника; машинный код все еще имеет 16 нулевых битов для кодирования этого режима адресации.
(Кстати, я игнорирую существование индексированных инструкций загрузки / сохранения FP MIPS, таких как lwxc1
, которые используют 2 целочисленных регистра. Только для FP , возможно, потому что версия целочисленного хранилища потребовала бы 3 регистра GP в качестве входных данных, но для этого файла регистров нужны только 2 порта чтения (для скалярного конвейера). Также есть lwpc
для P C -относительная адресация в некоторых более новых версиях MIPS. Но lw
/ lb
/ lbu
и т. д. не имеют битов для кодирования, какой тип режима адресации, это всегда reg + imm16. Все остальное требует другой инструкции и класса. c MIPS больше ничего не было.)
Значение semanti c (для читателей-людей синтаксиса текста asm) - это операция разыменования , как в C int t3 = *t2;
или t2[0]
загружает указанное значение (lb
) вместо int tmp = (int)p
, копируя указатель в виде целого числа (move
).
()
всегда является памятью операнд и может только использоваться с инструкциями по загрузке или хранению. Обнаженные регистры не являются режимами адресации памяти и не могут использоваться в качестве второго операнда для загрузки или сохранения инструкций.
Хорошо, что для загрузки / сохранения инструкций требуются скобки в режиме адресации, поэтому вы не перепутаете, какой операнд является адресом, а какое значение . Например, sw $t3, 12($t2)
сохраняет слово в $t3
в слове памяти по адресу 12+$t2
. Если sw $t3, $t2
был допустимым синтаксисом, вы могли бы забыть, что адрес всегда правильный для инструкций памяти в MIPS (как большинство RISC), даже если каждая другая инструкция имеет назначение в качестве первого операнда.
Это делает это более визуально отличается от move $t3, $t2
. Распознавание загрузок и хранилищ в блоке кода приятно делать визуально.
Если вы разрабатываете собственный синтаксис для языка ассемблера MIPS или пишете на ассемблере, вы можете сделать его легальным для написания lb $t3, $t2
как сокращение для lb $t3, 0($t2)
. Но синтаксис asm определяется (авторами) ассемблера, и разработчики синтаксиса MIPS решили не делать этого.
до этого я не видел, чтобы они использовались, и книга просто не упоминает их для начала.
Продолжайте читать; надеюсь, что книга продолжит объяснять новый синтаксис через некоторое время после первого его введения. Для учебника или книги совершенно нормально показывать вам код в качестве примера, не останавливаясь для объяснения всего, особенно когда объяснение основано на концепциях, к которым оно еще не подошло.