§ Принципы
Процессор с 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 - регистр управления
§ Таблица флагов
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
I | SV | S | O | Z | C |
- SV - бит супервизора, находится в защищенном режиме
- I - разрешение прерываний, переключить можно только когда SV=1
§ Условные суффиксы
xxx | Суффикс | Условие исполнения |
---|---|---|
000 | NC | CF=0 |
001 | C | CF=1 |
010 | NZ | ZF=0 |
011 | Z | ZF=1 |
100 | LE | ZF=1 || SF!=OF |
101 | GT | ZF=0 && SF==OF |
110 | NS | SF=0 |
111 | S | SF=1 |
§ Кодирование беззнакового непосредственного значения (unsigned int)
При считывании значений imm из памяти используется "chain little endian", значащие биты считываются по 7 бит, 8-й бит является маркером, считывать ли далее.7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
C | Биты 6-0 |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
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 | Ничего не делать | |||
01 | rel | 0111 1110 → call $-2 | Вызов процедуры. Из стека SP вычитается 4 (байта, если 32-х битная архитектура), записывается следующий ip после инструкции call, и происходит переход по адресу. | |
02 | Возврат из процедуры, адрес = [sp]; sp = sp + 2 | |||
Инструкции перемещения | ||||
04 | IdddIsss |
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] |
Перемещение из s в d.
|
|
05 | RdddRsss |
1000 0000 → mov flags, a 1000 0111 imm → mov flags, imm 0111 1111 → mov ip, cr 1000 1111 → mov flags, cr |
Перемещение из специальных регистров в обычный s в d.
|
|
Арифметико-логические инструкции | ||||
10 | IdddIsss | 0111 0001 → add ip, b | Сложение d + s | |
11 | 0000 0111 imm → or a, imm | Логическое ИЛИ | ||
12 | 0000 1111 imm → adc a, [imm] | Сложение d + s + CF | ||
13 | 0111 1111 imm → sbb ip, [imm] | Вычитание d - s - CF | ||
14 | 1111 1111 imm1 imm2 → and [imm1], [imm2] | Логическое И | ||
15 | 0010 0001 imm → sub c, b | Вычитание d - s | ||
16 | 0010 0100 sign → xor c, [x + sign] | Исключающее ИЛИ | ||
17 | 1101 1100 s1 s2 → cmp [y + s1], [x + s2] | Сравнение d и s | ||
Сдвиговые инструкции | ||||
18 | IdddIsss | Вращение влево | ||
19 | Вращение вправо | |||
1A | Сдвиг влево с заемом из CF | |||
1B | Сдвиг вправо с заемом из CF | |||
1C | Логический сдвиг влево | |||
1D | Логический сдвиг вправо | |||
1E | Сдвиг влево, копируя бит 0 | |||
1F | Арифметический сдвиг вправо | |||
Условные переходы | ||||
20 | rel | 0000 0000 → jnc $-0x40 | Переход к метке, если CF=0 | |
21 | rel | Переход к метке, если CF=1 | ||
22 | rel | Переход к метке, если ZF=0 | ||
23 | rel | Переход к метке, если ZF=1 | ||
24 | rel | Переход к метке, если d <= s с учетом знака | ||
25 | rel | Переход к метке, если d > s с учетом знака | ||
26 | rel | Переход к метке, если SF=0 | ||
27 | rel | Переход к метке, если SF=1 |