Сделай Сам Свою Работу на 5

Восстановление после ошибок.

Задание №1.

1) Теория.

a) Язык ассемблера процессора Intel IA-32. Директивы ассемблера. Директивы описания данных. Структура программы на языке ассемблера. Команды управления потоком выполнения команд. Дать примеры программного кода на ассемблере. (30 баллов)

2) Практические задания.

b) Написать программу на ассемблере IA-16, вычисляющую максимальное значение числа N, при котором N! не переполняет одно слово (2 байта). (30 баллов)

1) Каждая программа на языке ассемблера помимо команд процессора содержит еще и специальные инструкции, указывающие самому ассемблеру, как организовывать различные секции программы, где располагаются данные, а где команды, позволяющие создавать макроопределения, выбирать тип используемого процессора, организовывать связи между процедурами и т.д. К сожалению, пока нет единого стандарта на эти команды (он существует для UNIX). Разные ассемблеры используют различные наборы директив, но TASM и MASM (два самых популярных ассемблера для DOS и Windows) поддерживают общий набор.
Программа на языке ассемблера состоит из строк, имеющих следующий вид: метка команда/директива операнды ;комментарий
Рассмотрим директивы, работающие напрямую с метками и их значениями, — LABEL и EQU.
метка label тип

Директива LABEL определяет метку и задает ее тип. Тип может быть одним из:

– BYTE (байт),

– WORD (слово),

– DWORD (двойное слово),

– FWORD (6 байт),

– QWORD (учетверенное слово),

– TBYTE (10 байт),

– NEAR (ближняя метка),

– FAR (дальняя метка).

Метка получает значение, равное адресу следующей команды или следующих данных, и тип, указанный явно. В зависимости от типа команда

mov метка,0

запишет в память байт (слово, двойное слово и т.д.), заполненный нулями, а команда

call метка

выполнит ближний или дальний вызов подпрограммы.

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

метка equ выражение

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



truth equ 1


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

DW — определить слово (2 байта);

DD — определить двойное слово (4 байта);

DF — определить 6 байт (адрес в формате 16-битный селектор: 32-битное смещение);

DQ — определить учетверенное слово (8 байт);

DT — определить 10 байт (80-битные типы данных, используемые FPU).

 

Пример ассемблерной программы сложения нескольких чисел. Ассемблерные директивы .data и .code определяют начало областей данных и кода (то есть команд) программы. Директива DD (Definition Double (Double word)) выделяет в области данных 4-байтовое двойное слово. NUM1 — это метка, назначенная адре­су первого из двойных слов, которые инициализированы значениями 17, 3, -51, 242 и -113. Адресам следующих двух двойных слов, инициализированных значе­ниями 5 и 0, назначены метки N и SUM. Три символических имени, объявленных в разделе данных, используются в ко­мандах в разделе кода. В частности, метка MAIN предназначена для определения точки начала выполнения программы, а также задается в ассемблерной директи­ве END, которой заканчивается текстовый файл программы.

 

Data ; директивы асемблера инициируют данные в сегменте данных

NUMLIST DD 17,3,-51,242,-113

NUM1 EQU NUMLIST

N DD 5

SUM DD 0

Code : команды ассемблера в сегменте кода

MAIN:
LEA EBX,NUM1 ;Загрузка адреса NUM1 в базовый регистр

SUB EBX,4 ;Уменьшение адреса на 4

MOV ECX,N ; Загрузка значения счетчика

MOV EAX,0 ;Обнуление регистра суммы

STARTADD: ADD EAX,(EBX+ECX*4) ;Определение адреса следующего и прибавление к EAX

LOOP STARTADD ;Уменьшение на 1 счетчика ECX и

;если ECX >0, переход на STARTADD

MOV SUM,EAX ;Пересылка суммы по адресу SUM

… …

SUM DEF ? ;сегмент данных программы

N DEF n

NUM1 DEF ?

NUM2 DEF ?

NUM3 DEF ?

… …

NUMn DEF ?

END MAIN ;директива ассемблера

Существует два способа отклонения программы от «прямолинейного курса». Первый из них— это вызов подпрограммы и возврат из нее. Кроме того, в программе могут выполняться переходы к задан­ным командам — как условные, так и безусловные.

Задание №2.

1) Теория.

a) Арифметические команды. Сложение, умножение, деление, вычитание. Дать примеры программных кодов на ассемблере. (30 баллов)

2) Практические задания.

a) Написать программу на языке ассемблер IA-16, в которой определены две переменных х и у двойные словаи подпрограмму, вычисляющую сумму х + у. Параметры передаются через стек процессора.(30 баллов)

1) Команды вычитания\сложения

