Материал: Архитектура и программирование MIPS-процессоров. Разинкин К.А

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Как и другие команды, команды типа J начинаются с 6-битного поля кода операции (opcode). Оставшиеся биты используются для указания адреса перехода (addr).

2.2.Арифметические и логические инструкции

Вархитектуре MIPS определены разнообразные арифметические и логические инструкции. Сейчас мы кратко с ними ознакомимся поскольку они пригодятся нам в дальнейшем для построения высокоуровневых программных конструкций.

Вархитектуре MIPS имеются логические операции AND, OR, XOR и NOR. Соответствующие им одноименные инструкции типа R производят побитовые операции над значениями двух регистров-источников и помещают результат в ре- гистр-назначение. На Рис. 2.8 продемонстрированы примеры выполнения этих операций с двумя исходными значениями, 0xFFFF0000 и 0x46A1F0B7. На рисунке показаны значения, попадающие в регистр-назначение rd после того, как инструкции выполнены.

Рис. 2.8. Логические операции

Инструкция and полезна для наложения маски (англ. masking) на биты, т.е. для обнуления ненужных битов. На рис. 2.8 показана операция 0xFFFF0000 AND 0x46A1F0B7 = 0x46A10000. Инструкция and маскирует два младших байта и помещает два старших незамаскированных байта со значением

56

0x46A1 из регистра $s2 в регистр $s3. Маска может быть наложена на любое подмножество битов регистра.

Инструкцию or хорошо использовать для объединения битов из двух регистров. Например, в результате операции

0x347A0000 OR 0x000072FC = 0x347A72FC мы получили ком-

бинацию двух значений.

В архитектуре MIPS не определена операция инвертирования битов NOT, но так как A NOR $0 = NOT A, то инструкцию NOR можно использовать в качестве замены (прим. переводчика: инструкция NOR сначала делает операцию OR с исходными значениями, затем побитно инвертирует результат этой операции).

Логические инструкции также могут работать с непосредственными операндами. Это такие инструкции типа I, как andi, ori и xori. Инструкция nori не определена потому, что редко нужна и легко может быть заменена уже имеющимися инструкциями.

На рис. 2.9 продемонстрированы примеры выполнения инструкций andi, ori и xori.

На рисунке показаны значения регистра-источника и непосредственного операнда, а также содержимое регистраназначения rt по завершении выполнения инструкций. Поскольку эти инструкции работают с 32-битным значением регистра и 16-битной константой, то сначала они дополняют константу до 32 бит нулями.

Рис. 2.9. Логические операции над непосредственными операндами

57

Инструкции сдвига сдвигают значение в регистре влево или вправо на любое заданное количество бит, вплоть до 31. Операции сдвига фактически умножают или делят сдвигаемые значения на степени двойки. В архитектуре MIPS существуют следующие инструкции сдвига: sll (логический сдвиг влево, англ.: shift left logical), srl (логический сдвиг вправо, англ.: shift right logical) и sra (арифметический сдвиг вправо, англ.: shift right arithmetic).

На рис. 2.10 показан машинный код инструкций sll, srl и sra. В регистре rt (т.е. $s1) хранится 32-битное значение, которое нужно сдвигать, поле shamt задаёт величину сдвига (4). Результат сдвига помещается в регистр rd.

Рис. 2.10. Машинные коды инструкций сдвига типа R

Рис. 2.11 иллюстрирует пример работы инструкций сдвига sll, srl и sra. Сдвиг значения влево на N битов эквивалентен умножению на 2N. Аналогично, арифметический сдвиг значения вправо на N битов эквивалентен делению на 2N.

Рис. 2.11. Операции сдвига

58

Загрузка констант

Как показано в представленном ниже примере кода, инструкцию addi удобно использовать для присвоения переменным значений 16-битных констант.

16-Битная константа

Код на языке высокого уровня int a = 0x4f3c;

Код на языке ассемблера MIPS

# $s0 = a

addi $s0, $0, 0x4f3c # a = 0x4f3c

Для присвоения переменным значений 32-битных констант следует использовать инструкцию lui (англ.: load upper immediate), которая загружает константу в старшие 16 бит регистра и обнуляет младшие 16 битов, а также инструкцию ori для загрузки константы в младшие 16 бит без изменения старших, как показано в примере ниже.

32-Битная константа

Код на языке высокого уровня int a = 0x6d5e4f3c;

Код на языке ассемблера MIPS

# $s0 = a

lui $s0, 0x6d5e

# a = 0x6d5e0000

ori $s0, $s0, 0x4f3c

# a = 0x6d5e4f3c

Инструкции умножения и деления

Умножение и деление отличаются от других арифметических операций. Умножение двух 32-битных чисел даёт 64битное произведение. Деление двух 32-битных чисел даёт 32битное частное и 32-битный остаток.

В архитектуре MIPS определено два регистра специального назначения hi и lo, в которые сохраняются результаты

59

умножения и деления. Инструкция

mult $s0, $s1

умножает

значения из регистров

$s0 и $s1. Старшие 32 бита произведения

помещаются в регистр

hi, а младшие –

в регистр lo. Аналогично,

инструкция div $s0, $s1 вычисляет значение $s0/$s1.

Частное по-

мещается в lo, а остаток – в hi.

 

 

В архитектуре MIPS есть и другая команда умножения,

которая

помещает

32-битный результат в регистр общего

назначения.

 

 

 

 

Инструкция

mul $s1, $s2, $s3

умножает значения из

$s2 и $s3

и сохраняет 32-битный результат в $s1

(прим. пе-

реводчика: при использовании инструкции mul старшие 32 бита произведения нигде не сохраняются).

2.3. Переходы

Преимуществом компьютера над калькулятором является способность принимать решения. Компьютер выполняет разные задачи в зависимости от входных данных. Например,

операторы if/else, операторы switch/case, циклы while и for вы-

полняют те или иные части кода в зависимости от результата проверки некоторых условий.

Для последовательного выполнения инструкций счетчик команд увеличивается на 4 после каждой из них. Инструкции переходов изменяют счетчик программы для того, чтобы пропустить некоторые участки кода или повторить предыдущий код. Инструкции условных переходов, также называемые инструкциями ветвления (англ.: branch), проверяют какое-либо условие и осуществляют переход только в том случае, если проверка возвращает ИСТИНУ. Инструкции безусловного перехода (англ.: jump) осуществляют переход всегда.

Условные переходы

Система команд MIPS содержит две основные инструкции условного перехода: ветвление при равенстве (beq, от

60

Источник: https://studfile.net/preview/16568788/