[МУЗЫКА] [МУЗЫКА] [МУЗЫКА] Поговорим подробнее про системы и типы команд ЭВМ. Современные ЭВМ имеют много регистров, это их главная особенность. Регистр — это набор триггеров, который сидит прямо в процессоре, потому доступ к нему очень быстрый, с тактовой частотой процессора. А память, когда я был молодой, говорили, что она в четыре раза медленнее, чем процессор, сегодня говорят, что в 15‒20 раз медленнее, чем процессор. Поэтому чем больше регистров у машины, тем она быстрее, поскольку больше данных можно разместить, часто используемых данных можно разместить в регистрах. Команды в ЭВМ делятся по формату (например, регистр — регистр, регистр — память, память — память) и по типу. Первый тип — это работа с памятью: чтение, запись и семафорное чтение. Надо вам сказать, что двоичные семафоры реализуются сейчас не в процессоре, а в памяти. То есть есть в памяти такая команда — семафорное чтение, в одном такте. Принципиально: в одном такте читается байт, и в этом же такте туда пишутся все единички. На этой основе можно делать неделимое действие двоичный семафор, а из него уже сделать и более сложные семафоры. Итак, память: читать, писать — больше-то ничего и не надо. Арифметические команды: плюс, минус, умножить, разделить, взять остаток. Ну какие-то еще команды. Логические команды: И, ИЛИ, НЕ, исключающее ИЛИ. Ну, такого сорта логические команды. Команды передачи управления, я сейчас их разберу поподробней. И обычно есть всего одна команда SIO — Start Input/Output — команда, которая запускает операцию обмена. У этой команды есть параметр номер канала, запускается соответствующий канал, этот канал выполняет операцию обмена параллельно с работой процессора. Потом выдает прерывание, и процессор получает управление обратно. Итак, как устроены команды передачи управления? Главная команда: Branch. Это французское слово, надо говорить не «брэнч», а «бранч». Branch и Label, метка — передать управление по адресу, который указан вторым... который указан параметром. Бывает условная передача управления: Brach on condition. Указывается какое-то условие, в разных машинах это условие создается совершенно по-разному, и в этом курсе мы еще не раз к этому вопросу вернемся, но тем не менее. Итак, условная передача управления — это просто команда Branch, какое-то условие, по которому надо передать управление. Если условие выполнено, то управление передается, а не выполнено — проваливается на следующую команду. И если уж говорить в терминах водопровода, то если произойдет передача управления, то водопровод придется приостановить и разгонять заново, с нужного адреса по метке Label. А если передача управления не произойдет, а провалится на следующую команду, то с водопроводом ничего плохого не случится, и он останется наполненным. Механизм вызова подпрограмм. Команда основная Branch And Link. Значит, как она устроена. Вот, ну допустим, в определенном ассемблере, скажем, в IBM-овском: BAL R, Label. В регистр R записан адрес следующей команды, чтобы можно было вернуться. А управление передается по метке Label. Вот поглядите на этот слайд, вот здесь схематически представлено. Вот здесь идет сначала передача управления на подпрограмму, она исполняется, а в конце подпрограммы стоит возврат по регистру R. Здесь надо сказать несколько слов о технологии программирования, а точнее, о соглашениях о связях. Ведь внутри подпрограммы снова может быть вызов подпрограммы. Поэтому при входе принято сохранять регистр, ведь может быть испорчен не только регистр возврата, но и любой другой регистр. Поэтому обычно в начале подпрограммы стоит групповая выгрузка всех регистров в память, а в конце перед возвратом — групповая загрузка всех регистров из памяти, восстановление их. Кроме того, чтобы программу было легче сопровождать, читать, принято выполнять и другое соглашение о связях. Во многих системах есть традиция использовать определенный регистр для возврата. Скажем, в IBM — регистр 14. Кстати, в самом последнем вопросе курса я буду рассказывать про архитектуру ARM, там тоже 14-й регистр — это регистр возврата. Так что это такая многолетняя традиция, с 64-го года. Итак. Команда Branch And Link понятна, передаем управление. Адрес возврата запоминаем в следующем регистре. Адрес следующей команды запоминаем в регистре, а последняя команда подпрограммы — это возврат по регистру, и вы возвращаетесь на следующую команду после команды BAL. Таким образом устроены все подпрограммы. В некоторых случаях надо прервать последовательное исполнение программы и выполнить какое-то, резко выполнить другое действие. Ну например, из-за каких-то ошибок: аварийная ситуация (деление на 0, выход индекса за границу массива), завершение операции ввода/вывода, в конце концов, завершение кванта времени, выделенного операционной системой. В современных операционных системах применяется так называемая time sharing system — система разделения времени. То есть каждый из параллельных процессов получает определенный квант, в течение которого работает, потом он должен сдать управление супервизору, и супервизор даст квант времени другому процессу. В результате у процессов создается иллюзия, что они работают параллельно, хотя они работают на одном процессоре совершенно последовательно. Тем не менее, можно создавать иллюзию у программиста, а это иногда очень важно, например, для моделирования каких-то процессов, что процессы протекают параллельно. Так вот, истечение кванта времени — это тоже прерывание. Как прерывания реализуются? Каждое прерывание имеет свой номер. Обозначим последний адрес памяти машины идентификатором K. И вот тогда в адресе K, K − 1, K − 2, K − и т.д. столько, сколько есть типов прерываний в этой машине, стоят безусловные передачи управления. Зачем? И вот аппаратно работает так: прерывание аппаратно передает управление на соответствующую ячейку памяти в конце памяти. Соответственно ну если прерывание имеет номер i, то передается управление на ячейку с адресом K − i. А оттуда уже безусловная передача на обработчик. Зачем это нужно? Дело в том, что пытаются обеспечить определенную гибкость. Вот само прерывание — это чисто аппаратная вещь, делает сама машина, и операционная система здесь ни при чем. Но можно было бы зафиксировать все эти адреса, где там обрабатываются прерывания. Но тогда бы нельзя было бы подменить программу обработки прерываний, а это неудобно. Поэтому вот такая косвенность нужна для того, чтобы операционная система по команде пользователя назначила адреса, назначила какие-то обработчики прерывания для каждого прерывания, и тогда поставится команда безусловной передачи управления каждая на свой обработчик. И в любой момент пользователь может подменить программу обработки прерывания, заменив буквально одну команду в передаче безусловного прерывания, вот в K − i. Вот такая вещь обеспечивает какую-то гибкость. Я вам сейчас рассказал довольно кратко основные команды. Вот, ну понятно, как они работают. Дальше будут приведены примеры конкретных команд, но я хотел бы, чтобы были по крайней мере основные понятия введены в этом месте. Регистры — их вы всегда должны помнить, что они во много раз быстрее, чем память, команды передачи управления, команды передачи управления условные, с возвратом и прерывания. Я считаю, что это дает основное представление о том, как, какие действия может выполнять современная ЭВМ.