VAX-11/Система команд: различия между версиями
Panther (обсуждение | вклад) (new page) |
Panther (обсуждение | вклад) (+) |
||
| Строка 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 не подходит — нужен адрес, а не значение. | |||
=== 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> | |||
[[Категория:Электроника-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