Команда SUB (вычитание), так же как и ADD выполняет вычитание байтов или слов, содержащих двоичные данные. Вычитание осуществляется в компьютере по методу сложения с двоичным дополнением: для второго операнда устанавливаются обратные значения битов и прибавляется 1, а затем происходит сложение с первым операндом. Во всем, кроме первого шага, операции сложения и вычитания идентичны.

Существует пять возможных комбинаций операндов: Примеры:

вычитание регистр – регистр SUB EAX,EBX;

вычитание память – регистр SUB NUMB,EBX;

вычитание регистр – память SUB EAX,NUMB;

вычитание регистр - непосредственное значение SUB EAX,100;

вычитание память - непосредственное значение SUB 100,EBX.

Команды умножения и деления

Кроме команд для сложения и вычитания целых чисел со знаком, описанных в разделе 5.5, в наборе команд IA-32 имеются команды для целочисленного ум­ножения и деления, а также для выполнения арифметических операций над чис­лами с плавающей запятой.

Имеются следующие команды умножения:

MUL – для умножения чисел без знака;

IMUL - для умножения чисел со знаком.

В общем случае в результате умножения двух 32-разрядных чисел получается произведение двойной длины, то есть 64-разрядное значение. Однако для многих приложений достаточно иметь результат одинарной длины, то есть 32-разрядное значение. В подобных ситуациях используются разные команды. Результат оди­нарной длины генерирует команда

IMUL REG,src(исходный)

помещающая 32-разрядное значение результата в регистр общего назначения REG. Исход­ный операнд может находиться либо в регистре, либо в памяти.

В случае результата двойной длины команды

IMUL src и MUL src

используют в качестве второго операнда регистр AL, AX или ЕАХ, в зависимости от размера исходного операнда, располагающегося либо в регистре, либо в памяти. Произведение двойной длины по­мещается в два регистра: старшая половина разрядов результата сохраняется в ре­гистрах DH, DX или EDX, а младшая — в регистрax AL, AX или ЕАХ.

Команда для выполнения целочисленного деления имеет следующий формат:

IDIV src и DIV src

 

Выполняет целочисленное деление со знаком AL, АХ или ЕАХ (в зависимости от размера источника) на источник (регистр или переменная) и помещает результат в AL, АХ или ЕАХ, а остаток — в АН, DX или EDX соответственно. Результат всегда округляется в сторону нуля, знак остатка всегда совпадает со знаком делимого, абсолютное значение остатка всегда меньше абсолютного значения делителя.

В архитектуре IA-16 имеется отличие,

-если размер src – байт, то делимое всегда должно быть AX, после выполнения команды частное находится в AL, а остаток в AH.
-если размер src – слово (2 байта), то делимое всегда должно быть в паре регистров DX:AX (в AX – младшая часть делимого, а в DX – старшая часть) а, после выполнения команды частное находится в AX, а остаток в DX.

Пример: Сложение чисел ТАSM

.model small

Stack 100h

.386

Data

X dd 1

Y dd 3

Z dd ?

Code

start:

Mov ax,DGROUP

Mov ds,ax

;inerst code

Mov eax,x

Add eax,y

Mov z,eax

;code end

Mov ax,4c00h

Int 21h

End start

Задание №3.

1) Теория.

a) Операции ввода-вывода. Ввод-вывод с отображением в память. Изолированный ввод-вывод. Блочная пересылка данных. (30 баллов)

2) Практические задания.

a) Написать программу на языке ассемблер IA-16, в которой определены натуральные числа A1,…An. Написать подпрограмму, вычисляющей среднее арифметическое этих чисел и формирующей массив d1, … dn, отклонений этих чисел от среднего значения. Адреса начала массивов An, dn передаются подпрограмме через регистры ax и bx, а число элементов n передается через регистр cx. (30 баллов)

1) Простейшая схема подключения устройств ввода-вывода к компьютеру заключа­ется в использовании общей шины (рис. 7.1). Все устройства, подключенные к шине, могут обмениваться между собой информацией. Обычно шина состоит из трех наборов линий, предназначенных для передачи адресов, данных и управляю­щих сигналов. Каждому устройству ввода-вывода присваивается уникальный на­бор адресов. Когда процессор помещает на адресные линии конкретный адрес, распознавшее этот адрес устройство отвечает на команду, помещенную на управ­ляющие линии. Процессор запрашивает либо операцию чтения, либо операцию записи, и запрошенные данные пересылаются по линиям данных. Такая организация системы ввода-вывода, при которой устройства ввода-вывода и память разделяют одно адресное пространство, называется вво­дом-выводом с отображением в память.
Команды ввода IN и вывода OUT реализуют пересылку данных из регистра процессора во внешнее устройство или прием данных из внешнего устройства в регистр. В этих командах задается номер интерфейсного устройства (порта ввода-вывода), через которое производится передача данных. Отметим, что многие микропроцессоры не имеют специальных команд для обращения к внешним устройствам. В этом случае ввод и вывод данных в системе выполняется с помощью команды MOV, в которой задается адрес требуемого интерфейсного устройства. Таким образом внешнее устройство адресуется как ячейка памяти, а в адресном пространстве выделяется определенный раздел, в котором располагаются адреса подключенных к системе интерфейсных устройств (портов).
Вообще, существуеттри базовых подхода к операции пересыл­ки входных и выходных данных.

