Это именованный набор команд программы который можно вызвать из другой части программы

Микропроцессорная система может находиться в одном из следующих режимов работы: ∙ выполнение основной программы; ∙ вызов подпрограмм; ∙ обработка прерываний и исключений; ∙ прямой доступ к памяти. Выполнение основной программы. В этом режиме микропроцессор последовательно загружает из памяти команды и выполняет их.

Для загрузки следующей команды микропроцессор хранит указатель (адрес) на нее в специальном регистре — программном счетчике (Program Counter — PC, или Instruction Pointer — IP). Содержимое этого регистра увеличивается на единицу каждый раз после выборки из памяти очередного слова * основной программы.

При выполнении команд ветвления (безусловный и условный переходы, циклы) в счетчик загружается новое значение из кода адресации операндов, в результате процессор переходит к выполнению другой части программы. При использовании механизмов относительной адресации регистр PC является базовым регистром, к которому прибавляется адресная часть команды.

Очередная команда, загруженная из памяти команд, поступает в регистр команд в устройстве управления. Затем она дешифрируется, т. е. расшифровывается КОП, и вычисляются адреса операндов согласно КАД.

Python с нуля | Функции в Python | Определение, вызов, позиционные и именованные аргументы, return

Далее устройство управления в соответствии с операндом команды генерирует последовательность управляющих сигналов, которая в конечном счете приводит к выполнению поступившей команды и обеспечивает получение нужного результата. Выборка каждой команды требует определенного количества тактов сигнала частоты. Если в системе команд процессора предусмотрены команды различной разрядности, то для выборки всей команды * Разрядность слова зависит от разрядности шины данных общения с памятью. В самом простом случае слово равно одному байту.

необходимо знать ее общую длину. Поэтому в такой системе устройство управления считывает из памяти сначала первое слово команды, в котором содержится длина команды (непосредственно или косвенно в КОП), а затем остальную команду и помещает в регистр устройства управления.

Применение системы команд с фиксированной разрядностью упрощает разработку процессора, поскольку отпадает необходимость в реализации механизмов определения длины команды. Машинным ( процессорным ) тактом в микропроцессорных системах называют длительность тактовых сигналов , которая задается тактовой частотой микропроцессора.

При выполнении операций, не требующих обращений к системной шине, эта частота определяет производительность микропроцессора. Вызов подпрограмм. Для эффективного использования памяти дублирующиеся участки программы выделяют в отдельные подпрограммы.

Для обращения к таким подпрограммам в систему команд процессора вводятся специальные команды вызова подпрограмм и возвращений из них (обычно обозначаемые CALL и RET соответственно). Команда CALL в коде адреса содержит указатель на первый байт подпрограммы (или смещение, если используется относительная адресация), который загружается в регистр PC, обеспечивая на следующем такте выборку первой команды из подпрограммы.

Учим python за 7 часов! Уроки Python Полный курс обучения программированию на python с нуля

Предварительно текущее значение программного счетчика сохраняется для последующего возврата в основную программу. При поступлении команды RET процессор восстанавливает предыдущее значение регистра PC и продолжает выполнение основной программы с команды, следующей за командой CALL.

Основная проблема при реализации механизма вызова подпрограмм — необходимость обеспечить возможность последовательного вызова вложенных подпрограмм (рис. 2.5.1 ). При вложенном вызове подпрограмм процессор должен запоминать адрес возврата каждой подпрограммы, при этом количество вложений не должно быть ограничено. Для реализации такой возможности существует несколько подходов, в частности, использование стека. Стек (от англ. stack — стопка) — это структура данных, работающая по принципу «последним пришел — первым вышел» (Last In, First Out — LIFO). Стековая память может различаться по способу реализации: регистровый стек или стек на основе ОЗУ.

