Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции кошкин.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
667.65 Кб
Скачать

Генерация тестовых последовательностей.

Любая оригинальная программа должна быть проверена посредством входных тестовых данных, контроля в определенных точках, с помощью других комбинаторных программ. В основу генерации контрольных данных обычно ставится граф (последовательность) прохождения потоков информации по программе. Как правило, он представляет из себя линейную структуру, с возможностью ветвления. Каждая вершина графа — операция преобразования входной величины, поэтому можно проследить изменение (преобразование) входных значений последовательно по графу. Первоначальный граф включает простые операторы, после анализа которых можно упростить структуру одним блоком, как бы объединить один фрагмент. Для данного фрагмента определяем интервалы (допустимые значения) входной информации. Соответственно получаем результат. Такая последовательная процедура приводит к упрощению сложной структуры — первый этап анализа программы. Непосредственно тестовые данные получаются при обратном просмотре, задаваясь выходными величинами. Поднимаясь вверх, мы из заданных выходных значений получаем (восстанавливаем) входные величины укрупненных блоков и далее непосредственно входные значения. Если задаться крайними возможными выходными значениями приходим поднимаясь вверх к предельным входным, которые входят в тестовый набор. Характерные точки выходных значений также восстанавливаются при подъеме как входные.

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

Вопросы для подготовки к экзаменам по Системному программному обеспечению

  1. Место программных средств в вычислительных системах.

  2. Назначение и структура программного обеспечения. Состав программного обеспечения ИВС.

  3. Требования к проектированию ПО.

  4. Основные принципы построения операционных систем.

  5. Программная модель вычислителя. Состав аппаратных средств.

  6. Последовательность выполнения программ.

  7. Прерывания. Обращения к супервизору.

  8. Программирование ввода-вывода.

  9. Управление реальной памятью.

  10. Управление виртуальной памятью.

  11. Планирование заданий.

  12. Защита от несанкционированных действий.

  13. Синхронизация. Мониторы как инструмент синхронизации.

  14. Синхронизация. Семафоры.

  15. Загрузчики. Абсолютный загрузчик.

  16. Перемещающий загрузчик.

  17. Связывающие загрузчики. Редакторы связей.

  18. Основные функции компиляторов. Последовательность компиляции.

  19. Свойства компиляторов, варианты построения.

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

DI

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

Ассемблирование