§ Принципы

Процессор с 32-й шиной адреса и данными. Регистры 32-х разрядные. Возможна любая разрядность. Размер непосредственного операнда от 1 до 5 байт, но можно сколько угодно.

§ Состояния

Доступны следующие флаги: O,S,Z,C
  • O - флаг переполнения знака результата, возникает, когда результат не вмещается
  • S - флаг, скопированный из старшего бита результата
  • Z - если результат равен 0
  • C - при переносе из старшего бита

§ Регистры

Общие
  • a, b, c, d - регистры общего назначения
  • x, y - индекс и общего назначения
  • sp - стек
  • ip - указатель исполнения кода

§ Специальные

  • 000 flags - регистр флагов, состояния уровня доступа
  • 001 pdbr - указатель на главную страницу в страничном механизме
  • 010 idtr - таблица прерываний
  • 111 cr - регистр управления

§ Таблица флагов

76543210
ISVSOZC
Описание некоторых битов
  • SV - бит супервизора, находится в защищенном режиме
  • I - разрешение прерываний, переключить можно только когда SV=1

§ Условные суффиксы

xxxСуффиксУсловие исполнения
000NC CF=0
001C CF=1
010NZ ZF=0
011Z ZF=1
100LE ZF=1 || SF!=OF
101GT ZF=0 && SF==OF
110NS SF=0
111S SF=1

§ Кодирование беззнакового непосредственного значения (unsigned int)

При считывании значений imm из памяти используется "chain little endian", значащие биты считываются по 7 бит, 8-й бит является маркером, считывать ли далее.
76543210
CБиты 6-0
76543210
CБиты 13-7
...
Примеры:
  • 7F - кодирование 127
  • FF 01 - кодирование 127 + 1*128 = 255
  • FF 7F - кодирование 127 + 127*128 = 16383
  • FF FF 01 - кодирование 127 + 127*128 + 1*16384 = 32767

§ Кодирование знакового (signed int)

Для кодирования знакового значения используется тот же самый принцип "chain little endian", но при разном количестве используемых бит вычитается разные числа. Если значение кодируется 1-м байтом, то вычитается 26 (64), если двумя, то 213 = 8192, общая формула при N байт: 27N-1
Примеры:
  • 00 - кодируется 0 - 64 = -64
  • 7F - кодируется 127 - 64 = 63
  • 80 00 - 0 + 0*128 = 0 - 8192 = -8192
  • FF 00 - 127 + 0*128 = 127 - 8192 = -8065
  • FF 7F - 127 + 127*128 = 16383 - 8192 = 8191

§ Кодирование операндов IdddIsss

Операнд состоит из 2-х частей - старшая часть идет первым операндом, второй операнд - младшая часть. Вместо ddd и sss кодируются регистры d(приемник), s(источник). Если I=1, то тогда вместо прямого перемещения из регистра в регистр используется непрямое, косвенное перемещение по тому адресу, который указывается в регистре d или s.
Случай, когда вместо d используется ip, кодируется отдельно. Здесь при I=0 будет использоваться регистр ip, а при I=1 будет использоваться непосредственное беззнаковое число, которое идет сразу после байта описания операндов. При s=ip, будет либо использоваться непосредственный беззнаковый операнд (при I=0), либо же непосредственный операнд будет косвенным, т.е. вот так [imm].
При использовании косвенно регистров x, y и sp, будет добавляться знаковое значение к этим регистрам перед тем, как значение из памяти будет извлечено.

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

Одна инструкция состоит из 2 частей - указания опкода и указания операндов.
ОпкодОперандыМнемоникаПримеры операндовОписание
Специальные
00 nop Ничего не делать
01 rel call rel 0111 1110 → call $-2 Вызов процедуры. Из стека SP вычитается 4 (байта, если 32-х битная архитектура), записывается следующий ip после инструкции call, и происходит переход по адресу.
02 ret Возврат из процедуры, адрес = [sp]; sp = sp + 2
Инструкции перемещения
04 IdddIsss mov d, s 0000 0000 → xch a
0000 0001 → mov a, b
0111 0101 → mov ip, y
0000 1001 → mov a, [b]
1000 0001 → mov [a], b
1000 1001 → mov [a], [b]
0100 0101 → mov x, y
0100 0111 imm → mov x, imm
0000 1111 imm → mov a, [imm]
0100 1101 sign → mov x, [y + sign]
1100 1101 s1 s2 → mov [x + s1], [y + s2]
0000 1110 sign → mov a, [sp + sign]
1111 1111 imm1 imm2 → mov [imm1], [imm2]
0111 1110 imm sign → mov [imm], [sp + sign]
Перемещение из s в d.
  • Наличие I=1 означает, что адресуется память через указатель на регистр
  • При указании регистра s=111 (7), используется непосредственный операнд
  • При указании регистра d=0111, используется ip, а если d=1111, то [imm]
  • При возведенных двух I сканируется сначала imm, относящийся к d, потом к s операнду.
  • При использовании x, y или sp, обязательно добавляется signed int
  • Если s = d, то тогда в регистре s обменивается местами старшая и младшая часть регистра (xch)
05 RdddRsss mov d, s 1000 0000 → mov flags, a
1000 0111 imm → mov flags, imm
0111 1111 → mov ip, cr
1000 1111 → mov flags, cr
Перемещение из специальных регистров в обычный s в d.
  • Если указан R=1, то используется специальный регистр, иначе обычные и между ними
  • Если s=111, то считывается из imm
  • При RR=00, между регистрами будет перемещение только половины от их разрядности
Арифметико-логические инструкции
10 IdddIsss add d, s 0111 0001 → add ip, b Сложение d + s
11 or d, s 0000 0111 imm → or a, imm Логическое ИЛИ
12 adc d, s 0000 1111 imm → adc a, [imm] Сложение d + s + CF
13 sbb d, s 0111 1111 imm → sbb ip, [imm] Вычитание d - s - CF
14 and d, s 1111 1111 imm1 imm2 → and [imm1], [imm2] Логическое И
15 sub d, s 0010 0001 imm → sub c, b Вычитание d - s
16 xor d, s 0010 0100 sign → xor c, [x + sign] Исключающее ИЛИ
17 cmp d, s 1101 1100 s1 s2 → cmp [y + s1], [x + s2] Сравнение d и s
Сдвиговые инструкции
18 IdddIsss rol d, s Вращение влево
19 ror d, s Вращение вправо
1A rcl d, s Сдвиг влево с заемом из CF
1B rcr d, s Сдвиг вправо с заемом из CF
1C shl d, s Логический сдвиг влево
1D shr d, s Логический сдвиг вправо
1E sal d, s Сдвиг влево, копируя бит 0
1F sar d, s Арифметический сдвиг вправо
Условные переходы
20 rel jnc 0000 0000 → jnc $-0x40 Переход к метке, если CF=0
21 rel jc Переход к метке, если CF=1
22 rel jnz Переход к метке, если ZF=0
23 rel jz Переход к метке, если ZF=1
24 rel jle Переход к метке, если d <= s с учетом знака
25 rel jgt Переход к метке, если d > s с учетом знака
26 rel jns Переход к метке, если SF=0
27 rel js Переход к метке, если SF=1