A 0 Первая B 0 Первая C 0 Первая
команда команда команда
. . . . . .
Вызов Вызов
A i подпрограммы B i подпрограммы
(CALL) (CALL) . . .
A i+ 1 B i+ 1
. . . . . .
Возврат из Возврат из
A N Завершение B M подпрограммы C K подпрограммы
(RET) (RET)
Рис. 2.5.1. Последовательный вызов вложенных подпрограмм
Из PC В PC Регистровый стек состоит
из набора регистров (рис. 2.5.2 ),
CALL RET
данные по которым могут переме-
PC( n ) щаться как в одну, так и в дру-
гую сторону. Команда CALL вы-
PC( n – 1) зывает запись содержимого реги-
стра PC в вершину стека, одно-
PC( n – 2) временно сдвигая остальные дан-
ные вниз. Команда RET, напро-
Регистры тив, считывает содержимое самого
сдвига верхнего регистра в PC, сдвигая
. . . остальные данные вверх. Количе-
ство регистров в стеке (называе-
мое глубиной стека ) определяет
Рис. 2.5.2. Регистровый стек максимальное количество вложен-
ных подпрограмм. Если все реги-
Читайте также:
Что делать если не совпадает версия программы

стры заняты и при этом снова происходит вызов подпрограммы, то последняя точка возврата теряется, и процессор не может вернуться к основной программе. Обычно в микропроцессорных системах с такой организацией стека при исчерпании всех ячеек генерируется внутреннее исключение, обработчик которого может выгрузить дан-
ные из стека в ОЗУ.

Такой подход снимает ограничение на количество вложенных подпрограмм, но требует от программиста написания дополнительных секций программы, отвечающих за обработку исключения. Если число вложений подпрограмм ограничено на уровне проектирования программы и не превышает глубину стека, то никаких дополнительных мер предпринимать не нужно. Стек на основе ОЗУ (рис.

2.5.3 ) — более совершенное решение стековой памяти. В этом случае в ОЗУ выделяется отдельный участок для работы в качестве стека. Адресация к ячейкам стека производится с помощью специального регистра — указателя стека (Stack Pointer — SP), который входит в состав УУ либо является одним из регистров общего назначения.

Регистр SP содержит адрес последней (самой верхней) заполненной ячейки стека, в которой хранится значение PC, записанное командой CALL. При переходе на новую подпрограмму значение SP увеличивается на единицу, указывая на новую еще не заполненную ячейку памяти. После этого в нее записывается текущее значение PC. Таким образом происходит последовательное заполнение стека «снизу-вверх», при этом регистр SP всегда указывает на вершину стека. При выходе из подпрограммы с помощью оператора RET в регистр PC записывается значение, хранящееся в вершине стека, а регистр SP декрементируется. ОЗУ

Следующий
PC( n + 1) вызов
подпрограммы
PC( n ) Вершина
стека
PC( n – 1)
Стек
. . .

Рис. 2.5.3. Стек на основе ОЗУ Поскольку ОЗУ, как правило, имеет значительный объем, то для стека можно выделить достаточно большое количество ячеек, обес-
печивая необходимый уровень сложения подпрограмм. Вместе с тем этот способ реализации стековой памяти имеет недостаток, связанный с необходимостью доступа к памяти всякий раз при входе в подпрограмму или выходе из нее.

Это замедляет работу программы, особенно при большом количестве маленьких подпрограмм. Для снижения накладных расходов на работу со стеком при вызове подпрограмм в некоторых системах получил распространение метод регистрового окна , разработанный в университете Беркли (США) и примененный в архитектуре системы команд SPARC, а позднее в процессоре Intel i960.

Предположим, что блок РОН состоит из регистров, расположенных по кругу (рис. 2.5.4 ). Программе доступна лишь часть регистров , составляющих текущее регистровое окно. Окно делится на три части: 1 — входные регистры, 2 — локальные регистры, 3 — выходные регистры. При переходе в подпрограмму, регистровое окно сдвигается таким образом, что выходные регистры предыдущей активной программы становятся входными регистрами текущей. Как следствие, сохраняется в неизменном виде текущее состояние программы, а частичное перекрытие окон дает возможность передачи входных параметров запускаемой подпрограмме.

