Merge commit '64fe4d3436b0f12a31b8562c37342d6a23680f47'

This commit is contained in:
LeterZP
2026-03-24 22:20:10 +03:00
+41 -58
View File
@@ -54,7 +54,7 @@
### Базовая ЭВМ
*Всё, что описано ниже, верно для актуальной версии эиулятора базовой ЭВМ (bcomp-ng v1.45.09).*
*Всё, что описано ниже, верно для актуальной версии эмулятора базовой ЭВМ (bcomp-ng v1.45.09).*
Для взаимодействия со стеком используется ряд команд, среди которых [POP](#POP), [POPF](#POPF), [PUSH](#PUSH), [PUSHF](#PUSHF) и [SWAP](#SWAP). Все они подробно рассмотрены ниже.
@@ -62,7 +62,7 @@
## Подпрограммы
*Всё, что описано ниже, верно для актуальной версии эиулятора базовой ЭВМ (bcomp-ng v1.45.09).*
*Всё, что описано ниже, верно для актуальной версии эмулятора базовой ЭВМ (bcomp-ng v1.45.09).*
В актуальной версии БЭВМ подпрограммы являются некой мини-программой, которую удобно применять в случае, если какие-либо однотипные действия в основной программе выполняются по несколько раз.
@@ -70,12 +70,16 @@
В БЭВМ использование подпрограмм сильно переплетено с использованием стека. В основном стек используется для временного хранения каких-либо данных, необходимых для выполнения подпрограммы. В частности, в стек записываются адрес возварщения подпрограммы (то есть место, где программа должна будет продолжить выполнение после выполнения подпрограммы), аргументы подпрограммы и результаты выполнения подпрограммы.
Для передачи аргументов для подпрограммы необходимо перед вызовом подпрограммы загрузить в стек необходимо количество параметров, а в подпрограмме выполнить с этими аргументами необходимые действия. При этом в подпрограмме в данном случае для взаимодействия со стеком используется специальный [режим адресации относительно стека]() (впрочем, данный режим адресации можно использовать не только в подпрограмме). После этого результат выполнения подпрограммы может быть записан в те же ячейки стека, где передавались аргументы, и завершить работу подпрограммы. Также стоит отметить, что передавать аргументы для подпрограммы можно не только через стек, но и используя регистры общего назначения (к сожалению, в БЭВМ он только один, и это AC).
Для передачи аргументов для подпрограммы существует три способа.
- Для первого необходимо перед вызовом подпрограммы загрузить в стек необходимо количество параметров, а в подпрограмме выполнить с этими аргументами необходимые действия. При этом в подпрограмме в данном случае для взаимодействия со стеком используется специальный [режим адресации относительно стека](#Косвенная-относительная-адресация-со-смещением-относительно-SP) (впрочем, данный режим адресации можно использовать не только в подпрограмме). После этого результат выполнения подпрограммы может быть записан в те же ячейки стека, где передавались аргументы, и завершить работу подпрограммы.
- Также можно передавать аргументы для подпрограммы и используя регистры общего назначения (к сожалению, в БЭВМ он только один, и это AC).
- Третьим способом будет использование косвенной адре
## Команды
### Косвенная относительная адресация со смещением относительно SP
В третем ниббле имеет код C (в двоичной системе соответственно 1100), то есть имеет вид XCXX.
@@ -108,8 +112,6 @@
- По фронту находит ячейку в памяти по адресу.
- По спаду записывает значение этой ячейки в регистр данных.
### POP
Код: 0800.
@@ -118,7 +120,7 @@
Безадресная команда.
#### Цикл выборки операнда
#### Цикл исполнения
- 1 такт: **SP -> AR**
@@ -126,21 +128,19 @@
- По спаду записывает его в адрсный регистр.
- 2 такт: **MEM(AR) -> DR**
- 2 такт: **MEM(AR) -> DR**
- По фронту находит по адресу ячейку.
- По спаду записывает значение этой ячейки в регистр данных.
#### Цикл исполнения
- 1 такт: **DR -> AC**
- 3 такт: **DR -> AC**
- По фронту пускает значение регистра данных через АЛУ.
- По спаду запишет его в аккумулятор.
- 2 такт: **SP + 1 -> SP**
- 4 такт: **SP + 1 -> SP**
- По фронту пустит значение указателя стека в АЛУ и прибавит 1.
@@ -148,9 +148,7 @@
*После выполнения поставит флаги в соответствии с выгруженным значением, при этом не изменив флаг переноса и обнулив флаг переполнения*.
Цикл выборки адреса выполняться не будет, так как команда безадресная.
Циклы выборки адреса и выборки операнда выполняться не будут, так как команда безадресная.
### POPF
@@ -160,7 +158,7 @@
Безадресная команда.
#### Цикл выборки операнда
#### Цикл исполнения
- 1 такт: **SP -> AR**
@@ -172,24 +170,20 @@
- По фронту находит по адресу ячейку.
- По спаду записывает значение этой ячейки в регистр данных.
#### Цикл исполнения
- 1 такт: **DR -> PS**
- 3 такт: **DR -> PS**
- По фронту пустит значение регистра данных в АЛУ.
- По спаду запишет это значение в регистр состояния.
- 2 такт: **MEM(AR) -> DR**
- 4 такт: **MEM(AR) -> DR**
- По фронту находит по адресу ячейку.
- По спаду записывает значение этой ячейки в регистр данных.
*Флаги, соответственно, возьмутся из регистра состояния.*
Цикл выборки адреса выполняться не будет, так как команда безадресная.
Циклы выборки адреса и выборки операнда выполняться не будут, так как команда безадресная.
### PUSH
@@ -202,25 +196,26 @@
#### Цикл исполнения
- 1 такт: **AC -> DR**
- По фронту пустит значение аккумулятора через АЛУ.
- По спаду запишет его в регистр данных.
- 2 такт: **~0 + SP -> SP, AR**
- По фронту прибавит в АЛУ к значению указателя стека ~0 (то есть -1).
- По спаду запишет это значение в указатель стека и адресный регистр.
- 3 такт: **DR -> MEM(AR)**
- По фронту найдёт ячейку по адресу.
- По спаду запишет значение регистра данных в эту ячейку.
*Не меняет флаги*.
Цикл выборки адреса выполняться не будет, так как команда безадресная.
Цикл выборки операнда выполняться не будет, так как нужное нам значение уже записано в аккумуляторе.
Циклы выборки адреса и выборки операнда выполняться не будут, так как команда безадресная.
### PUSHF
@@ -238,7 +233,7 @@
- По спаду запишет это значение в регистр данных.
- 2 такт: **~0 + SP -> SP, AR**
- 2 такт: **~0 + SP -> SP, AR**
- По фронту прибавит в АЛУ к значению указателя стека ~0 (то есть -1).
- По спаду запишет это значение в указатель стека и адресный регистр.
@@ -250,11 +245,7 @@
*Не меняет флаги*.
Цикл выборки адреса выполняться не будет, так как команда безадресная.
Цикл выборки операнда выполняться не будет, так как нужное нам значение уже записано в регистре состояния.
Циклы выборки адреса и выборки операнда выполняться не будут, так как команда безадресная.
### SWAP
@@ -298,11 +289,7 @@
*Ставит флаги по загруженному значению, не меняя флаг переноса и обнуляя флаг переполнения.*
Цикл выборки адреса выполняться не будет, так как команда безадресная.
Цикл выборки операнда выполняться не будет, так как нужное нам значение уже записано в аккумуляторе.
Циклы выборки адреса и выборки операнда выполняться не будут, так как команда безадресная.
### CALL
@@ -348,8 +335,6 @@
*Не меняет флаги*.
### RET
Код: 0A00.
@@ -358,7 +343,7 @@
Безадресная команда.
#### Цикл выборки операнда
#### Цикл исполнения
- 1 такт: **SP -> AR**
@@ -372,15 +357,13 @@
- По спаду запишет значение этой ячейки в регистр данных.
#### Цикл исполнения
- 1 такт: **DR -> IP**
- 3 такт: **DR -> IP**
- По фронту пустит значение регистра данных в АЛУ.
- По спаду запишет это значение в счетчик команд.
- 2 такт: **SP + 1 -> SP**
- 4 такт: **SP + 1 -> SP**
- По фронту пустит значение указателя стека в АЛУ и прибавит 1.
@@ -388,9 +371,7 @@
*Не меняет флаги.*
Цикл выборки адреса выполняться не будет, так как команда безадресная.
Циклы выборки адреса и выборки операнда выполняться не будут, так как команда безадресная.
### IRET
@@ -402,6 +383,10 @@
#### Цикл выборки операнда
-
#### Цикл исполнения
- 1 такт: **SP -> AR**
- По фронту пустит значение указателя стека через АЛУ.
@@ -414,33 +399,31 @@
- По спаду запишет значение этой ячейки в регистр данных.
#### Цикл исполнения
- 1 такт: **DR -> PS**
- 3 такт: **DR -> PS**
- По фронту пустит значение регистра данных в АЛУ.
- По спаду запишет это значение в регистр состояния.
- 2 такт: **SP + 1 -> SP, AR**
- 4 такт: **SP + 1 -> SP, AR**
- По фронту пустит значение указателя стека в АЛУ и прибавит 1.
- По спаду запишет полученное значение в указатель стека и в адресный регистр.
- 3 такт: **MEM(AR) -> DR**
- 5 такт: **MEM(AR) -> DR**
- По фронту найдёт ячейку по адресу.
- По спаду запишет значение этой ячейки в регистр данных.
- 4 такт: **DR -> IP**
- 6 такт: **DR -> IP**
- По фронту пустит значение регистра данных в АЛУ.
- По спаду запишет это значение в счетчик команд.
- 5 такт: **SP + 1 -> SP**
- 7 такт: **SP + 1 -> SP**
- По фронту пустит значение указателя стека в АЛУ и прибавит 1.
@@ -448,7 +431,7 @@
*Флаги, соответственно, возьмутся из регистра состояния.*
Цикл выборки адреса выполняться не будет, так как команда безадресная.
Циклы выборки адреса и выборки операнда выполняться не будут, так как команда безадресная.
---