Какова функция скобок в MIPS? - PullRequest
1 голос
/ 21 апреля 2020

Я работал над проектом в качестве введения в MIPS и столкнулся с проблемой. Одна из строк кода в книге - lb $t3, ($t2). Я понятия не имею, что делают круглые скобки, потому что до этого я не видел, чтобы они использовались, а в книге просто не упоминается о них с самого начала. Почему код не будет просто lb $t3, $t2?

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Синтаксис режима адресации 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 решили не делать этого.


до этого я не видел, чтобы они использовались, и книга просто не упоминает их для начала.

Продолжайте читать; надеюсь, что книга продолжит объяснять новый синтаксис через некоторое время после первого его введения. Для учебника или книги совершенно нормально показывать вам код в качестве примера, не останавливаясь для объяснения всего, особенно когда объяснение основано на концепциях, к которым оно еще не подошло.

0 голосов
/ 22 апреля 2020

Скобки в этом случае не имеют никакого значения.

Некоторые инструкции, такие как lw, могут использовать немедленное смещение от значения регистра, например lw $t3, 16($t2). Это означает загрузку $t3 с содержимым памяти на $t2 + 16.

...