Merge commit '64fe4d3436b0f12a31b8562c37342d6a23680f47'
This commit is contained in:
+41
-58
@@ -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 @@
|
||||
|
||||
*Флаги, соответственно, возьмутся из регистра состояния.*
|
||||
|
||||
Цикл выборки адреса выполняться не будет, так как команда безадресная.
|
||||
Циклы выборки адреса и выборки операнда выполняться не будут, так как команда безадресная.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user