В зависимости от операндов и типа инструкции существует несколько схем кодирования, но все они состоят из 32 битов, а первые шесть указывают код операции инструкции (add, lw и т. Д.).
Кодировка регистра : эта инструкция действует только для регистров. Первые шесть битов равны 0, затем есть три поля по пять битов, которые определяют соответственно первый и второй регистр источника и регистр назначения. Наконец, есть еще шесть битов, которые определяют функцию (сложение, подпрограмма и т. Д.)
Немедленное кодирование : у этой инструкции есть операнд, который является ячейкой памяти. После шести битов кода операции есть два поля по пять битов для первого и второго регистра и поле из шестнадцати битов для ячейки памяти.
Кодирование перехода : они состоят из шести битов кода операции и двадцати шести битов назначения перехода
Эта статья объясняет кодировку этих инструкций и содержит список всех кодов операций / функций в двоичном формате. После того как вы определили двоичную форму, просто преобразуйте ее в десятичную и шестнадцатеричную.
Пример:
Предположим, нам нужна кодировка lw $s5, -20($s6)
. Это относится к категории немедленное кодирование , кодировка которой ooooooss sssttttt iiiiiiii iiiiiiii
, где o - это код операции, s первый регистр, t второй регистр и i константа. Глядя на таблицу, мы находим код операции для lw
, равный 100011
. Достаточно указать номер регистра, поэтому s равно 00101
, а t равно 00110
. Константа (-20) представлена дополнением 2s. При 20, равном 10100
, его 2-секундное дополнение к 16-битному равно 1111111111101100
. lw
имеет синтаксис loadstore , шаблон которого o $t, i ($s)
, поэтому регистры меняются местами в кодировке. Поэтому кодировка инструкции для lw $s5, -20($s6)
равна
ooooooss sssttttt iiiiiiii iiiiiiii
10001100 11000101 11111111 11101100
или 8C C5 FF EC
(гекс) и 140 197 255 236
(декабрь)