Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GOS / Дисциплины программистского цикла.doc
Скачиваний:
53
Добавлен:
09.05.2015
Размер:
1.51 Mб
Скачать

8. Макросредства языка Assembler.

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

Структура макроопределения:

<имя> macro [<параметры>]

<тело макроопределения>

endm

В теле макроопределения могут быть любые предложения языка Ассемблер.

Макрос сложения двух операндов:

addm macro x, y

mov ax, x

add ax, y

endm;

Иногда есть необходимость использовать метки. Определение Local L1, .. Ln указывается после директивы macro. Использование: напр. L1: endm.

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

3 типа блоков повторения

1) Rept n --n – количество повторений

<тело>

Endm

2) irp P, <V1, ..Vn> -- P – имя формального параметра, V1, ..Vn – фактические параметры

<тело>

endm

Макроассемблер заменяет такой блок n копиями тела блока. При этом в 1-й копии P заменяется на V1, … в n-й – на Vn.

3) irpc P, V1V2 .. Vn --P – формальный параметр, V1, ..Vn - символы

<тело>

Endm

Тело дублируется n раз и в каждой очередной копии Р заменяется очередным символом.

Макрооператоры

1) & Этот оператор задает конкетинацию. Напр. irp v, <arg1, arg2, arg3> arg&v div 1

2) <> используется в тех случаях, когда фактический параметр должен содержать ,

Irp d, <<1,2>,3> div d endm div 1,2 , div 3

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

irp p, <A!>,B> div p endm --div a> , div b

4) % указывает на то, что следующее за ним выражение должно быть вычислено

k=2 irp p, <k+1, %k+1, w%k+1> div p endm -- div k+1, div 3, div w3.

В определении любой макрокоманды можно использовать другую, ранее определенную макрокоманду.

Блоки условного ассемблирования имеют структуру

If <заголовок> P1 [else P2] endif

Блок усл. ассемблирования позволяет в зависимости от условия, заданного в if заголовке, включить в текст программы либо текст P1, либо текст P2.

1) if A. Здесь А – некоторое выражение, условие считается выполненным, если А≠0.

2) ife A. Условие считается выполненным, если А=0.

3) ifidn a, b ifdif a, b в 1-м случае условие считается выполненным, если a и b совпадают, во 2-м не совпадают.

9. Основные типы ядра операционной системы

Все модули ОС можно разбить на 2 группы:

  1. Ядро, выполняющее основные функции

  2. Вспомогательные системы

Ядро выполняет такие базовые функции ОС, как управление процессами, памятью, вводом-выводом и т.д. Ядро так же поддерживает определенный API для других приложения. Функции этого API называют системными вызовами.

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

Все пользовательские приложения работают в пользовательском режиме, не имея возможности использовать некоторые команды ввода-вывода, управления памятью и т.п.

Всё это реализуется ядром и системными вызовами.

Существуют 4 основных вида ядер ОС:

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

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

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

2) Модульное ядро — современная, усовершенствованная модификация архитектуры монолитных ядер операционных систем компьютеров.

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

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

Достоинства: Устойчивость к сбоям оборудования, ошибкам в компонентах системы.

Недостатки: Передача данных между процессами требует накладных расходов.

4) Гибридные ядра это модифицированные микроядра, позволяющие для ускорения работы запускать «несущественные» части в пространстве ядра.

Имеют «гибридные» достоинства и недостатки.

Все рассмотренные подходы к построению операционных систем имеют свои достоинства и недостатки. В большинстве случаев современные операционные системы используют различные комбинации этих подходов. Так, например сейчас, ядро «Linux» представляет собой монолитную системус отдельными элементамимодульного ядра. При компиляции ядра можно разрешить динамическую загрузку и выгрузку очень многих компонентов ядра — так называемых модулей. В момент загрузки модуля его код загружается на уровне системы и связывается с остальной частью ядра. Внутри модуля могут использоваться любые экспортируемые ядром функции. ЯдроWindows NT также является гибридным.

10. Лямбда-нотация. Лямбда-выражения. Лямбда-вызов. Этапы Лямбда-преобразования. Примеры объединения Лямбда-вызовов.

Лямбда-выражения в Лиспе являются механизмом описания параметризированных функций.

Синтаксис лямбда-выражения:

(LAMBDA ( x1 x2 ... xn ) fn)

где x1 x2 ... xnформальные параметры, а fn – тело функции, являющееся ее описанием.

Телом функции является произвольная форма, значение которой может быть вычислено интерпретатором Лиспа: константа, связанный со значением символ, или композиция из вызовов функций.

Пример лямбда-выражения для функции, вычисляющей сумму квадратов аргументов:

(lambda (x y) (+ (* x x) (* y y)))

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

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

(лямбда-выражение a1 a2 … an)

Здесь ai – формы, задающие фактические параметры, которые вычисляются как обычно.

Пример:

((lambda (x y) (+ x y)) 2 3) ; = (+ 2 3) = 5

((lambda (x y) (cons x (cons y nil))) ‘a ‘b) ; = (A B)

Такие формы называют лямбда-вызовами.

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

Объединение лямбда-вызовов: вложенные лямбда-вызовы можно ставить как на место тела лямбда-выражения, так и на место фактических параметров.

Примеры:

( ( lambda (y) ((lambda (x) (list y x) ‘inside) ) ‘outside ) ; = (OUTSIDE INSIDE)

( (lambda (x) (list ‘second x)) ((lambda (y) (list y)) ‘first ) ; = (SECOND (FIRST))

Лямбда-выражение без аргументов не вычисляется интерпретатором и выдает ошибку!

Именование лямбда-выражения функцией DEFUN:

I) (DEFUN proc-name lambda-list lambda-body)

II) (DEFUN proc-name lambda-expression)

Examples:

I) (defun list1 (lambda (x y) (cons x (cons y nil))))

II) (defun list1 (x y) (cons x (cons y nil)))

(list1 ‘a ‘b) ; =(A B)

FBOUNDP – проверяет, связано ли с символом определение функции

(fboundp ‘list1) ; =T

SYMBOL-FUNCTION – дает определение функции, связанное с символом

(symbol-function ‘list1) ; =(defun list1 (x y) (cons x (cons y nil)))

В лямбда-списке также можно задавать ключевые слова. С их помощью можно выделить:

- необязательные аргументы (&OPTIONAL)

- параметр, связываемый с хвостом списка аргументов изменяющейся длины (&REST)

- ключевые параметры (&KEY)

- вспомогательные переменные функции (&AUX)

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

Пример: у функции есть обязательный параметр X и необязательный Y со значением по умолчанию (+ X 2):

(defun fn (x &optional (y (+ x 2))) (list x y))

(fn 2) ; =(2 4)

(fn 2 5) ; =(2 5)

Пример с переменным количеством параметров:

(defun fn (x &optional y &rest z)) (list x y z))

(fn ‘a) ; =(A NIL NIL)

(fn ‘a ‘b ‘c ‘d) ; =(A B (C D))

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

(defun fn (&key x y (z 3)) (list x y z))

(fn :y 2 :x 1) ; =(1 2 3)