VAX-11/Система команд: различия между версиями

Материал из Emuverse
 
(не показаны 4 промежуточные версии этого же участника)
Строка 329: Строка 329:


Режимы Cn–Fn полностью аналогичны байтовым режимам, за исключением размера операнда: word представляет два байта смещения в диапазоне −32768..+32767, longword — знаковые 4 байта.
Режимы Cn–Fn полностью аналогичны байтовым режимам, за исключением размера операнда: word представляет два байта смещения в диапазоне −32768..+32767, longword — знаковые 4 байта.
При этом для PC-relative смещение считается от конца своего спецификатора вместе с байтами смещения — PC к тому моменту уже прошёл их все.


=== PC-relative ===
=== PC-relative ===
Строка 344: Строка 346:
Итого: C0 8F 05 00 00 00 50
Итого: C0 8F 05 00 00 00 50
</pre>
</pre>
= Таблица команд процессора VAX-11/750 =
Сводная таблица команд процессора VAX-11/750 (реализует практически полный набор инструкций архитектуры VAX-11).
Коды команд (opcode) указаны в шестнадцатеричном виде. Для инструкций плавающей точки формата G/H применяется двухбайтовый код с префиксом <code>FD</code> (указан как <code>xx FD</code>).
'''Обозначения типов операндов:'''
* <code>.r</code> — чтение (read)
* <code>.w</code> — запись (write)
* <code>.m</code> — чтение/модификация (modify)
* <code>.a</code> — адрес (address)
* <code>.b</code> — смещение ветвления (branch displacement)
* <code>.v</code> — битовое поле (field)
* <code>b/w/l/q/o</code> — байт / слово / длинное слово / квадрослово / октаслово
* <code>f/d/g/h</code> — форматы плавающей точки F / D / G / H
== Пересылка данных и адресов ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 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
|}
== Целочисленная арифметика ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 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 || Обнуление октаслова
|}
== Логические и битовые операции ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 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 в приёмник
|}
== Сдвиги, вращения и битовые поля ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 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 || Поиск первого сброшенного бита
|}
== Сравнение и проверка ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 91 / B1 / D1 || CMPB / CMPW / CMPL || src1.rx, src2.rx || Сравнение двух операндов
|-
| 95 / B5 / D5 || TSTB / TSTW / TSTL || src.rx || Сравнение операнда с нулём (установка NZ)
|}
== Преобразование типов (целочисленные) ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 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 || Преобразование длинного слова в слово
|}
== Условные переходы (ветвления) ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 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
|}
== Безусловные переходы, вызовы и возвраты ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 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)
|}
== Управление циклами и многовариантный выбор ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 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 || Многовариантный переход по длинному слову
|}
== Работа со стеком ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 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 || Извлечение группы регистров из стека
|}
== Работа с очередями ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 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 || Атомарное удаление из хвоста очереди
|}
== Обработка символьных строк ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 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
|}
== Упакованная десятичная арифметика ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 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 (одинарная точность) ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 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 (двойная точность) ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 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) ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 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
|}
== Вспомогательные и прочие операции ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 01 || NOP || — || Пустая операция
|-
| 0A || INDEX || subscript.rl, low.rl, high.rl, size.rl, indexin.rl, indexout.wl || Вычисление и проверка индекса массива
|-
| FC || XFC || — || Расширенный код (зарезервирован для микрокода)
|}
== Системные и привилегированные команды ==
{| class="wikitable"
|-
! Код !! Мнемоника !! Операнды !! Назначение
|-
| 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 поддерживает их частично, остальные эмулируются.
== Источники ==
* [https://www.cs.rit.edu/~icss352/document/vax_pkt.pdf Computer Organization — VAX Architecture & Assembly Reference (RIT, 0603-352)] — основной справочник по опкодам (секции 2.4.1–2.4.4).
* [https://agimcami.wordpress.com/wp-content/uploads/2012/05/vax-instruction-set-from-cod-apendix.pdf Another Alternative to RISC: The VAX Architecture (Patterson & Hennessy, Appendix E] — обзор классов инструкций и примеры.
* [https://docs.vmssoftware.com/vsi-openvms-vax-macro-and-instruction-set-reference-manual/ VAX MACRO and Instruction Set Reference Manual (VSI)] — полное официальное описание команд и режимов адресации.
* [https://www.ece.lsu.edu/ee4720/doc/vax.pdf VAX MACRO and Instruction Set Reference Manual (PDF, LSU)] — альтернативная копия официального руководства DEC.
* [https://bitsavers.trailing-edge.com/pdf/dec/vax/archSpec/EY-3459E-DP_VAX_Architecture_Reference_Manual_1987.pdf VAX Architecture Reference Manual (Bitsavers)] — подробная спецификация архитектуры VAX.




[[Категория:Электроника-32]]
[[Категория:Электроника-32]]

Текущая версия от 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 поддерживает их частично, остальные эмулируются.

Источники