
- •Системное программное обеспечение Кошкин в. В.
- •Место программных средств в вычислительных системах
- •Состав по
- •Общие требования к программному обеспечению
- •Требования к проектируемому программному обеспечению
- •(2) Основные принципы проектирования программного обеспечения (по).
- •Механизмы выполнения программы
- •Последовательность выполнения программы. Основные положения.
- •2) Понятие процедур.
- •(3) Прерывания
- •(4) Процедура ввода/вывода.
- •Управление реальной памятью.
- •Управление виртуальной памятью.
- •Р абота с файлами.
- •Планирование заданий.
- •Распределение ресурсов
- •Защита пользователей.
- •Синхронизация процессов. (1) Синхронизация. Мониторы как инструмент синхронизации.
- •(2) Синхронизация. Реализация взаимного исключения. Семафоры.
- •Загрузчики.
- •Загрузчик, абсолютный загрузчик
- •Перемещающий загрузчик.
- •Управление процессами загрузки.
- •Связывающие загрузчики.
- •Динамическое связывание.
- •Макропроцессоры. (1) понятия о макропроцессорах.
- •(2 )Варианты построения макропроцессоров.
- •Компиляторы Основные функции компиляторов. Последовательность компиляции.
- •Свойства компиляторов, варианты построения.
- •Интерпретаторы.
- •Компиляторы в р-код.
- •Автоматизация процедуры компиляции.
- •Тестовое по. Основные принципы построения тестового по.
- •Основы методики тестирования.
- •Генерация тестовых последовательностей.
- •Вопросы для подготовки к экзаменам по Системному программному обеспечению
- •Объектный файл 1.Obj
- •Выполняемый файл 1.Exe
- •Если нужны изменения
Генерация тестовых последовательностей.
Любая оригинальная программа должна быть проверена посредством входных тестовых данных, контроля в определенных точках, с помощью других комбинаторных программ. В основу генерации контрольных данных обычно ставится граф (последовательность) прохождения потоков информации по программе. Как правило, он представляет из себя линейную структуру, с возможностью ветвления. Каждая вершина графа — операция преобразования входной величины, поэтому можно проследить изменение (преобразование) входных значений последовательно по графу. Первоначальный граф включает простые операторы, после анализа которых можно упростить структуру одним блоком, как бы объединить один фрагмент. Для данного фрагмента определяем интервалы (допустимые значения) входной информации. Соответственно получаем результат. Такая последовательная процедура приводит к упрощению сложной структуры — первый этап анализа программы. Непосредственно тестовые данные получаются при обратном просмотре, задаваясь выходными величинами. Поднимаясь вверх, мы из заданных выходных значений получаем (восстанавливаем) входные величины укрупненных блоков и далее непосредственно входные значения. Если задаться крайними возможными выходными значениями приходим поднимаясь вверх к предельным входным, которые входят в тестовый набор. Характерные точки выходных значений также восстанавливаются при подъеме как входные.
Такая последовательность позволит доказать корректность программы, но задача выбора минимально необходимого числа тестовых данных формально не решается, пользователь интуитивно подбирает эти значения. В настоящем времени процедура не формализована, но используется на практике. Основной недостаток тестирования по конкретному набору входных данных в том что он распространяет результат на все множество входных данных, хотя его не проверяет.
Вопросы для подготовки к экзаменам по Системному программному обеспечению
Место программных средств в вычислительных системах.
Назначение и структура программного обеспечения. Состав программного обеспечения ИВС.
Требования к проектированию ПО.
Основные принципы построения операционных систем.
Программная модель вычислителя. Состав аппаратных средств.
Последовательность выполнения программ.
Прерывания. Обращения к супервизору.
Программирование ввода-вывода.
Управление реальной памятью.
Управление виртуальной памятью.
Планирование заданий.
Защита от несанкционированных действий.
Синхронизация. Мониторы как инструмент синхронизации.
Синхронизация. Семафоры.
Загрузчики. Абсолютный загрузчик.
Перемещающий загрузчик.
Связывающие загрузчики. Редакторы связей.
Основные функции компиляторов. Последовательность компиляции.
Свойства компиляторов, варианты построения.
20. Назначение и основные функции операционных систем
21. Файловая система. Основные свойства файлов.
22. Операционная система UNIX
ВВЕДЕНИЕ
В ряду языков программирования Ассемблер занимает особое место. Это инструмент специалистов, работающих с операционными системами и их составляющими. В рамках изучения дисциплины «Системное про-граммирование» студенты должны получить начальные навыки по Ас-семблеру. Требуемая учебно-методическая литература по этому разделу отсутствует, что формирует потребность издания методических указа-ний.
Работа преследует цель познакомить студентов с основными методи-ческими приемами разработки программ, с базовыми функциями языка.
В результате освоения представленных работ студенты получат на-выки самостоятельной разработки небольших программ, необходимые для дальнейшей работы с операционными системами.
КРАТКИЕ СВЕДЕНИЯ ОБ АССЕМБЛЕРЕ
Язык Ассемблера является ориентированной на человека формой на-бора инструкций процессора (который называется также машинным языком). Поскольку машинный язык и язык Ассемблера функционально эквивалентны, на языке Ассемблера намного проще программировать. Язык Ассемблера позволяет иметь дело с мнемоническими именами ин-струкций. При этом инструкции транслируются из мнемонического вида в их машинный эквивалент. Это, несомненно, большое преимущество, так как люди просто не могут достаточно эффективно думать на число-вых языках. Неплохим качеством Ассемблера является то, что он позво-ляет управлять действиями процессора поэтапно (по операциям) и с мак-симальной эффективностью. К числу его недостатков можно отнести тот факт, что при каждом отдельно взятом действии процессора выполня-ется совсем немного функций, что отражает ограниченные возможности того, на что в действительности способен процессор. Например, процесс сложения двух длинных целых чисел и сохранения результата в третьем целом значении занимает на языке Си только одну строку: i = j + k; а на Ассемблере процессора 80Х86 это потребует шести строк.
Объем скомпилированного машинного кода на языке Си будет не меньше (а вероятнее всего больше), чем шесть машинных инструкций на языке Ассемблера. Но легче написать одну строку , чем шесть на Ассемблере (необходимо помнить, что инструкции Ассемблера отра-жают элементарные "способности" компьютера, и программы, написанные на любых языках, должны перед выполнением транслиро-ваться в машинный язык).
Зачем же тогда вообще использовать Ассемблер, если на нем про-граммировать труднее, чем на других языках? Причина в том, что Ассемблер позволяет обратиться к любой ячейке памяти и непосред-ственно управлять любым устройством ввода-вывода. С другой сторо-ны, Ассемблер является "родным" языком компьютера, хорошо напи-санная на Ассемблере программа позволит получить код с наимень-шим временем выполнения. Качество выполняемого кода, получаемо-го в других языках, страдает оттого, что приходится выполнять транс-ляцию с этого языка на машинный язык, а код на языке Ассемблера отображается в машинный язык непосредственно, без малейшей поте-ри эффективности. На языке Ассемблера вы указываете компьютеру, что нужно делать, и он делает именно это - не больше и не меньше.
Неэффективная программа на Ассемблере не будет быстро рабо-тать, поскольку процессор в точности повторяет все, что определено программой. Аналогично здесь отсутствует широкая поддержка встро-енного преобразования типов данных или предохранение от таких воз-можных ошибок, как случайная запись в переменную или выход за ко-нец массива. Все это означает, что на Ассемблере можно писать очень быстрые и развитые программы, но такие программы потребуют боль-ше мастерства и внимания, чем программы, написанные на других языках.
Аппаратные ресурсы Ассемблера
Команды ассемблера используют содержимое различных регистров процессора, логическая модель которых приведена на рисунке 1.
Сегментные регистры. Регистр CS - содержит начальный адрес сегмента кода. Этот адрес, суммированный со значением смещения в указателе команд (IP), определяет очередную выполняемую команду
Регистр DS - содержит начальный адрес сегмента данных. В прос-тейшем случае этот адрес плюс смещение, указанное в инструкции, задает адрес в сегменте данных.
Регистр SS - содержит начальный адрес регистра стека.
Регистр ES - используется для адресации памяти в строковых опе-рациях. В этом плане он похож на регистр DI.
Регистр ES инициализируется программой на ассемблере.
Регистры общего назначения AX,BX,CX,DX.
Регистры общего назначения являются основными рабочими регист-рами ассемблерных программ. Их отличает то, что к ним можно адресо-ваться одним словом или однобайтовым кодом. Левый байт считается старшим, а правый – младшим.
Регистр AX - первичный аккумулятор, используется во всех опера-циях ввода/вывода, в некоторых операциях со строками и в некоторых арифметических операциях. Регистр BX - базовый регистр, единст-венный из регистров общего назначения, используемый в индексной адресации. Кроме того, регистр BX используется при вычислениях.
Ah |
Al |
|
Управление программами |
Bh |
Bl |
||
Ch |
Cl |
||
Dh |
Dl |
||
SP |
CS |
||
BP |
DS |
||
SI |
SS |
||
|
ES |
Данные
-
ПАМЯТЬ
Арифметикологическое устройствоУстройство управления
Регистр флагов
Указатель команд
Рис. 1 Логическая модель регистров процессора
Регистр DX - регистр данных. Используется в некоторых операциях ввода/вывода, в операциях умножения и деления больших чисел сов-местно с регистром AX.
Любой из регистров общего назначения может быть использован для суммирования или вычитания 8- или 16-разрядных величин.
Регистры указателя SP и BP.
Регистры указателя используются для обращения к данным в сег-менте стека.
Регистр SP - указатель стека. Используется для временного хране-ния адресов и иногда данных. Адресует стек аналогично регистру SS.
Регистр BP - указатель базы. Обеспечивает ссылки на параметры (данные и адреса, передаваемые через стек).
Индексные регистры SI и DI.
Индексные регистры используются для адресации, а также для вы-полнения операций сложения и вычитания.
Регистр SI - индекс источника. Используется в некоторых операци-ях со строками или символами подобно регистру DS.
Регистр DI - индекс приемника. Используется в тех же операциях, что и регистр SI. Подобен регистру ES.
Регистр указателя команд IP используется для выборки очередной команды программы с целью ее исполнения.
Регистр флагов Flags содержит девять активных битов (из 16), которые отражают состояние машины и результаты выполнения ма-шинных команд.
OF (переполнения) равен 1, если возникает арифметическое пере-полнение, т.е. когда объем результата превышает размер ячейки назна-чения.
DF (направления) устанавливается в 1 для автоматического декре-мента в командах обработки строк, и в 0 для инкремента.
IF (разрешения прерывания) прерывания разрешены, если IF=1; если IF=0, то распознаются лишь немаскированные прерывания.
TF (трассировки) , если TF=1, то процессор переходит в состояние прерывания INT 3 после выполнения каждой команды.
SF (знака) - SF=1, когда старший бит результата равен 1. Иными словами, SF=0 для положительных чисел и SF=1 для отрицательных чисел.
ZF (нулевого результата)- ZF=1, если результат равен нулю.
AF (дополнительный признак переноса) - этот признак устанавливается в "1" во время выполнения команд десятичного сло-жения и вычитания при необходимости выполнения переноса или заема между полубайтами числа. Он полезен при проведении операций над числами длиной в несколько слов, которые сопряжены с переноса-ми и заемами из слова в слово.
Краткий перечень команд процессора
Пересылка данных
MOV PUSH POP XCHG OUT INXLAT LEA LDS
LES LAHF SAHFPUSHF POPF
Арифметические операции
ADD ADC INC SUB SBB DEC
CMP MUL IMUL DIV IDIV NEG
AAA DAA AAS DAS AAM AAD
CBW CWD
Логические операции
NOT SHL/SAL SHR SAR ROL ROR
RCL RCR AND TEST OR XOR
Обработка данных
REP MOVS CMPS SCAS LODS STOS
CMPB CMPSW LODSB LODSW MOVSB MOVSB
MOVSW REPE REPNZ SCASB SCASW STOSB
STOSW
Команды передачи управления
CALL JMP RET
Команды условного перехода
JA JLE JNL JS
JAE JNA JNLE JZ
JB JNAE JNO LOOP
JBE JNB JNP LOOPE
JC JNBE JNS LOOPNE
JCXZ JNC JNZ LOOPNZ
JE JNE JO LOOPZ
JG JNE JP JGE
JL JPE JNGE JPO
Команды прерывания
INT INTO IRET
Управление состоянием процессора
CLС CMC STС CLD STD CLI
STI HLT WAIT ESC LOCK NOP
Простая программа на Ассемблере включает в себя некоторое ко-личество строк. Рассмотрим, например, программу « 1.asm».
;Имя сегмента стека - STACKSG
STACKSG SEGMENT PARA STASK ’STASK’ ;Стандартный заголовок определения стека
DW 32 DUP(?) ;Задание глубины стека
ENDS ;Конец сегмента стека
;Определение сегмента данных
;Имя сегмента данных -DATASG
DATASG SEGMENT PARA ‘DATA’ ;Стандартный заголовок определения данных
;Здесь определяются данные
STRG DB 'Это строка результат выполнения программы',13,10,'$'
ENDS ;Конец сегмента данных
;Сегмент кода - тело программы
CODESG SEGMENT PARA ‘CODE’ ;Заголовок сегмента кода
BEGIN PROC FAR ;Начало программы - основной процедуры
;-------------------------------------------------------------------------
ASSUME CS; CODESG DS; DATASG SS; STASKSG; \
PUSH DS ;
SUB AX,AX ; Стандартный заголовок любой
PUSH AX ; EXE - программы
MOV AX, DATASG ; /
MOV DS,AX ; /
;-------------------------------------------------------------------------
;Непосредственно программа
LEA DX, STRG
MOV AH, 09
INT 21H
;-------------------------------------------------------------------------
RET ;
BEGIN ENDP ;Стандартный конец программы
CJDESG ENDS ;
END BEGIN
END BEGIN - директива, отмечающая конец исходного кода и ука-зывающая, где начинать выполнение при запуске программы.
Каждой программе на Ассемблере, чтобы обеспечить определение сегментов и управление ими, необходимы директивы определения сег-ментов (упрощенные или стандартные), а завершать программу на Ас-семблере всегда должна директива END.
Директивы представляют собой только "рамки" программы на Ас-семблере. В самой программе необходимы также строки исходного кода, выполняющие какие-либо действия, LEA DX,STRG, MOV AH,09.
Эти строки представляют собой группы символов, соответствующие набору инструкций процессора 80Х86. Однако перед тем, как использо-вать инструкции или директивы, следует изучить формат строки кода Ассемблера.
Строка на Ассемблере включает четыре поля: поле метки, поле кода операции, поле операнда и поле комментариев. Второе и третье поля считаются обязательными при работе с операндами. Пример записи строки:
М2 ADD BX ; сложение содержимого аккумулятора с регистром BX
Все символы, размещенные после символа “;” не транслируются и на работу программы влияния не оказывают. Поэтому в поле комментариев можно делать произвольные записи, в том числе разделяющие програм-му на фрагменты.
Метка (М2) ставится в строку при необходимости передачи управле-ния на нее.
В программировании первой программой традиционно является про-грамма, выводящая на экран сообщение 'Это строка результат выполне-ния программы'. Войдите в текстовый редактор (один из тех редакторов, которые формируют файлы в коде ASCII) и введите строки программы под названием 1 asm.
По сравнению с программами на языках Си или Паскаль программы на Ассемблере длиннее, поскольку каждая инструкция Ассемблера вы-полняет меньше функций, чем инструкция Паскаля или Си. С другой стороны можно комбинировать инструкциями Ассемблера так, как за-хочется. Это означает, что в отличие от языков Си и Паскаль, Ассемб-лер позволяет вам программировать компьютер таким образом, что он будет делать все, на что способен. Часто это стоит нескольких допол-нительных строк.
Перед запуском программы ее необходимо сохранить. Однако предварительно потребуется преобразовать программу в выполняемый вид (рис.2), для чего служат два дополнительных шага – ассемблиро-вание и компоновка.
На этапе ассемблирования исходный код (текст программы) пре-вращается в промежуточную форму, которая называется объектным модулем, а на этапе компоновки один или несколько модулей объе-диняются в выполняемую программу. Ассемблирование и компоновку можно выполнять с помощью командной строки.
Для ассемблирования файла 1.asm наберите в командной строке
TASM exe.1 asm.
и нажмите клавишу ENTER. Если вы не задали другое имя, файл 1.asm будет ассемблирован в файл 1.obj. ( Заметим, что расширение имени файла вводить не обязательно. Турбо Ассемблер подразумевает в этом случае, что файл имеет расширение .asm.) На экране вы увидите следующее:
Редактирование
Исходный файл Ассемблера 1.asm
Ассемблирование