§ Базовые сведения

В данном случае ЛИС — это Легкая Информационная Система, процессор, который имеет небольшое количество инструкции. Особенность моего процессора:
  • Тип — CISC
  • Скорость — низкая
  • Разрядность — 32 бита
  • Шина данных — 8 бит
  • Количество регистров — 256 регистров
  • Размер стека — от 256 элементов, 32х битный
  • Группы инструкции — перемещения, арифметико-логические, сдвиговые, условные и безусловные переходы, стековые, умножение и деление
  • Операции — регистр-регистр
  • Защищенный режим — как повезёт
  • Доступ к портам — осуществляется через доступ к памяти
Задача подобного процессора заключается в том, чтобы сделать достаточно простой набор инструкции, с помощью которого можно что-то программировать. Он немного посложнее базового процессора ARM, но со своими особенностями. Например, это не RISC, инструкции могут быть крайне длинными, особенно инструкция PUSH и POP, количество операндов которое варьируется от 0 до 255.

§ Архитектура

Набор флагов: O — Overflow, S — Sign, Z — Zero, C — Carry. Всего лишь 4 флага, которые устанавливаются после выполнении операции АЛУ и сдвигов.

§ Инструкции

 00
MOV
A,u32
 01
MOV
A,B
 02
MOVB
A,[B]
 03
MOVW
A,[B]
 04
MOVD
A,[B]
 05
MOVB
[A],B
 06
MOVW
[A],B
 07
MOVD
[A],B
 08
MOVU
A,u8
 09
MOVS
A,s8
 0A
MUL
A*B=>H,L
 0B
DIV
A/B=>R,Q
 0C
CALL
u32
 0D
RET
 
 0E
PUSH
...
 0F
POP
...
 10
ADD
A,B,C
 11
ADC
A,B,C
 12
SUB
A,B,C
 13
SBC
A,B,C
 14
AND
A,B,C
 15
XOR
A,B,C
 16
OR
A,B,C
 17
 
 18
ROL
A,B
 19
ROR
A,B
 1A
SHL
A,B
 1B
SHR
A,B
 1C
RCL
A,B
 1D
RCR
A,B
 1E
MOVS
A,B,C
 1F
SAR
A,B
 20
JR
b8
 21
JMP
u32
 22
JC
b8
 23
JNC
b8
 24
JZ
b8
 25
JNZ
b8
 26
JBE
b8
 27
JA
b8
 28
JS
b8
 29
JNS
b8
 2A
JMP
AA
 2B
ADDS
A,s8
 2C
JL
b8
 2D
JNL
b8
 2E
JLE
b8
 2F
JG
b8
 30
ADD
A,B
 31
ADC
A,B
 32
SUB
A,B
 33
SBC
A,B
 34
AND
A,B
 35
XOR
A,B
 36
OR
A,B
 37
CMP
A,B
 38
FADD
A,B
 39
FSUB
A,B
 3A
FMUL
A,B
 3B
FDIV
A,B
 3C
FINT
A,B
 3D
FLD
A,B
 3E
 
 3F
 

§ Набор инструкции (ISA)

