Восстановление после ошибок.
Задание №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 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|