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

Материал из Emuverse
(new page)
 
(+)
Строка 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>


=== PC-relative ===
=== 4n: Индексный режим ===
 
PC-relative режимы (reg=F) это PC-relative addressing — assembler автоматически выбирает byte/word/longword displacement в зависимости от дистанции.
 
Пример: <code>ADDL2 #5, R0</code> &mdash; прибавить 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>
 
=== Индексный режим ===
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 не подходит — нужен адрес, а не значение.
=== PC-relative ===
PC-relative режимы (reg=F) это PC-relative addressing — assembler автоматически выбирает byte/word/longword displacement в зависимости от дистанции.
Пример: <code>ADDL2 #5, R0</code> &mdash; прибавить 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>


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

Версия от 11:16, 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 не подходит — нужен адрес, а не значение.


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