У нас будут команды двух-, одно- или нульместные. Основной формат команды будет 8-ми битный.
1. Двухоперандная команда:
Закодируем следующим образом:
00 – команда сложения (ADD), которая работает следующим образом Rb¬Ra+Rb
01 – LOAD (чтение из памяти), которая работает следующим образом: в регистр Rb заносится содержимое ячейки памяти по адресу Ra: Rb¬M[Ra]
10 – store (сохранение, запись), алгоритм: M[Ra]¬Rb
11 – признак однооперандной команды.
2. Понятно что для однооперандной команды у нас требуется наличие какого-то одного регистра в качестве хранителя этого операнда поэтому мы в качестве хранителя этого операнда поэтому мы в качестве него мы выберем регистр В,
а 3 освободившихся разряда будем использовать для кодирования кода операции однооперандной операции, где
000 – CLR(команда очистки), алгоритм: Rb¬0
001 – NOT(команда отрицания),алгоритм выполнения: Rb¬~Rb
010 – INC(команда увеличения на 1) алгоритм: Rb¬Rb+1
011 – LOADI (загрузка непосредственно) за командой непосредственно следуют 4 байта загружаемых данных алгоритм: Rb¬M[PC+1]
100 – SHL (сдвиг влево) алгоритм:Rb¬Rb<<1
101 – SHR алгоритм: Rb¬Rb>>1
110 – JC(переход если установлен флаг переноса) алгоритм:PC¬CF?Rb:PC+1
111 – префикс нульместной операции
3. Нульоперандная команда:
У нас есть операции только условного перехода.Для того чтобы сделать безусловный переход мы должны установить операции сброса установки флага. Если мы сбросим флаг, а потом выполним JC, то понятно, что у нас будет переход по содержимому регисра В, а если мы сбросим, то это команда будет называться «нет операции», состоящая из 2 байт.
000 – STC(установка флага переноса) алгоритм:CF¬1
001 — CLC(сброс флага переноса) алгоритм: CF¬0
010 – STI(установка флага прерывания)
011 – CLI(сброс флаго прерывания)
100 – CPO флаг переполнения
101 – CPZ флаг нуля
110 – CPS флаг знака
алгоритм: CF¬{O,Z,S}F в флаг переноса записывается флаг переполнения нуля знака результа. Эти флаги получаются на предыдущей операции. Эти флаги изменяют только 4 команды:сложения, сдвига.
