Интернет магазин китайских планшетных компьютеров



Компьютеры - MIPS (архитектура) - Язык ассемблера MIPS

24 февраля 2011


Оглавление:
1. MIPS (архитектура)
2. История
3. MIPS IV
4. Семейство процессоров с архитектурой MIPS
5. Формат инструкций MIPS I
6. Язык ассемблера MIPS
7. Использование регистра транслирования
8. Эмуляторы
9. Список процессоров на базе архитектуры MIPS по компаниям



Данные инструкции языка ассемблера имеют прямую аппаратную реализацию, в отличие от псевдоинструкций, которые перед сборкой транслируются в настоящие составные инструкции.

  • Далее, регистровые буквы d, t, и s будут обозначать указатели на номера и имена регистров.
  • C обозначает константу.
  • Все последующие команды являются собственными.
  • Все коды операций и функций представлены в шестнадцатеричной системе счисления.
  • Набор инструкций MIPS32 идентифицирует, что число без знака, участвующее в сложении или вычитании, некорректно. Разницей между форматами числа со знаком и без является не увеличение длины операндов, а способность распознавать, было ли прерывание и случае переполнения, или же прерывание было проигнорировано. Операнд константа, в соответствие с этими инструкциями, всегда должен иметь знак.


Целочисленные операции

MIPS имеет 32 регистра для целочисленных операций. Для выполнения арифметических вычислений данные должны находиться в регистрах. Регистр $0 всегда хранит 0, а регистр $1 резервируется для сборки. Нижеприведенная таблица показывает какие биты каким частям инструкции соответствуют. Дефис обозначает нейтральное состояние.

Категория Название Синтаксис инструкции Значение Формат/код/функция Примечания/Кодирование
Арифметическая Add add $d,$s,$t $d = $s + $t R 0 2016 складывает два регистра, выполняет прерывание при переполнении
000000ss sssttttt ddddd--- --100000
Add unsigned addu $d,$s,$t $d = $s + $t R 0 2116 как и выше, но игнорирует переполнение
000000ss sssttttt ddddd--- --100001
Subtract sub $d,$s,$t $d = $s — $t R 0 2216 Вычитает два регистра, выполняет прерывание при переполнении
000000ss sssttttt ddddd--- --100010
Subtract unsigned subu $d,$s,$t $d = $s — $t R 0 2316 как и выше, но игнорирует переполнение
000000ss sssttttt ddddd000 00100011
Add immediate addi $t,$s,C $t = $s + C I 816 - Используется для сложения констант со знаками, выполняет прерывание при переполнении
001000ss sssttttt CCCCCCCC CCCCCCCC
Add immediate unsigned addiu $t,$s,C $t = $s + C I 916 - как и выше, но игнорирует переполнение, С остается знаковым
001001ss sssttttt CCCCCCCC CCCCCCCC
Multiply mult $s,$t LO = << 32) >> 32;
HI = >> 32;
R 0 1816 Умножает два регистра и записывает 64-битный результат в два специальных поля для памяти — LO and HI. Аналогично, можно записать результат операции в виде: = $s * $t . См. mfhi и mflo для доступа к LO и HI регистрам.
Divide div $s, $t LO = $s / $t     HI = $s % $t R 0 1A16 Делит один регистр на другой и записывает 32-битный результат в LO, а остаток в HI.
Divide unsigned divu $s, $t LO = $s / $t     HI = $s % $t R 0 1B16 Делит один регистр на другой и записывает 32-битный результат в LO, а остаток в HI.
Передача данных Load double word ld $t,C $t = Memory I 2316 - загружает double word из: MEM и следующих 7 байтов в $t и следующий регистр.
Load word lw $t,C $t = Memory I 2316 - загружает word из: MEM и следующих 3 байтов.
Load halfword lh $t,C $t = Memory I 2116 - загружает halfword из: MEM и следующего байта. Знак расширен до ширины регистра.
Load halfword unsigned lhu $t,C $t = Memory I 2516 - Как и выше, но без расширения знака.
Load byte lb $t,C $t = Memory I 2016 - загружает byte из: MEM.
Load byte unsigned lbu $t,C $t = Memory I 2416 - Как и выше, но без расширения знака.
Store double word sd $t,C Memory = $t I - сохраняет два типа word из $t и следующего регистра в: MEM и следующие 7 байтов. Порядок операндов может создать путаницу.
Store word sw $t,C Memory = $t I 2B16 - сохраняет word в: MEM и следующие 3 байта. Порядок операндов может создать путаницу.
Store half sh $t,C Memory = $t I 2916 - сохраняет первыю половину регистра в: MEM и следующий байт.
Store byte sb $t,C Memory = $t I 2816 - сохраняет первую четверть регистра в: MEM.
Load upper immediate lui $t,C $t = C << 16 I F16 - Загружает 16-битный операнд в вышестоящие 16 битов определенного регистра. Максимальная величина константы 2−1
Move from high mfhi $d $d = HI R 0 1016 Помещает значение из HI в регистр. Не используйте инструкции умножения и деления внутри инструкции mfhi.
Move from low mflo $d $d = LO R 0 1216 Помещает значение из LO в регистр. Не используйте инструкции умножения и деления внутри инструкции mflo.
Move from Control Register mfcZ $t, $s $t = Coprocessor.ControlRegister R 0 Перемещает 4-байтовое значение из сопроцессора регистра Z-контроля в регистр общего назначения. Расширение знака.
Move to Control Register mtcZ $t, $s Coprocessor.ControlRegister = $t R 0 Перемещает 4-байтовое значение из регистра общего назначения в сопроцессор регистра Z-контроля. Расширение знака.
Логическая And and $d,$s,$t $d = $s & $t R 0 2416 Конъюнкция Bitwise
000000ss sssttttt ddddd--- --100100
And immediate andi $t,$s,C $t = $s & C I C16 -
001100ss sssttttt CCCCCCCC CCCCCCCC
Or or $d,$s,$t $d = $s | $t R 0 2516 Дизъюнкция Bitwise
Or immediate ori $t,$s,C $t = $s | C I D16 -
Exclusive or xor $d,$s,$t $d = $s ^ $t R 0 2616
Nor nor $d,$s,$t $d = ~ R 0 2716 Bitwise nor
Set on less than slt $d,$s,$t $d = R 0 2A16 Проверяет, является ли один регистр меньше другого.
Set on less than immediate slti $t,$s,C $t = I A16 - Проверяет, является ли один регистр меньше константы.
Bitwise сдвиг Shift left logical sll $t,$s,C $t = $s << C R 0 0 сдвигает С битов влево
Shift right logical srl $t,$s,C $t = $s >> C R 0 216 сдвигает С битов вправо. Заметьте, что эта инструкция работает как деление в дополнительным двоичном коде только если значение положительно.
Shift right arithmetic sra $t,$s,C \scriptstyle $t = $s >> C + \left\cdot $2>>31\right) R 0 316 сдвигает С битов —
Условное ветвление Branch on equal beq $s,$t,C if go to PC+4+4 °C I 416 - Переходит к инструкции по указанному адресу, если два регистра равны.
000100ss sssttttt CCCCCCCC CCCCCCCC
Branch on not equal bne $s,$t,C if go to PC+4+4 °C I 516 - Переходит к инструкции по указанному адресу, если два регистра не равны.
Безусловный переход Jump j C PC = PC+4 . C*4 J 216 - Выполняет безусловный переход к инструкции по указанному адресу.
Jump register jr $s goto address $s R 0 816 Переходит по адресу, содержащему указанный регистр.
Jump and link jal C $31 = PC + 8; PC = PC+4 . C*4 J 316 - Как процедура — применяется для вызова подпрограммы, регистр $31 получает и возвращает адрес; возврат из подпрограммы совершает jr $31.

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