Перемещения
OPCМнемоникаОперандыЦикловОписание
00MOV A,u32AA **6Поместить непосредственное значение двойного слова в регистр A
01MOV A,BBB AA3Скопировать регистр B в регистр A
02MOVB A,[B]BB AA4Извлечь байт из памяти и запись в A с очисткой старших 24 бит в 0
03MOVW A,[B]BB AA5Извлечь слово из памяти и запись в A с очисткой старших 16 бит в 0
04MOVD A,[B]BB AA7Извлечь двойное слово из памяти в регистр A
05MOVB [A],BBB AA5Запись младших 8 бит регистра B в память A
06MOVW [A],BBB AA6Запись младших 16 бит регистра B в память A (little endian)
07MOVD [A],BBB AA8Запись регистра B в память A (little endian)
08MOVU A,u8AA **3Помещение unsigned значения байта в регистр A
09MOVS A,s8AA **3Помещение signed значения байта в регистр A
1EMOVS A,B,CAA BB CCСкопировать из A в B, количество байт C
Вычисление
OPCМнемоникаОперандыЦикловОписание
0AMUL A*B=>H,LAA BB HH LL5Беззнаковое умножение A x B с записью младшего результата в L, старшего в H. Сначала записывается старший
0BDIV A/B=>R,QAA BB RR QQ38Беззнаковое деление A на B с результатом в Q и остатком в R
Процедуры
OPCМнемоникаОперандыЦикловОписание
0CCALL u32**5Вызов процедуры, запись в стек следующего за CALL адреса PC
0DRET1Возврат из процедуры
Стек
OPCМнемоникаОперандыЦикловОписание
0EPUSH ...nn ...4+Запись nn регистров в стек, номера их следуют за параметром nn
0FPOP ...nn ...3+Извлечение из стека nn регистров, номера их следуют за параметром nn
АЛУ-3
OPCМнемоникаОперандыЦикловОписание
10ADD A,B,CAA BB CC4Сложение A + B с записью в C
11ADC A,B,CAA BB CC4Сложение с учетом переноса A + B с записью в C
12SUB A,B,CAA BB CC4Вычитание A - B с записью в C
13SBC A,B,CAA BB CC4Вычитание с учетом переноса A - B с записью в C
14AND A,B,CAA BB CC4Логическое A and B с записью в C
15XOR A,B,CAA BB CC4Логическое A xor B с записью в C
16OR A,B,CAA BB CC4Логическое A or B с записью в C
Сдвиги
OPCМнемоникаОперандыЦикловОписание
18ROL A,BAA BB4Циклический сдвиг регистра A налево
19ROR A,BAA BB4Циклический сдвиг регистра A вправо
1ASHL A,BAA BB4Логический сдвиг регистра A влево
1BSHR A,BAA BB4Логический сдвиг регистра A вправо
1CRCL A,BAA BB4Сдвиг регистра A влево, заполняя младшие биты значением CF
1DRCR A,BAA BB4Сдвиг регистра A вправо, заполняя старшие биты значением CF
1FSAR A,BAA BB4Сдвиг регистра A вправо, заполняя старшие биты значением старшего 31-го бита
Переход
OPCМнемоникаОперандыЦикловОписание
20JR b882Короткий переход -128..127
21JMP u32325Перейти по 32-х битному адресу
22JC b881-2Короткий переход если CF=1
23JNC b881-2Короткий переход если CF=0
24JZ b881-2Короткий переход если ZF=1
25JNZ b881-2Короткий переход если ZF=1
26JBE b881-2Короткий переход если CF=1 AND ZF=1
27JA b881-2Короткий переход если CF=0 OR ZF=0
28JS b881-2Короткий переход если SF=1
29JNS b881-2Короткий переход если SF=0
2AJMP AAAA3Перейти на адрес, указанный в регистре A
2CJL b881-2Знаковое сравнение и если A < B, переход
2DJNL b881-2Знаковое сравнение и если A >= B, переход
2EJLE b881-2Знаковое сравнение и если A <= B, переход
2FJG b881-2Знаковое сравнение и если A > B, переход
АЛУ
OPCМнемоникаОперандыЦикловОписание
2BADDS A,s8AA **Прибавить знаковое число к регистру A
АЛУ-2
OPCМнемоникаОперандыЦикловОписание
30ADD A,BAA BB4Сложение A + B с записью в A
31ADC A,BAA BB4Сложение с учетом переноса A + B с записью в A
32SUB A,BAA BB4Вычитание A - B с записью в A
33SBC A,BAA BB4Вычитание с учетом переноса A - B с записью в A
34AND A,BAA BB4Логическое A and B с записью в A
35XOR A,BAA BB4Логическое A xor B с записью в A
36OR A,BAA BB4Логическое A or B с записью в A
37CMP A,BAA BB4Логическое A or B с записью в A
FLOAT
OPCМнемоникаОперандыЦикловОписание
38FADD A,BAA BB4A = A + B
39FSUB A,BAA BB4A = A - B
3AFMUL A,BAA BB4A = A * B
3BFDIV A,BAA BB28A = A / B
3CFINT A,BAA BB4Конвертирование B в Integer A
3DFLD A,BAA BB4Конвертирование B в Float32 B