diff --git a/OPD/OPDLab4/guide.md b/OPD/OPDLab4/guide.md index 31d0867..ddaa0a1 100644 --- a/OPD/OPDLab4/guide.md +++ b/OPD/OPDLab4/guide.md @@ -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 @@ *Флаги, соответственно, возьмутся из регистра состояния.* -Цикл выборки адреса выполняться не будет, так как команда безадресная. +Циклы выборки адреса и выборки операнда выполняться не будут, так как команда безадресная. ---