Примечание: Не существует соответствующей команды «копирование в регистр»; это можно сделать с помощью функций addi или ori c регистром $0. Например, обе команды addi $1, $0, 100 и ori $1, $0, 100 загружают в регистр $1 значение 100.

Операции над числами с плавающей точкой

MIPS имеет 32 регистра с плавающей точкой. Регистры соединены по 2 для двойной точности вычислений. Регистры с нечетными номерами не могут быть использованы для арифметических операций или ветвления, они могут лишь частично указывать двойную точность в паре регистров.

Категория Название Синтаксис инструкции Значение Формат/код/функция Примечания/Кодирование
Арифметические FP add single add.s $x,$y,$z $x = $y + $z Сложение чисел с плавающей точкой
FP subtract single sub.s $x,$y,$z $x = $y — $z Вычитание чисел с плавающей точкой
FP multiply single mul.s $x,$y,$z $x = $y * $z Умножение чисел с плавающей точкой
FP divide single div.s $x,$y,$z $x = $y / $z Деление чисел с плавающей точкой
FP add double add.d $x,$y,$z $x = $y + $z Сложение чисел с плавающей точкой
FP subtract double sub.d $x,$y,$z $x = $y — $z Вычитание чисел с плавающей точкой
FP multiply double mul.d $x,$y,$z $x = $y * $z Умножение чисел с плавающей точкой
FP divide double div.d $x,$y,$z $x = $y / $z Деление чисел с плавающей точкой
Передача данных Load word coprocessor lwcZ $x,CONST Coprocessor.DataRegister = Memory I Загружает 4 байта типа word из: MEM в регистр данных сопроцессора. Расширение знака.
Store word coprocessor swcZ $x,CONST  Memory = Coprocessor.DataRegister I Записывает 4 байта из регистра данных сопроцессора в MEM. Расширение знака.
Логические FP compare single c.lt.s $f2,$f4 if cond=1; else cond=0 Сравнение на меньшее команд с плавающей точкой. Одинарная точность.
FP compare double c.lt.d $f2,$f4 if cond=1; else cond=0 Сравнение на меньшее команд с плавающей точкой. Двойная точность.
Ветвление branch on FP true bc1t 100 if go to PC+4+100 если формат FP, выполняется ветвление.
branch on FP false bc1f 100 if go to PC+4+100 если фотмат не FP, выполняется ветвление.

Псевдоинструкции

Эти инструкции принимаются языком ассемблера MIPS, однако они не являются реальными. Ассемблер переводит их в последовательности настоящих инструкций.

Название Синтаксис инструкции Трансляция в обычную инструкцию значение
Load Address la $1, LabelAddr lui $1, LabelAddr; ori $1,$1, LabelAddr $1 = Маркировка адреса
Load Immediate li $1, IMMED lui $1, IMMED; ori $1,$1, IMMED $1 = 32-битное прямое значение
Branch if greater than bgt $rs,$rt,Label slt $at,$rt,$rs; bne $at,$zero,Label if PC=Label
Branch if less than blt $rs,$rt,Label slt $at,$rs,$rt; bne $at,$zero,Label if PC=Label
Branch if greater than or equal bge etc. if PC=Label
Branch if less than or equal ble if PC=Label
Branch if greater than unsigned bgtu if PC=Label
Branch if greater than zero bgtz if PC=Label
Multiplies and returns only first 32 bits mul $1, $2, $3 mult $2, $3; mflo $1 $1 = $2 * $3

Несколько других важных инструкций

  • NOP
  • Break
  • Системный вызов


Просмотров: 15853


<<< Alchemy (процессоры)
R8000 >>>