Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архитектура ЭВМ и систем. Лабораторная работа. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
щенными, необходимо в качестве извещения послать контроллеру команду EOI (End Of Interrupt), записав в порт с номером 20H зна­чение 20H.
Немаскируемые прерывания не используют микросхемы i8259A. Процессор i486 сам производит маскирование, запрещая их повторное возникновение до окончания обработки текущего, о чем ему сигнализирует команда iret. Однако он запоминает еще один запрос по NMI и после выполнения
iret вызывает обработчик опять. Чтобы разрешить возникновение немаскируемого прерывания до завершения текущей обработки, нужно как можно раньше вы­полнить команду iret. Это можно сделать при помощи следующей последовательности команд:
;вход в обработчик pushf push cs push offset l1 iret
l1:
;обработка прерывания
…………………
При обработке программных прерываний нет необходимости
заботиться о контроллере i8259A, флажок IF не изменяется.
Обработчик прерывания должен сохранять неизмененными все используемые им регистры, чтобы не помешать прерванной про­грамме. Типичная структура процедуры обработки аппаратного пре­рывания выглядит следующим образом:
int_handler proc far
sti ;разрешим прерывания
push ax ;сохраним используемые
push bx
push cx
push dx
push si
push di
push ds
push es
61
mov ax,dsg ;сделaем данные
mov ds,ax ;обработчика
;адресуемыми
………………………
pop es ;восстановим
сохраненные
pop ds ;регистры
pop di
pop si
pop dx
pop cx
pop bx
pop ax
iret ;возобновим прерванную
;программу int_handler endp
Исключительные ситуации
Прерывания в процессоре i486 идентифицируются по номеру (0–255). Номера 0–31 зарезервированы для исключительных ситуа-
ций. Под аппаратные прерывания отведен диапазон от 32 до 266. Он также используется для назначения системных и пользовательских программных прерываний. Тем
не менее, в архитектуре IBM PC
AT/486 аппаратные прерывания занимают часть из первых 32 номе-
ров. В таблице ниже приведен список исключительных ситуаций, обрабатываемых процессором i486.
Таблица № 1
Исключительные ситуации процессора i486 и попавшие
в зарезервированную область аппаратные прерывания
Наименование ИС Тип ИС
0 Ошибка деления (DIV, IDIV) Ошибка 1 Отладка Ошибка/
ловушка 2 Немаскируемое прерывание Ловушка 3 Контрольная точка (INT 3) Ловушка
62
4 Переполнение (INTO) Ловушка 5 Превышение границ массива (BOUND) Ошибка 6 Запрещенный код операции Ошибка 7 Устройство недоступно Ошибка 8 Двойная ошибка
Ошибка
IRQ0 (Счетчик таймера)
9 Не используется в i486
IRQ1 (Клавиатура) 10 Недействительный TSS Ошибка 11 Неприсутствие сегмента
Ошибка
IRQ3 (Последовательный порт 2) 12 Ошибка сегмента стека
Ошибка
IRQ4 (Последовательный порт 1) 13 Нарушение общей защиты
IRQ5 (Параллельный порт 2) 14 Страничное нарушение
Ошибка/ ловушка Ошибка
IRQ6 (НГМД) 15 Зарезервировано
IRQ7 (Параллельный порт 1) 16 Ошибка с плавающей точкой Ошибка 17 Контроль выравнивания Ошибка
18–31 Зарезервированы
Пример обработчика прерывания
Ниже приводится пример программы, создающей обработчик прерывания с номером 100. Он переводит двоичное число в шестнад­цатеричный формат. При его вызове ds:si должны указывать на исходное значение в виде двойного слова, ds:di – на буфер, в ко­торый помещается результат.
.486 ;сегмент данных основной программы dseg segment para use16 number dd 122343456 prompt db 'шестнадцатеричное значение:' hex db '00000000H, 0DH,0AH,'$' old_ih dd 0 ;старый обработчик прерывания
63
dseg ends
;сегмент кода основной программы cseg segment para use16 assume cs:cseg,ds:dseg,es:dseg start:
push dseg ;сделаем данные адресуемыми
pop ds push 0 ;таблица векторов прерываний pop es ;сохраним указатель на старый обработчик mov eax,es:[100*4] mov [old_ih],eax ;установим свой обработчик перывания 100 mov word ptr es:[100*4],offset ih mov word ptr es:[100*4+2],ihcseg
;ds:di -- указатель на число ;ds:si -- указатель на буфер, в который
будет помещен ;перевод в символьный формат lea di,number lea si,hex int 100 ;вызовем переводчик mov ah,9 ;выведем строку lea dx,prompt int 21H
;восстановим
старый обработчик mov eax,[old_ih] mov es:[100*4],eax ;конец программы mov ax,4C00H int 21H
cseg ends ;сегмент данных обработчика прерывания ihdseg segment para use16 ;шестнадцатеричные цифры syms db "0123456789ABCDEF" ihdseg ends
64
;сегмент кода обработчика прерывания
ihcseg segment para use16
assume cs:ihcseg, es:ihdseg
ih proc far
push eax push bx push cx push edx push si push di push es
push ihdseg ;сделаем адресуемыми
данные pop es ;процедуры обработки lea bx,syms mov edx,[di] ;переводимое число mov cx,8 ;количество шестнадцате-
ричных чисел
l1:
shld eax,edx,4 shl edx,4 and al,0FH xlatb es:[bx] mov [si],al inc si loop l1 pop es pop di pop si pop edx pop cx pop bx pop eax iret
ih endp ihcseg ends ;сегмент стека sseg segment para stack use16
65
dw 1024 dup(?) sseg ends end start
Задания для выполнения
Задание № 1. Написать программу, решающую поставленную
задачу. Алгоритм решения должен быть реализован в виде дальней процедуры в отдельном сегменте кода. Программа должна иметь два сегмента данных. Первый предназначен для размещения исходных данных, например строки, вводимой пользователем с клавиатуры. Результат помещается в буфер во втором сегменте перед его выво­дом на
экран.
Задание № 2. Изменить созданную при выполнении первого за-
дания программу таким образом, чтобы она содержала два обработ­чика прерываний (для них можно выбрать любые свободные в сис­теме векторы). На первый возлагается решение поставленной зада­чи. Второй выводит результат на экран, обращаясь напрямую к ви­деопамяти. Подпрограммы обработки прерываний должны
распола­гаться в собственных сегментах кода и иметь отдельные сегменты данных. В них размещаются используемые ими при работе проме­жуточные данные и используемые служебные подпрограммы.
Примечания
I. В качестве ограничения на значения вводимых пользовате-
лем чисел принять границы диапазона знаковых величин размером в слово или двойное слово.
II. Как результат выполнения всех вариантов заданий должна
быть сформирована текстовая строка, которая затем выводится на экран отдельной подпрограммой.
Варианты заданий
1. Вводится строка, содержащая слова, разделенные пробела
ми. Сформировать новую строку, содержащую слова, отсортирован­ные в порядке возрастания их длины.
-
66
2. Пользователь вводит строку, содержащую числа, разделен-
ные пробелами. Подсчитать, сколько разных чисел она содержит. Например, в последовательности "10, 11, 10" их будет два: 10 и 11.
3. Пользователь вводит дату в формате дд.мм.гггг. Найти но-
мер этого дня с начала года. Високосные годы – это те, номер кото­рых делится без остатка на 4.
4.
Пользователь вводит две строки, содержащие числа a1, a2, …,
a
и b1, b2, …, bn. Сформировать новую строку из этих чисел в воз-
m
растающем порядке: c
, c2, …, c
1
(c1 c2 c
n+m
n+m
).
5. Пользователь вводит строку, состоящую из чисел, разделен-
ных пробелами. Найти в ней число, повторяющееся наибольшее число раз. Если таких чисел несколько, то выбрать одно из них.
6. Пользователь вводит строку, содержащую n чисел. Найти
самый длинный пилообразный отрезок x
x
> x
s+t-1
и определить его длину.
s+t
s+1
< x
s+2
>x
<… > x
s+3
s+t-2
<
7. Пользователь вводит строку чисел в десятичном формате.
Сформировать новую строку, содержащую те же числа в двоичной системе счисления.
8. Создать переводчик, знающий не менее десяти английских
слов. Вводимые пользователем фразы он, насколько хватает знаний, переводит на русский язык.
9. Вычислить значение введенного пользователем выражения.
Для
его записи используется польская, или бесскобочная, форма. Например, "30 40 + 60 – 20 *" означает "(30 + 40 – 60) * 20". При его разборе применяется следующее правило: каждое встретившееся число заносится в стек. Если встречается знак операции, два послед­них числа извлекаются, над ними производится указанная операция и в стек помещается ее результат. В конце в стеке должно остаться одно значение, которое и
является результатом выражения.
10. Подсчитать количество слов, знаков препинания, гласных и
согласных букв в строке, введенной пользователем.
11. Из введенной пользователем строки сформировать новую,
поменяв порядок букв во всех словах на обратный.
12. Пользователь вводит строку с клавиатуры. Определить, на-
звания каких регистров процессора i486 присутствуют в ней.
13. Пользователь вводит
строку чисел в десятичном формате. Преобразовать числа в двоичный формат, поменять порядок бит в каждом на обратный и сформировать из них новую строку, предста­вив их снова в десятичной системе счисления.
67
14. Пользователь вводит строку, состоящую из чисел в деся-
тичном формате. Сформировать новую строку, преобразовав их в шестнадцатеричный формат.
15. Пользователь вводит строку, состоящую из чисел в восьме-
ричном формате. Сформировать новую строку, переведя числа в де­сятичный формат.
16. Пользователь вводит строку, содержащую n чисел. Считая,
что первое имеет индекс 0, второе жащую такую перестановку индексов i
a
.
in
– 1 и т.д., создать строку, содер-
, i2, …, in, что ai1 ai2
1
17. Пара носков стоит 1 руб., связка из 10 пар – 8 руб., коробка,
содержащая 10 связок, – 60 руб. Составить программу, которая по введенному пользователем числу пар носков вычисляет количество коробок, связок и пар, которые надо купить (вместо 11 пар дешевле купить одну связку и 1 пару).
18. Пользователь вводит строку. Сформировать новую, содер-
жащую шестнадцатеричные коды символов
первой в текстовом
представлении, разделенные пробелами.
19. Пользователь вводит строку, состоящую из чисел в шест-
надцатеричном формате. Перевести числа в десятичный формат.
20. Пользователь вводит строку, состоящую из чисел в двоич-
ном формате. Сформировать из нее другую, переведя числа в деся­тичный формат.
Контрольные вопросы
1. Что называется прерыванием?
2.
Какие виды прерываний предусмотрены в архитектуре процес-
сора i486?
3. Какие существуют виды исключительных ситуаций? В чем со-
стоит различие в действиях процессора при их возникновении?
4. Какие виды аппаратных прерываний предусмотрены в архитек-
туре процессора i486? В чем состоят и чем отличаются действия процессора при их возникновении?
5. В чем состоит
различие в действиях обработчиков различных
видов аппаратных прерываний?
6. Чем отличаются действия обработчика аппаратного прерывания
от обработчика программного?
7. Каково назначение аппаратных прерываний?
68
8. Какие действия выполняет процессор при генерации программ-
ных прерываний?
9. Для чего предназначена таблица векторов прерываний? Какова
ее структура?
10. Как распределен диапазон векторов прерываний?
11. Для чего предназначена директива assume? Приведите приме-
ры ее использования.
12. Для чего предназначена директива segment? Приведите при-
меры ее использования.
13. Какова структура
видеопамяти в текстовом режиме. Приведите
фрагмент программы доступа к ней.
14. Какие сегментные регистры существуют в процессоре i486? Ка-
кова их специализация?
15. Зачем нужны префиксы замены сегментного регистра? Приведи-
те примеры использования.
16. Какие существуют ловушки в процессоре i486?
17. Какие существуют ошибки в процессоре i486?
18. Что служит источником возникновения немаскируемых
преры-
ваний?
19. Что служит источником возникновения маскируемых прерыва-
ний?
20. Что определяет, разрешены ли аппаратные прерывания? Какие
команды используются для их разрешения/запрещения?
ЛАБОРАТОРНАЯ РАБОТА № 7
РАЗМЕЩЕНИЕ В ПАМЯТИ СЕГМЕНТОВ
ДАННЫХ И ПРОГРАММ
Цель: изучить различные виды структуры программ, процесс
загрузки исполняемого модуля в память, принципы разделения кода и данных.
Назначение: данная лабораторная работа на практике познако­мит учащихся с особенностями, присущими различным видам моде­лей памяти, позволит понаблюдать за методами настройки програм­мы на конкретные адреса при загрузке, даст понятие о типе испол­няемого модуля.
69
Типы исполняемых модулей
Программы, выполняемые под управлением MS-DOS, могут принадлежать к одному из двух типов, которым соответствуют рас­ширения .COM и .EXE. Основное различие этих программ заключа­ется в том, что программы типа .COM состоят из одного сегмента, в котором размещаются и код, и данные, и стек. В программах типа .EXE для собственно кода, данных и стека предусматриваются личные сегменты. Таким образом, размер программы .COM не мо­жет превысить 64 Кб, а размер программы .EXE практически не ог­раничен, так как в нее может входить любое количество сегментов кода и данных.
Структура типичной программы .EXE на языке Ассемблера вы­глядит следующим образом:
;сегмент кода CSEG SEGMENT ASSUME ds:DSEG, cs:CSEG, ss:SSEG beg:
mov ax, DSEG ; сделать данные адресуемыми mov ds,ax ; относительно ds
………………
CSEG ENDS ; сегмент данных DSEG SEGMENT
………………
DSEG ENDS ; сегмент стека SSEG SEGMENT STACK dw 1024 dup(?) SSEG ENDS END beg
При загрузке в память сегменты размещаются, как показано на рисунке ниже.
раз-
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]