Простейшим из них является программируемый ввод-вывод, который управляется процессором, выполняющим команды програм­мы.

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

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

Задание №4.

1) Теория.

a) Подпрограммы. Вызов подпрограмм, передача параметров, вложенные подпрограммы. (30 баллов).

2) Практические задания.

a) Написать программу на ассемблере IA-16, вычисляющую максимальное значение числа N, при котором N! не переполняет 4 байта. (30 баллов)

 

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

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

После реализации подпрограммы работа вызывающей ее программы должна быть продолжена. В таком случае говорят, что выполняется возврат из подпро­граммы в вызывающую программу. Делается это с помощью команды Return. По­скольку подпрограмма может вызываться из нескольких разных мест основной программы, при ее вызове где-то должен сохраняться адрес возврата. Иными сло­вами, для обеспечения правильного возврата из подпрограммы команда Call должна сохранить содержимое регистра PC.

В программировании очень распространена практика вызова одних подпрограмм из других. Такие подпрограммы, вызываемые друг из друга, называются вложен­ными. Если вложенные вызовы будут реализованы по описанной выше техноло­гии, вторая команда Call сохранит адрес возврата в регистре связи, уничтожив его текущее содержимое, после чего возврат в исходную программу станет не воз­можным. Поэтому перед вызовом очередной подпрограммы нужно где-то сохра­нять содержимое регистра связи.

Необходимый для этого адрес возвра­та — это последний адрес, сохраненный в данной цепочке вызовов подпрограмм. Иными словами, адреса возврата сохраняются и используются в порядке Last In First Out. Очевидно, что адреса возврата, связанные с вызовами подпрограмм, должны помещаться в стек. Для использования в качестве указателя стека (SP) вы­зовов подпрограмм выделяется отдельный регистр, именуемый стеком процессора. Команда Call помещает в стек процессора содержимое регистра PC, а команда Return выталкивает из этого стека адрес возврата и помещает его в PC. Стек — это список элементов данных, обычно слов или байтов, доступ к которым ограничен следующим правилом: элементы этого списка могут добавляться толь­ко в его конец и удаляться только из конца. Операцию помещения но­вого элемента в стек часто называют его проталкиванием (push), а операцию извлечения последнего элемента из стека называют его выталкиванием (pop).Для отслеживания адреса вершины стека используется регистр процессора, называемый указателем стека (Stack Pointer, SP (ESP)).

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

Задание №5.

1) Теория.

a) Организация и работа со стеком процессора, стековый фрейм. (30 баллов)

2) Практические задания.

a) Написать программу на языке ассемблер, которая осуществляет ввод с клавиатуры в память компьютера посимвольно строку символов длины L, упорядочивает введенные символы по порядку возрастания ASCII кодов. (30 баллов)

 

1) Сте́ковый кадр (англ. stack frame) — механизм передачи аргументов и выделения временной памяти (в процедурах языков программирования высокого уровня) с использованием системного стека.
Для использования в качестве указателя стека (SP) вы­зовов подпрограмм выделяется отдельный регистр, именуемый стеком процессора. Команда Call помещает в стек процессора содержимое регистра PC, а команда Return выталкивает из этого стека адрес возврата и помещает его в PC. Стек — это список элементов данных, обычно слов или байтов, доступ к которым ограничен следующим правилом: элементы этого списка могут добавляться толь­ко в его конец и удаляться только из конца. Операцию помещения но­вого элемента в стек часто называют его проталкиванием (push), а операцию извлечения последнего элемента из стека называют его выталкиванием (pop).Для отслеживания адреса вершины стека используется регистр процессора, называемый указателем стека (Stack Pointer, SP (ESP)).

Для работы со стеком предназначены три регистра:

1) ss – сегментный регистр стека;

2) sp/esp – регистр указателя стека;

3) bp/ebp – регистр указателя базы кадра стека.

Размер стека зависит от режима работы микропроцессора и ограничивается 64 Кбайтами (или 4 Гбайтами в защищенном режиме).