W 4
W 5 W 3 CALL
W 6 W 2
RET W 7 W 1
W 0 Текущее
окно
(CWP)

Рис. 2.5.4. Блок РОН с восемью регистровыми окнами

Указатель на начало текущего окна хранится в специальном регистре CWP (Current Window Pointer). В случае исчерпания лимита окон генерируется исключение и необходимо выгрузить содержимое первого регистрового окна в ОЗУ (так же, как это делается в регистровом стеке). Обработка прерываний и исключений.

При работе микропроцессорной системы появляются события (например ввод данных от ВУ, или сработавший системный таймер), которые требуют немедленной реакции на них, для чего необходимо прервать текущую выполняемую программу и запустить подпрограмму обработки возникшего события. Такие события называются прерываниями (interrupt), или исключениями.

Механизм обработки прерываний похож на механизм перехода в подпрограмму. При появлении сигнала прерывания процессор должен сохранить текущее состояние ( контекст ): ∙ регистр PC для обеспечения возможности возврата к выполнению основной программы; ∙ регистры состояния процессора (флаги АЛУ и т. п.); ∙ регистры общего назначения; ∙ специальные регистры.

После этого процессор передает управление обработчику прерывания, который производит необходимые действия для обеспечения реакции системы на прерывание и возвращает управление основной программе. Затем процессор возвращает контекст основной программы и продолжает выполнение с точки останова. Прямой доступ к памяти.

Для выполнения рутинных операций пересылки массивов данных между ОЗУ и каким-либо внешним устройством применяется специальный режим прямого доступа к памяти (ПДП). Для этого в современные процессоры встраивают отдельный контроллер ПДП, связанный общей шиной с ОЗУ и периферийными устройствами. Когда процессору необходимо переслать некоторый объем данных, он программирует контроллер ПДП на выполнение этой задачи. Процесс программирования состоит в передаче контроллеру трех значений: адреса—источника данных, адреса—приемника данных и количества передаваемых слов. Затем контроллер сам начинает передачу данных, а процессор в это время может выполнять основную программу.

Читайте также:
Esse est percipi как мировоззренческий ориентир и программа исследований

Контроллер ПДП может иметь внешние сигналы запросов от периферийных устройств. При появлении такого сигнала на входе контроллер начинает копировать данные по заложенной процессором заранее программе. После завершения копирования контроллер ПДП генерирует сигнал прерывания, сообщая процессору, что данные скопированы и с ними можно работать.

Применение режима ПДП позволяет избавить процессор от выполнения задач пересылки данных, которые могут быть весьма длительными, особенно при общении с медленными периферийными устройствами. Учитывая материал предыдущих лекций, рассмотрим типовую структуру современной микропроцессорной системы, построенной по магистрально-модульному принципу (рис.

2.5.5 ). Все отдельные устройства (модули), входящие в состав такой системы, обмениваются данными по общей системной магистрали. Основным модулем такой системы является микропроцессор, содержащий устройство управления, одно или несколько операционных устройств и блок РОН. Модуль ОЗУ необходим для хранения выполняемой программы (или ее части) и обрабатываемых данных.

ПЗУ предназначено для хранения выполняемой программы и констант. В процессорах общего назначения в ПЗУ хранится загрузчик — небольшая программа, которая загружает из внешнего запоминающего устройства в ОЗУ основную программу. В процессорах цифровой обработки сигналов в ПЗУ могут храниться таблицы часто используемых арифметических функций, например синусов.

Внешние устройства подключаются к общей шине посредством периферийных адаптеров (ПА), реализующих протоколы параллельного или последовательного обмена. В однокристальных микропроцессорных системах внешними устройствами могут быть различные таймеры, встроенные блоки АЦП и ЦАП, контроллеры внешней памяти, интерфейсы USB и др.

Многие внешние устройства могут генерировать сигналы прерываний и запросы ПДП. Для реализации всех возможностей таких устройств к общей шине подключаются также контроллер прерываний и контроллер ПДП. Структура системы с общей шиной упрощает разработку и программирование процессора. Доступ к памяти и внешним устройствам осуществляется с помощью одних и тех же команд пересылки. С другой стороны, такая реализация является достаточно медленной, по-

