VAX-11/Система команд: различия между версиями
Panther (обсуждение | вклад) (new page) |
Panther (обсуждение | вклад) |
||
| (не показано 11 промежуточных версий этого же участника) | |||
| Строка 1: | Строка 1: | ||
{{emuverse}} | |||
= Регистры = | |||
{| class="wikitable" | {| class="wikitable" | ||
! Номер (dec) !! Номер (hex) !! Имя !! Назначение | ! Номер (dec) !! Номер (hex) !! Имя !! Назначение | ||
| Строка 106: | Строка 107: | ||
Здесь n = номер регистра (0–E для R0–SP), F = PC (R15). Режимы с F в поле регистра — это PC-relative варианты соответствующих displacement-режимов, которые ассемблер выбирает автоматически по дистанции до метки. | Здесь n = номер регистра (0–E для R0–SP), F = PC (R15). Режимы с F в поле регистра — это PC-relative варианты соответствующих displacement-режимов, которые ассемблер выбирает автоматически по дистанции до метки. | ||
=== Литеральный режим === | === 0: Литеральный режим === | ||
Если биты 7–6 = 00, весь байт трактуется как 6-битный литерал (значения 0–63), независимо от поля reg. Это экономия на маленьких константах. | Если биты 7–6 = 00, весь байт трактуется как 6-битный литерал (значения 0–63), независимо от поля reg. Это экономия на маленьких константах. | ||
| Строка 118: | Строка 119: | ||
</pre> | </pre> | ||
=== | === 4n: Индексный режим === | ||
mod=4 модифицирует следующий operand specifier. Эффективный адрес: | mod=4 модифицирует следующий operand specifier. Эффективный адрес: | ||
| Строка 166: | Строка 152: | ||
</pre> | </pre> | ||
Эффективный адрес = <code>&table + R3 * 4</code> (MOVL → тип longword → масштаб 4) | Эффективный адрес = <code>&table + R3 * 4</code> (MOVL → тип longword → масштаб 4) | ||
=== 5n — Регистровый === | |||
Операнд является значением в регистре. | |||
Кодирование <code>MOVL R2, R0</code>: | |||
<pre> | |||
D0 — MOVL | |||
52 — Register, Rn=2 (источник) | |||
50 — Register, Rn=0 (приёмник) | |||
</pre> | |||
Ограничение: если инструкция требует операнд в памяти (например, PUSHAL, CALLS — адрес), Register не подходит — нужен адрес, а не значение. | |||
=== 6n — Регистровый косвенный === | |||
Регистр содержит адрес операнда. Одно обращение к памяти. | |||
<pre> | |||
MOVL (R3), (R2) ; Mem[R2] := Mem[R3] | |||
Кодирование: | |||
D0 — MOVL | |||
63 — Register Deferred, Rn=3 (источник) | |||
62 — Register Deferred, Rn=2 (приёмник) | |||
</pre> | |||
=== 7n, 8n — Автодекрементный и автоинкрементный === | |||
* Автодекрементный: сначала регистр уменьшается на размер типа, затем используется как адрес. | |||
* Автоинкрементный: Сначала используется текущее значение регистра как адрес, затем регистр увеличивается. | |||
<pre> | |||
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 | |||
</pre> | |||
Кодирование <code>MOVL -(R2), R0</code>: | |||
<pre> | |||
D0 — MOVL | |||
72 — Autodecrement, Rn=2 | |||
50 — Register R0 | |||
</pre> | |||
==== Пример: работа со стеком ==== | |||
<pre> | |||
; PUSH longword в R1: | |||
MOVL R1, -(SP) ; SP -= 4; Mem[SP] := R1 | |||
; POP longword в R0: | |||
MOVL (SP)+, R0 ; R0 := Mem[SP]; SP += 4 | |||
</pre> | |||
Фактически, <code>PUSHL</code> / <code>POPL</code> обёртки над MOVL: | |||
<pre> | |||
PUSHL R1 → MOVL R1, -(SP) | |||
; нет POPL — используют MOVL (SP)+, Rn | |||
</pre> | |||
==== Пример: обход массива ==== | |||
<pre> | |||
; R2 = указатель на начало массива int32_t | |||
; R3 = счётчик элементов | |||
loop: | |||
MOVL (R2)+, R0 ; R0 := *p++ | |||
; ... обработка R0 ... | |||
SOBGTR R3, loop ; R3--; если R3 > 0 — перейти | |||
</pre> | |||
Каждую итерацию R2 автоматически продвигается на 4 — нет необходимости в ADDL. | |||
==== Пример: копирование массива в цикле ==== | |||
MOVL (R2)+, (R3)+ ; Mem[R3] := Mem[R2]; R2+=4; R3+=4 | |||
Оба указателя продвигаются за одну инструкцию. Порядок: сначала вычисляются оба EA, затем оба регистра обновляются. | |||
=== 9n — Автоинкрементный косвенный === | |||
Происходит двойное разыменование: регистр содержит адрес адреса операнда. После чтения регистр увеличивается на 4 (всегда — longword, потому что читается адрес, а не данные). | |||
<pre> | |||
EA = Mem[Rn] — читаем адрес из памяти | |||
Rn := Rn + 4 — продвигаем на размер указателя | |||
</pre> | |||
Два обращения к памяти: сначала за адресом, потом за данными. | |||
Сравнение с Autoincrement: | |||
<pre> | |||
MOVL (R2)+, R0 ; R0 := Mem[R2]; R2 += 4 — читаем данные | |||
MOVL @(R2)+, R0 ; R0 := Mem[Mem[R2]]; R2 += 4 — читаем указатель, потом данные | |||
</pre> | |||
'''Особый случай: <code>@(PC)+</code> = Absolute 9F''' | |||
Аналогично тому как <code>(PC)+</code> = Immediate, <code>@(PC)+</code> = Absolute: | |||
EA = Mem[PC]; PC += 4 | |||
Следующие 4 байта в потоке команд — это сам 32-битный адрес операнда. | |||
<pre> | |||
MOVL @#0x1234ABCD, R0 | |||
; D0 9F CD AB 34 12 50 | |||
; ^^— Autoincrement Deferred PC (= Absolute) | |||
; ^^^^^^^^^^^— адрес операнда в потоке команд | |||
</pre> | |||
=== An: С байтовым смещением === | |||
За байтом спецификатора следует 1 байт знакового смещения. Эффективный адрес: | |||
EA = Rn + sign_extend(disp8) | |||
Смещение знаковое: диапазон −128..+127 байт от базового регистра. | |||
Кодирование | |||
<pre> | |||
+------+------+ +----------+ | |||
| A | Rn | | disp8 | | |||
+------+------+ +----------+ | |||
байт 1 байт 2 | |||
</pre> | |||
<pre> | |||
MOVL 4(R2), R0 ; EA = R2 + 4 | |||
D0 — MOVL | |||
A2 — Byte Displacement, Rn=2 | |||
04 — смещение +4 | |||
50 — Register R0 | |||
</pre> | |||
<pre> | |||
MOVL -8(R2), R0 ; EA = R2 - 8 | |||
D0 — MOVL | |||
A2 — Byte Displacement, Rn=2 | |||
F8 — смещение −8 (0xF8 = −8 в дополнительном коде) | |||
50 — Register R0 | |||
</pre> | |||
Главное применение — поля структур | |||
<pre> | |||
// 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 байта) | |||
</pre> | |||
'''Особый случай: Byte Relative — AF''' | |||
Частный случай Byte Displacement с Rn=PC. Ассемблер использует его для переходов и обращений к статическим переменным в пределах ±127 байт от текущей инструкции: | |||
MOVL near_var, R0 ; AF <disp8> — если near_var близко | |||
В момент вычисления EA PC уже указывает на следующий байт после спецификатора, поэтому смещение считается от его конца. | |||
=== Bn: С байтовым смещением косвенный === | |||
По вычисленному адресу читается указатель, и уже он используется как EA. | |||
<pre> | |||
tmp = Rn + sign_extend(disp8) | |||
EA = Mem[tmp] | |||
</pre> | |||
<pre> | |||
MOVL @4(R2), R0 ; tmp = R2+4; R0 := Mem[Mem[tmp]] | |||
D0 — MOVL | |||
B2 — Byte Displacement Deferred, Rn=2 | |||
04 — смещение +4 | |||
50 — Register R0 | |||
</pre> | |||
=== 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 в зависимости от дистанции. | |||
Пример: <code>ADDL2 #5, R0</code> — прибавить 5 к регистру R0, размер операнда L, команда двухадресная | |||
<pre> | |||
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 | |||
</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 поддерживает их частично, остальные эмулируются.
Источники
- 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.