В каждый момент времени доступен только один стек, адрес сегмента которого содержится в регистре SS. Этот стек называется текущим. Для того чтобы обратиться к другому стеку («переключить стек»), необходимо загрузить в регистр ss другой адрес. Регистр SS автоматически используется процессором для выполнения всех команд, работающих со стеком.

Перечислим еще некоторые особенности работы со стеком:

1) запись и чтение данных в стеке осуществляется в соответствии с принципом LIFO,

2) по мере записи данных в стек последний растет в сторону младших адресов. Эта особенность заложена в алгоритм команд работы со стеком;

3) при использовании регистров esp/sp и ebp/bp для адресации памяти ассемблер автоматически считает, что содержащиеся в нем значения представляют собой смещения относительно сегментного регистра ss.

Задание №6.

1) Теория.

a) Доступ к устройствам ввода-вывода. Виды прерываний, управление прерываниями. (30 баллов)

2) Практические задания.

a) Написать программу на языке ассемблер IA-16, в которой определены натуральные числа , размерностью двойные слова(4 байта) x и y. Написать подпрограмму, которая находит максимальное из них. Параметры и результат передаются через стек.(30 баллов)

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

Технология ввода-вывода с отображением в память применяется в большинст­ве компьютерных систем. Некоторые процессоры для выполнения операций вво­да-вывода поддерживают специальные команды In и Out. Например, процессоры семейства Intel, имеют специальные команды ввода-вывода и отдельное 16-разрядное адресное пространство для устройств ввода-вывода. Соз­давая компьютерную систему на основе такого процессора, конструктор может либо соединить все устройства ввода-вывода так, чтобы они использовали специ­альное адресное пространство ввода-вывода, либо подключить их как часть ад­ресного пространства памяти. Второй подход позволяет упростить программное обеспечение, поэтому используется он значительно чаще. Существует еще два распространен­ных механизма реализации ввода-вывода: прерывания и

прямой доступ к памяти.

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

Задание №7.

1) Теория.

a) Прерывания, исключения в операционных системах. (30 баллов)

2) Практические задания.

a) Напишите последовательность команд, корректно работающую со стеком без использования команд pop и push с применением базой индексной адресации и выполняющую перечисленные ниже задачи:

Вытолкнуть первые два элемента из стека, сложить их и поместить ре­зультат в стек.

Скопировать пятый элемент от вершины стека в регистр dx.

Удалить из стека 10 элементов. (30 баллов)

1)

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

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

Восстановление после ошибок.

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

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

Отладка

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

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

Исключения защиты

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

Задание №8.

1) Теория.

a) Механизм прерываний процессора Pentium. Пример обработки прерываний процессора Pentium. Прямой доступ к памяти. (30 баллов)

2) Практические задания.

a) Написать программу на ассемблере IA-16, вычисляющую максимальное значение числа N, при котором N! не переполняет двойное слово (4 байта) .(30 баллов)

1)

Примерами процессоров архитектуры IA-32, могут служить процессоры Pentium, в которых используются две линии запроса прерывания, а именно NMI (Non-Maskable Interrupt) — для немаскируемых прерываний и INTR — для маскируе­мых прерываний, также называемых пользовательскими. Запросы прерываний по линии NMI всегда принимаются процессором. Запросы по линии INTR прини­маются только в том случае, если они имеют более высокий уровень приоритета, чем текущая выполняемая программа (об этом речь пойдет чуть позже). Прерыва­ния INTR можно разрешать или запрещать, устанавливая разряд разрешения пре­рываний в регистре состояния процессора. В дополнение к внешним прерываниям существует множество исключений, связанных с событиями, которые происходят во время выполнения программ. К числу таких событий относятся, в частности, неверные коды операций, ошибки деления, переполнения и многие другие.

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

1. Проталкивает в стек процессора, на который указывает регистр ESP, зна­чение регистра текущего сегмента CS (Code Segment) и указателя ко­манды EIP.

2. Если исключение вызвано нестандартной ситуацией при выполнении программы, помещает в стек код, определяющий причину исключения.

3. Если нужно, очищает флаг разрешения прерывания, чтобы дальнейшие прерывания от того же источника были запрещены.

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

5. Обслужив запрос (например, выполнив пересылку входных или выходных данных), программа обработки прерывания возвращает управление прерванной программе, для чего она выполняет команду возврата из прерывания IRET. Эта команда восстанавливает из стека значения регистров EIP и CS и регистра со­стояния процессора, восстанавливая тем самым состояние процессора.



©2015- 2019 stydopedia.ru Все материалы защищены законодательством РФ.