К ВУ
Микропроцессор ПЗУ . . .
ОЗУ ПА 1 ПА n
УУ ОУ РОН . . .

Общая магистраль

Источник: studfile.net

Процедуры в VBA: Основные понятия. Урок №32

В предыдущих уроках мы уже работали с процедурами в VBA, когда рассматривали примеры кода и запускали выполнение написанных программ. И вот сейчас, пришло время более детально изучить данную тему.

Процедура VBA – это именованная, сохраняемая в модуле программа, состоящая из некоторой последовательности операторов, которые выполняют определённые действия с разными объектами. Это наименьшая единица программного кода в VBA.

Как правило, программный код VBA представляет из себя совокупность процедур, каждая из которых решает конкретную задачу.

В модуле может храниться неограниченное количество процедур.

Типы процедур в VBA

  1. Процедура типа Sub (подпрограмма) – это независимая часть программы, которая выполняет определённый блок операторов. Одна процедура типа Sub может вызывать (выполнять) другую.
  2. Процедура типа Function (функция) выполняет заданные вычисления и возвращает результат в виде значения, которое присваивается переменной с именем данной функции. Функцию можно вызывать из другой процедуры.
  3. Процедура типа Property (процедура свойств) определяет значение свойств объекта определённого пользователем класса.
  4. Процедура обработки события (event procedure) – это процедура типа Sub специального назначения, которая выполняется при возникновении некоего события.

Создание процедур в VBA

Поскольку все VBA процедуры хранятся в модулях то, прежде чем приступать к их написанию, нужно создать новый модуль. Или же выбрать существующий модуль для этой цели.

Текст любой процедуры начинается с операторов, которые определяют её имя и параметры: Sub, Function, Property, или Evet. Окончание процедуры определяется оператором End. Между операторами объявления и окончания процедуры помещается команда, или набор команд программы.

Синтаксис процедуры Sub

Sub Имя [(аргументы)]
(операторы)
End Sub

  • Sub – обязательное ключевое слово, которое указывает на начало процедуры.
  • Имя – имя процедуры (обязательно должно быть уникальным и составляется согласно правилам языка VBA).
  • аргументы – значение, которое передаётся параметру процедуры при её вызове. Это необязательный параметр. Заключается в скобки. Если аргументов несколько, то они разделяются запятыми. Если у процедуры нет аргументов, то после её имени ставят пустую пару скобок.
  • End Sub – указывает компилятору VBA об окончании выполнения программного кода текущей процедуры.

Область действия процедур в VBA

Каждая VBA процедура имеет свою область действия, в пределах которой её можно вызвать из других процедур. Эта область действия определяется при объявлении процедуры с помощью ключевых слов Private, или Public.

В зависимости от области действия, выделяют три типа процедур:

  • Процедуры доступные для всех процедур в текущем модуле и недоступные для процедур, которые находятся в других модулях. Объявляются такие процедуры с помощью ключевого слова Private.
Читайте также:
Как устанавливать программы rosa linux

Private Sub Имя [(аргументы)]
(операторы)
End Sub

  • Процедуры доступные для всех модулей во всех проектах. Объявляются они с помощью ключевого слова Public. Поскольку в VBA эта область действия процедур принята по умолчанию, то ключевое слово Public не обязательно указывать при объявлении процедур.

Public Sub Имя [(аргументы)]
(операторы)
End Sub

  • Процедуры доступные для всех процедур текущего проекта и недоступные для других проектов. Объявляются с помощью ключевого слова Public и добавлением в модуль оператора Option Private Module.

Если вы создаёте переменную в процедуре, то она доступна только в пределах только этой процедуры. Каждый раз при запуске процедуры она создаётся заново, а при завершении её работы – уничтожается. Такие переменные называют локальными.

