VAX-11/Система команд: различия между версиями
Panther (обсуждение | вклад) |
Panther (обсуждение | вклад) |
||
| (не показана 1 промежуточная версия этого же участника) | |||
| Строка 349: | Строка 349: | ||
= Таблица команд процессора VAX-11/750 = | = Таблица команд процессора VAX-11/750 = | ||
Сводная таблица команд процессора VAX-11/750 (реализует практически полный набор инструкций архитектуры VAX-11) | Сводная таблица команд процессора VAX-11/750 (реализует практически полный набор инструкций архитектуры VAX-11). | ||
Коды команд (opcode) указаны в шестнадцатеричном виде. Для инструкций плавающей точки формата G/H применяется двухбайтовый код с префиксом <code>FD</code> (указан как <code>xx FD</code>). | Коды команд (opcode) указаны в шестнадцатеричном виде. Для инструкций плавающей точки формата G/H применяется двухбайтовый код с префиксом <code>FD</code> (указан как <code>xx FD</code>). | ||
| Строка 606: | Строка 606: | ||
| 04 || RET || — || Возврат из процедуры (CALLG/CALLS) | | 04 || RET || — || Возврат из процедуры (CALLG/CALLS) | ||
|} | |} | ||
== Управление циклами и многовариантный выбор == | == Управление циклами и многовариантный выбор == | ||
Текущая версия от 12:46, 10 апреля 2026
| Этот документ создан для Emuverse и распространяется на условиях лицензии CC-BY-SA-3.0. |
Регистры
| Номер (dec) | Номер (hex) | Имя | Назначение |
|---|---|---|---|
| 0 | 0 | R0 | Общего назначения; младший результат MUL/DIV |
| 1 | 1 | R1 | Общего назначения; старший результат MUL/DIV |
| 2 | 2 | R2 | Общего назначения |
| 3 | 3 | R3 | Общего назначения |
| 4 | 4 | R4 | Общего назначения |
| 5 | 5 | R5 | Общего назначения |
| 6 | 6 | R6 | Общего назначения |
| 7 | 7 | R7 | Общего назначения |
| 8 | 8 | R8 | Общего назначения |
| 9 | 9 | R9 | Общего назначения |
| 10 | A | R10 | Общего назначения |
| 11 | B | R11 | Общего назначения |
| 12 | C | R12 / AP | Argument Pointer — указатель на список аргументов процедуры |
| 13 | D | R13 / FP | Frame Pointer — указатель на фрейм стека |
| 14 | E | R14 / SP | Stack Pointer — указатель стека |
| 15 | F | R15 / PC | Program Counter — счётчик команд |
Все регистры (R0–R15/PC) 32-битные. Доступ к частям регистра производится через операнды с типами byte/word, читающие/пишущие младшие биты с sign/zero extension.
Кодирование инструкций VAX-11
Инструкции представляют собой поток байтов в следующем формате:
[ prefix byte ] [ opcode byte ] [ operand specifier ] [ operand specifier ] ...
- Prefix — только для двухбайтовых опкодов (FD, FE, FF для расширений)
- Opcode — 1 байт (большинство инструкций)
- Операнды следуют подряд, каждый описывается operand specifier-ом
Operand Specifier
Каждый операнд начинается с одного байта вида:
7 4 3 0 +-----+-----+ | mod | reg | +-----+-----+
| Байт (hex) | Режим | Синтаксис | Доп. байты | Примечание |
|---|---|---|---|---|
| 00–3F | Short Literal | #0..#63 | — | Биты 5–0 — значение; mod=00/01/02/03 |
| 4n | Index | [Rn] | — | Модификатор следующего спецификатора; масштаб по типу операнда |
| 5n | Register | Rn | — | Значение в регистре |
| 6n | Register Deferred | (Rn) | — | Содержимое Rn — адрес операнда |
| 7n | Autodecrement | -(Rn) | — | Rn уменьшается на размер типа до обращения |
| 8n | Autoincrement | (Rn)+ | — | Rn увеличивается на размер типа после обращения |
| 8F | Immediate | #imm | N байт | N = размер типа операнда; следует за спецификатором |
| 9n | Autoincrement Deferred | @(Rn)+ | — | Rn++ на 4 (longword-адрес) |
| 9F | Absolute | @#addr | 4 байта | Абсолютный 32-битный адрес |
| An | Byte Displacement | B^disp(Rn) | 1 байт | Знаковое смещение −128..+127 |
| AF | Byte Relative | B^label | 1 байт | Смещение от PC после спецификатора |
| Bn | Byte Displacement Deferred | @B^disp(Rn) | 1 байт | Адрес берётся из памяти по смещению |
| BF | Byte Relative Deferred | @B^label | 1 байт | |
| Cn | Word Displacement | W^disp(Rn) | 2 байта | Знаковое смещение −32768..+32767 |
| CF | Word Relative | W^label | 2 байта | |
| Dn | Word Displacement Deferred | @W^disp(Rn) | 2 байта | |
| DF | Word Relative Deferred | @W^label | 2 байта | |
| En | Longword Displacement | L^disp(Rn) | 4 байта | Полное 32-битное смещение |
| EF | Longword Relative | L^label | 4 байта | |
| Fn | Longword Displacement Deferred | @L^disp(Rn) | 4 байта | |
| FF | Longword Relative Deferred | @L^label | 4 байта |
Здесь n = номер регистра (0–E для R0–SP), F = PC (R15). Режимы с F в поле регистра — это PC-relative варианты соответствующих displacement-режимов, которые ассемблер выбирает автоматически по дистанции до метки.
0: Литеральный режим
Если биты 7–6 = 00, весь байт трактуется как 6-битный литерал (значения 0–63), независимо от поля reg. Это экономия на маленьких константах.
7 6 5 0 +---+---------------+ |0 0| value | → short literal, 0..63 +---+---------------+
4n: Индексный режим
mod=4 модифицирует следующий operand specifier. Эффективный адрес:
EA = base_EA + Rn * sizeof(тип операнда)
Масштаб берётся из типа инструкции, а не из спецификатора.
Пример: массив longword-ов
; int32_t table[10] — массив по абсолютному адресу ; R3 — индекс ; R0 — результат MOVL table[R3], R0
Кодирование:
MOVL opcode = D0 Операнд 1: table[R3] 43 — Index, Rn=3 EF — Longword Relative (base = PC + disp) xx xx xx xx — 4 байта смещения до table от PC Операнд 2: R0 50 — Register, R0 Итого: D0 43 EF <disp32> 50
Эффективный адрес = &table + R3 * 4 (MOVL → тип longword → масштаб 4)
5n — Регистровый
Операнд является значением в регистре.
Кодирование MOVL R2, R0:
D0 — MOVL 52 — Register, Rn=2 (источник) 50 — Register, Rn=0 (приёмник)
Ограничение: если инструкция требует операнд в памяти (например, PUSHAL, CALLS — адрес), Register не подходит — нужен адрес, а не значение.
6n — Регистровый косвенный
Регистр содержит адрес операнда. Одно обращение к памяти.
MOVL (R3), (R2) ; Mem[R2] := Mem[R3] Кодирование: D0 — MOVL 63 — Register Deferred, Rn=3 (источник) 62 — Register Deferred, Rn=2 (приёмник)
7n, 8n — Автодекрементный и автоинкрементный
- Автодекрементный: сначала регистр уменьшается на размер типа, затем используется как адрес.
- Автоинкрементный: Сначала используется текущее значение регистра как адрес, затем регистр увеличивается.
MOVL -(R2), R0 ; R2 -= 4; R0 := Mem[R2] MOVB -(R2), R0 ; R2 -= 1; R0 := Mem[R2] MOVW -(R2), R0 ; R2 -= 2; R0 := Mem[R2] MOVL (R2)+, R0 ; R0 := Mem[R2]; R2 += 4 MOVB (R2)+, R0 ; R0 := Mem[R2]; R2 += 1
Кодирование MOVL -(R2), R0:
D0 — MOVL 72 — Autodecrement, Rn=2 50 — Register R0
Пример: работа со стеком
; PUSH longword в R1: MOVL R1, -(SP) ; SP -= 4; Mem[SP] := R1 ; POP longword в R0: MOVL (SP)+, R0 ; R0 := Mem[SP]; SP += 4
Фактически, PUSHL / POPL обёртки над MOVL:
PUSHL R1 → MOVL R1, -(SP) ; нет POPL — используют MOVL (SP)+, Rn
Пример: обход массива
; R2 = указатель на начало массива int32_t
; R3 = счётчик элементов
loop:
MOVL (R2)+, R0 ; R0 := *p++
; ... обработка R0 ...
SOBGTR R3, loop ; R3--; если R3 > 0 — перейти
Каждую итерацию R2 автоматически продвигается на 4 — нет необходимости в ADDL.
Пример: копирование массива в цикле
MOVL (R2)+, (R3)+ ; Mem[R3] := Mem[R2]; R2+=4; R3+=4
Оба указателя продвигаются за одну инструкцию. Порядок: сначала вычисляются оба EA, затем оба регистра обновляются.
9n — Автоинкрементный косвенный
Происходит двойное разыменование: регистр содержит адрес адреса операнда. После чтения регистр увеличивается на 4 (всегда — longword, потому что читается адрес, а не данные).
EA = Mem[Rn] — читаем адрес из памяти Rn := Rn + 4 — продвигаем на размер указателя
Два обращения к памяти: сначала за адресом, потом за данными.
Сравнение с Autoincrement:
MOVL (R2)+, R0 ; R0 := Mem[R2]; R2 += 4 — читаем данные MOVL @(R2)+, R0 ; R0 := Mem[Mem[R2]]; R2 += 4 — читаем указатель, потом данные
Особый случай: @(PC)+ = Absolute 9F
Аналогично тому как (PC)+ = Immediate, @(PC)+ = Absolute:
EA = Mem[PC]; PC += 4
Следующие 4 байта в потоке команд — это сам 32-битный адрес операнда.
MOVL @#0x1234ABCD, R0 ; D0 9F CD AB 34 12 50 ; ^^— Autoincrement Deferred PC (= Absolute) ; ^^^^^^^^^^^— адрес операнда в потоке команд
An: С байтовым смещением
За байтом спецификатора следует 1 байт знакового смещения. Эффективный адрес:
EA = Rn + sign_extend(disp8)
Смещение знаковое: диапазон −128..+127 байт от базового регистра.
Кодирование
+------+------+ +----------+ | A | Rn | | disp8 | +------+------+ +----------+ байт 1 байт 2
MOVL 4(R2), R0 ; EA = R2 + 4 D0 — MOVL A2 — Byte Displacement, Rn=2 04 — смещение +4 50 — Register R0
MOVL -8(R2), R0 ; EA = R2 - 8 D0 — MOVL A2 — Byte Displacement, Rn=2 F8 — смещение −8 (0xF8 = −8 в дополнительном коде) 50 — Register R0
Главное применение — поля структур
// R2 = указатель на struct Point MOVL (R2), R0 ; R0 := p->x (offset 0 — Register Deferred, 1 байт) MOVL 4(R2), R1 ; R1 := p->y (offset 4 — Byte Displacement, 2 байта) MOVL 8(R2), R3 ; R3 := p->z (offset 8 — Byte Displacement, 2 байта)
Особый случай: Byte Relative — AF
Частный случай Byte Displacement с Rn=PC. Ассемблер использует его для переходов и обращений к статическим переменным в пределах ±127 байт от текущей инструкции:
MOVL near_var, R0 ; AF <disp8> — если near_var близко
В момент вычисления EA PC уже указывает на следующий байт после спецификатора, поэтому смещение считается от его конца.
Bn: С байтовым смещением косвенный
По вычисленному адресу читается указатель, и уже он используется как EA.
tmp = Rn + sign_extend(disp8) EA = Mem[tmp]
MOVL @4(R2), R0 ; tmp = R2+4; R0 := Mem[Mem[tmp]] D0 — MOVL B2 — Byte Displacement Deferred, Rn=2 04 — смещение +4 50 — Register R0
Cn–Fn: прочие режимы
Режимы Cn–Fn полностью аналогичны байтовым режимам, за исключением размера операнда: word представляет два байта смещения в диапазоне −32768..+32767, longword — знаковые 4 байта.
При этом для PC-relative смещение считается от конца своего спецификатора вместе с байтами смещения — PC к тому моменту уже прошёл их все.
PC-relative
PC-relative режимы (reg=F) это PC-relative addressing — assembler автоматически выбирает byte/word/longword displacement в зависимости от дистанции.
Пример: ADDL2 #5, R0 — прибавить 5 к регистру R0, размер операнда L, команда двухадресная
ADDL2 opcode = C0 #5 → immediate: mod=8, reg=F → байт 8F, затем 4 байта: 05 00 00 00 R0 → register: mod=5, reg=0 → байт 50 Итого: C0 8F 05 00 00 00 50
Таблица команд процессора VAX-11/750
Сводная таблица команд процессора VAX-11/750 (реализует практически полный набор инструкций архитектуры VAX-11).
Коды команд (opcode) указаны в шестнадцатеричном виде. Для инструкций плавающей точки формата G/H применяется двухбайтовый код с префиксом FD (указан как xx FD).
Обозначения типов операндов:
.r— чтение (read).w— запись (write).m— чтение/модификация (modify).a— адрес (address).b— смещение ветвления (branch displacement).v— битовое поле (field)b/w/l/q/o— байт / слово / длинное слово / квадрослово / октасловоf/d/g/h— форматы плавающей точки F / D / G / H
Пересылка данных и адресов
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| 90 | MOVB | src.rb, dst.wb | Пересылка байта |
| B0 | MOVW | src.rw, dst.ww | Пересылка слова (16 бит) |
| D0 | MOVL | src.rl, dst.wl | Пересылка длинного слова (32 бита) |
| 7D | MOVQ | src.rq, dst.wq | Пересылка квадрослова (64 бита) |
| 7D FD | MOVO | src.ro, dst.wo | Пересылка октаслова (128 бит) |
| 9A | MOVZBW | src.rb, dst.ww | Пересылка байта в слово с заполнением нулями |
| 9B | MOVZBL | src.rb, dst.wl | Пересылка байта в длинное слово с нулями |
| 3C | MOVZWL | src.rw, dst.wl | Пересылка слова в длинное слово с нулями |
| 9E | MOVAB | src.ab, dst.wl | Пересылка адреса байтового операнда |
| 3E | MOVAW | src.aw, dst.wl | Пересылка адреса операнда-слова |
| DE | MOVAL/MOVAF | src.al, dst.wl | Пересылка адреса длинного слова / F_floating |
| 7E | MOVAQ/MOVAD/MOVAG | src.aq, dst.wl | Пересылка адреса квадрослова / D_/G_floating |
| 7E FD | MOVAO/MOVAH | src.ao, dst.wl | Пересылка адреса октаслова / H_floating |
Целочисленная арифметика
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| 80 / A0 / C0 | ADDB2 / ADDW2 / ADDL2 | add.rx, sum.mx | Сложение (двухоперандное), b/w/l |
| 81 / A1 / C1 | ADDB3 / ADDW3 / ADDL3 | add1.rx, add2.rx, sum.wx | Сложение (трёхоперандное), b/w/l |
| D8 | ADWC | add.rl, sum.ml | Сложение длинных слов с учётом переноса |
| 82 / A2 / C2 | SUBB2 / SUBW2 / SUBL2 | sub.rx, dif.mx | Вычитание (двухоперандное) |
| 83 / A3 / C3 | SUBB3 / SUBW3 / SUBL3 | sub.rx, min.rx, dif.wx | Вычитание (трёхоперандное) |
| D9 | SBWC | sub.rl, dif.ml | Вычитание длинных слов с заёмом |
| 84 / A4 / C4 | MULB2 / MULW2 / MULL2 | mulr.rx, prod.mx | Умножение (двухоперандное) |
| 85 / A5 / C5 | MULB3 / MULW3 / MULL3 | mulr.rx, muld.rx, prod.wx | Умножение (трёхоперандное) |
| 86 / A6 / C6 | DIVB2 / DIVW2 / DIVL2 | divr.rx, quo.mx | Деление (двухоперандное) |
| 87 / A7 / C7 | DIVB3 / DIVW3 / DIVL3 | divr.rx, divd.rx, quo.wx | Деление (трёхоперандное) |
| 7A | EMUL | mulr.rl, muld.rl, add.rl, prod.wq | Расширенное умножение 32×32→64 |
| 7B | EDIV | divr.rl, divd.rq, quo.wl, rem.wl | Расширенное деление 64/32→32+ост |
| 8E / AE / CE | MNEGB / MNEGW / MNEGL | src.rx, dst.wx | Изменение знака (отрицание) |
| 96 / B6 / D6 | INCB / INCW / INCL | dst.mx | Инкремент |
| 97 / B7 / D7 | DECB / DECW / DECL | dst.mx | Декремент |
| 94 / B4 / D4 | CLRB / CLRW / CLRL | dst.wx | Обнуление |
| 7C | CLRQ | dst.wq | Обнуление квадрослова |
| 7C FD | CLRO | dst.wo | Обнуление октаслова |
Логические и битовые операции
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| 88 / A8 / C8 | BISB2 / BISW2 / BISL2 | mask.rx, dst.mx | Установка битов (логическое ИЛИ), 2 оп. |
| 89 / A9 / C9 | BISB3 / BISW3 / BISL3 | mask.rx, src.rx, dst.wx | Установка битов, 3 оп. |
| 8A / AA / CA | BICB2 / BICW2 / BICL2 | mask.rx, dst.mx | Сброс битов (AND NOT), 2 оп. |
| 8B / AB / CB | BICB3 / BICW3 / BICL3 | mask.rx, src.rx, dst.wx | Сброс битов, 3 оп. |
| 8C / AC / CC | XORB2 / XORW2 / XORL2 | mask.rx, dst.mx | Исключающее ИЛИ, 2 оп. |
| 8D / AD / CD | XORB3 / XORW3 / XORL3 | mask.rx, src.rx, dst.wx | Исключающее ИЛИ, 3 оп. |
| 92 / B2 / D2 | MCOMB / MCOMW / MCOML | src.rx, dst.wx | Побитовая инверсия (дополнение до 1) |
| 93 / B3 / D3 | BITB / BITW / BITL | mask.rx, src.rx | Проверка битов (AND без записи) |
| B8 | BISPSW | mask.rw | Установка битов в слове состояния |
| B9 | BICPSW | mask.rw | Сброс битов в слове состояния |
| DC | MOVPSL | dst.wl | Чтение PSL в приёмник |
Сдвиги, вращения и битовые поля
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| 78 | ASHL | cnt.rb, src.rl, dst.wl | Арифметический сдвиг длинного слова |
| 79 | ASHQ | cnt.rb, src.rq, dst.wq | Арифметический сдвиг квадрослова |
| 9C | ROTL | cnt.rb, src.rl, dst.wl | Циклический сдвиг длинного слова |
| F8 | ASHP | cnt.rb, srclen.rw, srcaddr.ab, round.rb, dstlen.rw, dstaddr.ab | Сдвиг упакованного десятичного числа |
| EE | EXTV | pos.rl, size.rb, base.vb, dst.wl | Извлечение знакового битового поля |
| EF | EXTZV | pos.rl, size.rb, base.vb, dst.wl | Извлечение беззнакового битового поля |
| F0 | INSV | src.rl, pos.rl, size.rb, base.vb | Запись (вставка) битового поля |
| EC | CMPV | pos.rl, size.rb, base.vb, src.rl | Сравнение знакового битового поля |
| ED | CMPZV | pos.rl, size.rb, base.vb, src.rl | Сравнение беззнакового битового поля |
| EA | FFS | startpos.rl, size.rb, base.vb, findpos.wl | Поиск первого установленного бита |
| EB | FFC | startpos.rl, size.rb, base.vb, findpos.wl | Поиск первого сброшенного бита |
Сравнение и проверка
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| 91 / B1 / D1 | CMPB / CMPW / CMPL | src1.rx, src2.rx | Сравнение двух операндов |
| 95 / B5 / D5 | TSTB / TSTW / TSTL | src.rx | Сравнение операнда с нулём (установка NZ) |
Преобразование типов (целочисленные)
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| 99 | CVTBW | src.rb, dst.ww | Преобразование байта в слово (с расширением знака) |
| 98 | CVTBL | src.rb, dst.wl | Преобразование байта в длинное слово |
| 33 | CVTWB | src.rw, dst.wb | Преобразование слова в байт |
| 32 | CVTWL | src.rw, dst.wl | Преобразование слова в длинное слово |
| F6 | CVTLB | src.rl, dst.wb | Преобразование длинного слова в байт |
| F7 | CVTLW | src.rw, dst.wb | Преобразование длинного слова в слово |
Условные переходы (ветвления)
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| 12 | BNEQ / BNEQU | displ.bb | Переход, если не равно нулю (Z=0) |
| 13 | BEQL / BEQLU | displ.bb | Переход, если равно нулю (Z=1) |
| 14 | BGTR | displ.bb | Переход, если больше (знаковое) |
| 15 | BLEQ | displ.bb | Переход, если меньше или равно (знак.) |
| 18 | BGEQ | displ.bb | Переход, если больше или равно (знак.) |
| 19 | BLSS | displ.bb | Переход, если меньше (знаковое) |
| 1A | BGTRU | displ.bb | Переход, если выше (беззнаковое) |
| 1B | BLEQU | displ.bb | Переход, если ниже или равно (беззнак.) |
| 1E | BCC / BGEQU | displ.bb | Переход, если перенос сброшен |
| 1F | BCS / BLSSU | displ.bb | Переход, если перенос установлен |
| 1C | BVC | displ.bb | Переход, если переполнение сброшено |
| 1D | BVS | displ.bb | Переход, если переполнение установлено |
| E0 | BBS | pos.rl, base.vb, displ.bb | Переход по установленному биту |
| E1 | BBC | pos.rl, base.vb, displ.bb | Переход по сброшенному биту |
| E2 | BBSS | pos.rl, base.vb, displ.bb | Переход, если бит был установлен (и установить) |
| E3 | BBCS | pos.rl, base.vb, displ.bb | Переход, если бит был сброшен (и установить) |
| E4 | BBSC | pos.rl, base.vb, displ.bb | Переход, если бит был установлен (и сбросить) |
| E5 | BBCC | pos.rl, base.vb, displ.bb | Переход, если бит был сброшен (и сбросить) |
| E6 | BBSSI | pos.rl, base.vb, displ.bb | Атомарное «установить бит и перейти, если был сброшен» |
| E7 | BBCCI | pos.rl, base.vb, displ.bb | Атомарное «сбросить бит и перейти, если был установлен» |
| E8 | BLBS | src.rl, displ.bb | Переход, если младший бит = 1 |
| E9 | BLBC | src.rl, displ.bb | Переход, если младший бит = 0 |
Безусловные переходы, вызовы и возвраты
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| 11 | BRB | displ.bb | Безусловный переход (короткий, байт) |
| 31 | BRW | displ.bw | Безусловный переход (длинный, слово) |
| 17 | JMP | dst.ab | Переход по произвольному адресу |
| 10 | BSBB | displ.bb | Переход в подпрограмму (короткий) |
| 30 | BSBW | displ.bw | Переход в подпрограмму (длинный) |
| 16 | JSB | dst.ab | Переход в подпрограмму с сохранением PC |
| 05 | RSB | — | Возврат из подпрограммы (JSB/BSB) |
| FA | CALLG | arglist.ab, dst.ab | Вызов процедуры со списком аргументов в памяти |
| FB | CALLS | nargs.rl, dst.ab | Вызов процедуры с аргументами на стеке |
| 04 | RET | — | Возврат из процедуры (CALLG/CALLS) |
Управление циклами и многовариантный выбор
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| F2 | AOBLSS | limit.rl, index.ml, displ.bb | Инкремент и переход, если index < limit |
| F3 | AOBLEQ | limit.rl, index.ml, displ.bb | Инкремент и переход, если index ≤ limit |
| F4 | SOBGEQ | index.ml, displ.bb | Декремент и переход, если index ≥ 0 |
| F5 | SOBGTR | index.ml, displ.bb | Декремент и переход, если index > 0 |
| 9D | ACBB | limit.rb, add.rb, index.mb, displ.bw | Add-Compare-Branch для байта |
| 3D | ACBW | limit.rw, add.rw, index.mw, displ.bw | Add-Compare-Branch для слова |
| F1 | ACBL | limit.rl, add.rl, index.ml, displ.bw | Add-Compare-Branch для длинного слова |
| 8F | CASEB | selector.rb, base.rb, limit.rb, displ.bw-list | Многовариантный переход по байту |
| AF | CASEW | selector.rw, base.rw, limit.rw, displ.bw-list | Многовариантный переход по слову |
| CF | CASEL | selector.rl, base.rl, limit.rl, displ.bw-list | Многовариантный переход по длинному слову |
Работа со стеком
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| DD | PUSHL | src.rl | Занесение длинного слова в стек |
| 9F / 3F / DF | PUSHAB / PUSHAW / PUSHAL | src.ax | Занесение адреса в стек |
| 7F | PUSHAQ / PUSHAD / PUSHAG | src.aq | Занесение адреса квадрослова / D_/G_ |
| 7F FD | PUSHAO / PUSHAH | src.ao | Занесение адреса октаслова / H_ |
| BB | PUSHR | mask.rw | Занесение группы регистров в стек |
| BA | POPR | mask.rw | Извлечение группы регистров из стека |
Работа с очередями
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| 0E | INSQUE | entry.ab, pred.ab | Вставка элемента в абсолютную очередь |
| 0F | REMQUE | entry.ab, addr.wl | Удаление элемента из абсолютной очереди |
| 5C | INSQHI | entry.ab, header.aq | Атомарная вставка в голову самовыравн. очереди |
| 5D | INSQTI | entry.ab, header.aq | Атомарная вставка в хвост самовыравн. очереди |
| 5E | REMQHI | header.aq, addr.wl | Атомарное удаление из головы очереди |
| 5F | REMQTI | header.aq, addr.wl | Атомарное удаление из хвоста очереди |
Обработка символьных строк
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| 28 | MOVC3 | len.rw, src.ab, dst.ab | Копирование строки (одинаковая длина) |
| 2C | MOVC5 | slen.rw, src.ab, fill.rb, dlen.rw, dst.ab | Копирование строки с дополнением |
| 2E | MOVTC | srclen.rw, src.ab, fill.rb, tbl.ab, dstlen.rw, dst.ab | Копирование с трансляцией через таблицу |
| 2F | MOVTUC | srclen.rw, src.ab, esc.rb, tbl.ab, dstlen.rw, dst.ab | Трансляция до символа-ограничителя |
| 29 | CMPC3 | len.rw, s1.ab, s2.ab | Сравнение строк одинаковой длины |
| 2D | CMPC5 | s1len.rw, s1.ab, fill.rb, s2len.rw, s2.ab | Сравнение строк разной длины |
| 3A | LOCC | char.rb, len.rw, addr.ab | Поиск символа в строке |
| 3B | SKPC | char.rb, len.rw, addr.ab | Поиск первого отличного символа |
| 2A | SCANC | len.rw, addr.ab, tbl.ab, mask.rb | Поиск по маске через таблицу |
| 2B | SPANC | len.rw, addr.ab, tbl.ab, mask.rb | Пропуск символов, соответствующих маске |
| 39 | MATCHC | objlen.rw, obj.ab, srclen.rw, src.ab | Поиск подстроки |
| 0B | CRC | tbl.ab, inicrc.rl, strlen.rw, str.ab | Вычисление контрольной суммы CRC |
Упакованная десятичная арифметика
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| 20 | ADDP4 | alen.rw, aaddr.ab, blen.rw, baddr.ab | Сложение упакованных чисел (4 оп.) |
| 21 | ADDP6 | alen.rw, aaddr.ab, blen.rw, baddr.ab, rlen.rw, raddr.ab | Сложение упакованных (6 оп.) |
| 22 | SUBP4 | alen.rw, aaddr.ab, blen.rw, baddr.ab | Вычитание упакованных (4 оп.) |
| 23 | SUBP6 | alen.rw, aaddr.ab, blen.rw, baddr.ab, rlen.rw, raddr.ab | Вычитание упакованных (6 оп.) |
| 25 | MULP | mulrlen.rw, mulraddr.ab, muldlen.rw, muldaddr.ab, prodlen.rw, prodaddr.ab | Умножение упакованных |
| 27 | DIVP | divrlen.rw, divraddr.ab, divdlen.rw, divdaddr.ab, quolen.rw, quoaddr.ab | Деление упакованных |
| 35 | CMPP3 | len.rw, src1.ab, src2.ab | Сравнение упакованных (равная длина) |
| 37 | CMPP4 | src1len.rw, src1.ab, src2len.rw, src2.ab | Сравнение упакованных |
| 34 | MOVP | len.rw, src.ab, dst.ab | Пересылка упакованного числа |
| 24 | CVTPT | srclen.rw, src.ab, tbl.ab, dstlen.rw, dst.ab | Упакованное → числовой (trailing) |
| 26 | CVTTP | srclen.rw, src.ab, tbl.ab, dstlen.rw, dst.ab | Числовой (trailing) → упакованное |
| 08 | CVTPS | srclen.rw, src.ab, dstlen.rw, dst.ab | Упакованное → числовой (separate) |
| 09 | CVTSP | srclen.rw, src.ab, dstlen.rw, dst.ab | Числовой (separate) → упакованное |
| F9 | CVTLP | src.rl, dstlen.rw, dst.ab | Длинное слово → упакованное |
| 36 | CVTPL | srclen.rw, src.ab, dst.wl | Упакованное → длинное слово |
| 38 | EDITPC | srclen.rw, src.ab, pattern.ab, dst.ab | Форматирование упакованного числа по шаблону |
Плавающая точка, формат F (одинарная точность)
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| 50 | MOVF | src.rf, dst.wf | Пересылка F_floating |
| 51 | CMPF | src1.rf, src2.rf | Сравнение F_floating |
| 52 | MNEGF | src.rf, dst.wf | Отрицание F_floating |
| 53 | TSTF | src.rf | Сравнение F_floating с нулём |
| 40 | ADDF2 | add.rf, sum.mf | Сложение F_floating (2 оп.) |
| 41 | ADDF3 | add1.rf, add2.rf, sum.wf | Сложение F_floating (3 оп.) |
| 42 | SUBF2 | sub.rf, dif.mf | Вычитание F_floating (2 оп.) |
| 43 | SUBF3 | sub.rf, min.rf, dif.wf | Вычитание F_floating (3 оп.) |
| 44 | MULF2 | mulr.rf, prod.mf | Умножение F_floating (2 оп.) |
| 45 | MULF3 | mulr.rf, muld.rf, prod.wf | Умножение F_floating (3 оп.) |
| 46 | DIVF2 | divr.rf, quo.mf | Деление F_floating (2 оп.) |
| 47 | DIVF3 | divr.rf, divd.rf, quo.wf | Деление F_floating (3 оп.) |
| 4C | CVTBF | src.rb, dst.wf | Преобразование байта в F |
| 4D | CVTWF | src.rw, dst.wf | Преобразование слова в F |
| 4E | CVTLF | src.rl, dst.wf | Преобразование длинного слова в F |
| 48 | CVTFB | src.rf, dst.wb | Преобразование F в байт |
| 49 | CVTFW | src.rf, dst.ww | Преобразование F в слово |
| 4A | CVTFL | src.rf, dst.wl | Преобразование F в длинное слово |
| 4B | CVTRFL | src.rf, dst.wl | Преобразование F в длинное слово с округлением |
| 56 | CVTFD | src.rf, dst.wd | Преобразование F_floating в D_floating |
| 54 | EMODF | mulr.rf, mulrx.rb, muld.rf, int.wl, fract.wf | Расширенное модульное умножение F |
| 55 | POLYF | arg.rf, degree.rw, tbl.ab | Вычисление полинома по коэффициентам F |
| 4F | ACBF | limit.rf, add.rf, index.mf, displ.bw | Add-Compare-Branch для F_floating |
Плавающая точка, формат D (двойная точность)
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| 70 | MOVD | src.rd, dst.wd | Пересылка D_floating |
| 71 | CMPD | src1.rd, src2.rd | Сравнение D_floating |
| 72 | MNEGD | src.rd, dst.wd | Отрицание D_floating |
| 73 | TSTD | src.rd | Сравнение D_floating с нулём |
| 60 | ADDD2 | add.rd, sum.md | Сложение D (2 оп.) |
| 61 | ADDD3 | add1.rd, add2.rd, sum.wd | Сложение D (3 оп.) |
| 62 | SUBD2 | sub.rd, dif.md | Вычитание D (2 оп.) |
| 63 | SUBD3 | sub.rd, min.rd, dif.wd | Вычитание D (3 оп.) |
| 64 | MULD2 | mulr.rd, prod.md | Умножение D (2 оп.) |
| 65 | MULD3 | mulr.rd, muld.rd, prod.wd | Умножение D (3 оп.) |
| 66 | DIVD2 | divr.rd, quo.md | Деление D (2 оп.) |
| 67 | DIVD3 | divr.rd, divd.rd, quo.wd | Деление D (3 оп.) |
| 6C | CVTBD | src.rb, dst.wd | Преобразование байта в D |
| 6D | CVTWD | src.rw, dst.wd | Преобразование слова в D |
| 6E | CVTLD | src.rl, dst.wd | Преобразование длинного слова в D |
| 68 | CVTDB | src.rd, dst.wb | Преобразование D в байт |
| 69 | CVTDW | src.rd, dst.ww | Преобразование D в слово |
| 6A | CVTDL | src.rd, dst.wl | Преобразование D в длинное слово |
| 6B | CVTRDL | src.rd, dst.wl | Преобразование D в длинное слово с округлением |
| 76 | CVTDF | src.rd, dst.wf | Преобразование D_floating в F_floating |
| 74 | EMODD | mulr.rd, mulrx.rb, muld.rd, int.wl, fract.wd | Расширенное модульное умножение D |
| 75 | POLYD | arg.rd, degree.rw, tbl.ab | Вычисление полинома в D |
| 6F | ACBD | limit.rd, add.rd, index.md, displ.bw | Add-Compare-Branch для D_floating |
Плавающая точка, форматы G и H (двухбайтовые коды FD)
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| 40 FD / 41 FD | ADDG2 / ADDG3 | как ADDD2/3 (G_floating) | Сложение G_floating |
| 42 FD / 43 FD | SUBG2 / SUBG3 | как SUBD2/3 (G_floating) | Вычитание G_floating |
| 44 FD / 45 FD | MULG2 / MULG3 | как MULD2/3 (G_floating) | Умножение G_floating |
| 46 FD / 47 FD | DIVG2 / DIVG3 | как DIVD2/3 (G_floating) | Деление G_floating |
| 50 FD | MOVG | src.rg, dst.wg | Пересылка G_floating |
| 51 FD | CMPG | src1.rg, src2.rg | Сравнение G_floating |
| 52 FD | MNEGG | src.rg, dst.wg | Отрицание G_floating |
| 53 FD | TSTG | src.rg | Сравнение G_floating с нулём |
| 4F FD | ACBG | limit.rg, add.rg, index.mg, displ.bw | Add-Compare-Branch для G |
| 54 FD | EMODG | как EMODD, но G | Расширенное модульное умножение G |
| 55 FD | POLYG | arg.rg, degree.rw, tbl.ab | Вычисление полинома в G |
| 56 FD | CVTGH | src.rg, dst.wh | Преобразование G в H |
| 60 FD – 67 FD | ADDH2/3 ... DIVH2/3 | как ADDD/... (H_floating) | Арифметика H_floating |
| 70 FD | MOVH | src.rh, dst.wh | Пересылка H_floating |
| 71 FD | CMPH | src1.rh, src2.rh | Сравнение H_floating |
| 72 FD | MNEGH | src.rh, dst.wh | Отрицание H_floating |
| 73 FD | TSTH | src.rh | Сравнение H_floating с нулём |
| 6F FD | ACBH | limit.rh, add.rh, index.mh, displ.bw | Add-Compare-Branch для H |
| 74 FD | EMODH | как EMODD, но H | Расширенное модульное умножение H |
| 75 FD | POLYH | arg.rh, degree.rw, tbl.ab | Вычисление полинома в H |
| 76 FD | CVTHF | src.rh, dst.wf | Преобразование H в F |
| 77 FD | CVTHD | src.rh, dst.wd | Преобразование H в D |
| 32 FD / 33 FD | CVTFH / CVTFG | src.rf, dst.wh/g | F → H / F → G |
Вспомогательные и прочие операции
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| 01 | NOP | — | Пустая операция |
| 0A | INDEX | subscript.rl, low.rl, high.rl, size.rl, indexin.rl, indexout.wl | Вычисление и проверка индекса массива |
| FC | XFC | — | Расширенный код (зарезервирован для микрокода) |
Системные и привилегированные команды
| Код | Мнемоника | Операнды | Назначение |
|---|---|---|---|
| 00 | HALT | — | Останов процессора (только в режиме ядра) |
| 02 | REI | — | Возврат из исключения/прерывания |
| 03 | BPT | — | Точка останова (программная ловушка) |
| BC | CHMK | code.rw | Смена режима на Kernel (системный вызов) |
| BD | CHME | code.rw | Смена режима на Executive |
| BE | CHMS | code.rw | Смена режима на Supervisor |
| BF | CHMU | code.rw | Смена режима на User |
| DA | MTPR | src.rl, procreg.rl | Запись в регистр процессора |
| DB | MFPR | procreg.rl, dst.wl | Чтение регистра процессора |
| 06 | LDPCTX | — | Загрузка контекста процесса |
| 07 | SVPCTX | — | Сохранение контекста процесса |
| 0C | PROBER | mode.rb, len.rw, base.ab | Проверка доступа к памяти для чтения |
| 0D | PROBEW | mode.rb, len.rw, base.ab | Проверка доступа к памяти для записи |
| FD FF | BUGL | msg.rl | Системная ошибка (длинное сообщение) |
| FE FF | BUGW | msg.rw | Системная ошибка (короткое сообщение) |
Примечания
- VAX-11/750 реализует полный пользовательский набор VAX-11, а микрокод содержит также привилегированные инструкции; часть инструкций формата G/H и десятичные/строковые команды на 750 реализованы через ловушку в эмулятор (RSTRING/RPOLY и др.).
- Для инструкций, мнемоника которых заканчивается на `x` (например, `ADDx2`), подставляются суффиксы `B` (байт), `W` (слово), `L` (длинное слово) и соответствующий опкод из тройки `80/A0/C0`, `81/A1/C1` и т. д.
- Операнды указаны в «ассемблерном» порядке DEC (`источник, приёмник`).
- Двухбайтовые опкоды с префиксом `FD` (расширение G/H_floating) добавлены позднее базовой архитектуры VAX-11/780; VAX-11/750 поддерживает их частично, остальные эмулируются.
Источники
- Computer Organization — VAX Architecture & Assembly Reference (RIT, 0603-352) — основной справочник по опкодам (секции 2.4.1–2.4.4).
- Another Alternative to RISC: The VAX Architecture (Patterson & Hennessy, Appendix E — обзор классов инструкций и примеры.
- VAX MACRO and Instruction Set Reference Manual (VSI) — полное официальное описание команд и режимов адресации.
- VAX MACRO and Instruction Set Reference Manual (PDF, LSU) — альтернативная копия официального руководства DEC.
- VAX Architecture Reference Manual (Bitsavers) — подробная спецификация архитектуры VAX.