|
|
Компьютеры - MIPS (архитектура) - Язык ассемблера MIPS24 февраля 2011 https://traveler.market байкал на коньках тур по льду баи кала на коньках.
Оглавление: 1. MIPS (архитектура) 2. История 3. MIPS IV 4. Семейство процессоров с архитектурой MIPS 5. Формат инструкций MIPS I 6. Язык ассемблера MIPS 7. Использование регистра транслирования 8. Эмуляторы 9. Список процессоров на базе архитектуры MIPS по компаниям
https://spe-c.ru расчет стоимости разработки паспорта безопасности.
Данные инструкции языка ассемблера имеют прямую аппаратную реализацию, в отличие от псевдоинструкций, которые перед сборкой транслируются в настоящие составные инструкции.
- Далее, регистровые буквы 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 |
|
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
- Системный вызов
Просмотров: 16314
|