Но если вам нужно, чтобы переменная не уничтожалась, а сохраняла своё значение между вызовами процедуры, то при её объявлении используют не Dim, а Static. Такие переменные называют статическими.

Если указать Static при объявлении процедуры, то все переменные в ней будут статическими и их значение будет сохранено даже после завершения выполнения процедуры.

Static Sub Имя [(аргументы)]
(операторы)
End Sub

Вас может заинтересовать

  • Коллекции, контейнеры и объектная модель в VBA. Урок №41
  • Объекты в VBA. Урок №40
  • Ошибки выполнения процедур и функций VBA. Урок №39
  • Процедуры типа Function. Урок №38
  • Функции в VBA и их аргументы. Урок №37
  • Способы вызова процедур в VBA. Урок №36
  • Способы передачи аргументов в процедуру. Урок №35
  • Передача аргументов при вызове процедуры в VBA. Урок №34
  • Аргументы процедур в VBA. Урок №33

Источник: d-nik.site

Это именованный набор команд программы который можно вызвать из другой части программы

Функции представляют блок кода, который выполняет определенную задачу и который можно повторно использовать в других частях программы. В предыдущих статьях уже использовались функции. В частности, функция print() , которая выводит некоторое значение на консоль. Python имеет множество встроенных функций и позволяет определять свои функции. Формальное определение функции:

def имя_функции ([параметры]): инструкции

Определение функции начинается с выражения def , которое состоит из имени функции, набора скобок с параметрами и двоеточия. Параметры в скобках необязательны. А со следующей строки идет блок инструкций, которые выполняет функция. Все инструкции функции имеют отступы от начала строки.

Например, определение простейшей функции:

def say_hello(): print(«Hello»)

Функция называется say_hello . Она не имеет параметров и содержит одну единственную инструкцию, которая выводит на консоль строку «Hello».

Обратите внимание, что инструкции функции должны иметь отступы от начала функции. Например:

def say_hello(): print(«Hello») print(«Bye»)

Здесь инструкция print(«Bye») не имеет отступов от начала функции say_hello и поэтому в эту функцию не входит. Обычно между определением функции и остальными инструкциями, которые не входят в функцию, располагаются две пустых строки.

Для вызова функции указывается имя функции, после которого в скобках идет передача значений для всех ее параметров:

имя_функции ([параметры])

Например, определим и вызовем функцию:

def say_hello(): # определение функции say_hello print(«Hello») say_hello() # вызов функции say_hello say_hello() say_hello()

Здесь три раза подряд вызывается функция say_hello. В итоге мы получим следующий консольный вывод:

Hello Hello Hello

Обратите внимание, что функция сначала определяется, а потом вызывается.

Если функция имеет одну инструкцию, то ее можно разместить на одной строке с остальным определением функции:

def say_hello(): print(«Hello») say_hello()

Подобным образом можно определять и вызывать и другие функции. Например, определим и выполним несколько функций:

def say_hello(): print(«Hello») def say_goodbye(): print(«Good Bye») say_hello() say_goodbye()
Hello Good Bye

Локальные функции

Одни функции могут определяться внутри других функций — внутренние функции еще называют локальными . Локальные функции можно использовать только внутри той функции, в которой они определены. Например:

def print_messages(): # определение локальных функций def say_hello(): print(«Hello») def say_goodbye(): print(«Good Bye») # вызов локальных функций say_hello() say_goodbye() # Вызов функции print_messages print_messages() #say_hello() # вне функции print_messages функция say_hello не доступна

Здесь функции say_hello() и say_goodbye() определены внутри функции print_messages() и поэтому по отношению к ней являются локальными. Соответственно они могут использоваться только внутри функции print_messages()

Организация программы и функция main

В программе может быть определено множество функций. И чтобы всех их упорядочить, одним из способов их организации является добавление специальной функции (обычно называется main ), в которой потом уже вызываются другие функции:

def main(): say_hello() say_goodbye() def say_hello(): print(«Hello») def say_goodbye(): print(«Good Bye») # Вызов функции main main()

Источник: metanit.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru