2. Задание для домашней подготовки.
Повторить команды организации прерываний микропроцессора і8086;
Повторить понятие стека и организация стека для микропроцессора і8086.
Повторить понятие прерывания и организацию системы прерываний в микропроцессоре і8086;
Повторить адресацию операндов в памяти для микропроцессора і8086.
3. Порядок выполнения работы.
Ознакомиться с заданием и проанализировать его.
Составить программу согласно заданию в кодах.
Набрать текст составленной программы в текстовом редакторе отладчика.
Выполнить трансляцию программы (в случае возникновения ошибок исправить их).
Сделать пошаговое выполнение программы и убедиться в правильности ее работы (в случае неправильности внести исправления в алгоритм и текст программы и повторить п.4-5).
Выполнить исследование системы прерываний в микропроцессоре і8086.
Задание по лабораторной работе.
Составить программу, которая вычисляет значение арифметического выражения и обрабатывает заданный массив по указанному правилу (арифметическое выражение взять из Л.р. “Арифметические операции микропроцессора і8086”, обработку массива из Л.р. “ Управляющие логические структуры высокого уровня в микропроцессоре і8086”). Выполнение задачи оформить в виде двух обработчиков прерываний. Для этого задействовать два вектора прерываний 30+№варианта и 31+№варианта. Передачу и возврат параметров осуществить любым удобным способом.
Для простоты задачи не сохранять и не восстанавливать состояние регистров в обработчиках прерываний.
5. Содержание отчета
Задание по лабораторной работе и исходные данные;
Текст программы с комментариями;
Краткий обзор команд для работы с системой прерываний микропроцессора і8086;
Таблица исследования системы прерываний микропроцессора і8086;
Объяснить понятие прерывания;
Организация системы прерываний в микропроцессоре і8086;
Объяснить действия выполняемые микропроцессором при вызове прерывания и возврате из него.
6. Пример выполнения задания.
Рассмотри вариант 30.
Составить
программу, которая вычисляет значение
арифметического выражения
и обрабатывает заданный массив по
указанному правилу: подсчитать количество
элементов, значение которых четное
число.
Исходный массив:
I |
V |
a |
n |
o |
v |
|
S |
e |
r |
g |
e |
y |
|
I |
g |
o |
r |
e |
v |
i |
c |
h |
73 |
118 |
97 |
110 |
111 |
118 |
32 |
83 |
101 |
114 |
103 |
101 |
121 |
32 |
73 |
103 |
111 |
114 |
101 |
118 |
105 |
99 |
104 |
Будем использовать вектора 30+30=60 и 31+30=61.
Текст программы с комментариями:
.data
mas db 'Ivanov Sergey Igorevich'
x db ?
y db ?
.code
jmp start
; вычисление арифметического выражения
interup1:
mov ax,75
sub ax,35
mov cl,10
div cl
add al,bl
mov x,al
iret
;/////////////////////////////////////////////////////////////
; обработка массива
interup2:
mov si,0
mov dl,0
mov cx,23
cycle:
test mas[si],00000001b
jnz next
inc dl
next:
inc si
loop cycle
mov y,dl
iret
;/////////////////////////////////////////////////
; инициализация векторов прерываний
initialize proc
mov ax,0
mov es,ax ; настраиваем es на начало памяти
mov bx,60 ; задаем номер вектора
shl bx,1
shl bx,1 ; формируем адрес начала вектора
mov word ptr es:[bx],interup1 ; записываем IP вектора прерывания
mov es:[bx+2],cs ; записываем CS вектора прерываний
; повторяем то же для второго вектора
mov bx,61
shl bx,1
shl bx,1
mov word ptr es:[bx],interup2
mov es:[bx+2],cs
ret
initialize endp
; основная программа
start:
call initialize ; вызываем подпрограмму инициализации векторов прерываний
int 60 ; вызываем обработчик прерывания - вычисление выражения
int 61 ; вызываем обработчик прерывания - обработка массива
nop
end
Исследование механизма прерываний (для этого потребуются некоторые адреса команд)
.data
mas db 'Ivanov Sergey Igorevich'
x db ?
y db ?
.code
jmp start
interup1:
CS:001D mov ax,75
sub ax,35
mov cl,10
div cl
add al,bl
mov x,al
CS:002C iret
;/////////////////////////////////////////////////////////////
interup2:
CS:002D mov si,0
mov dl,0
mov cx,23
cycle:
test mas[si],00000001b
jnz next
inc dl
next:
inc si
loop cycle
mov y,dl
CS:0044 iret
;/////////////////////////////////////////////////
initialize proc
mov ax,0
mov es,ax
mov bx,60
shl bx,1
shl bx,1
mov word ptr es:[bx],interup1
mov es:[bx+2],cs
mov bx,61
shl bx,1
shl bx,1
mov word ptr es:[bx],interup2
mov es:[bx+2],cs
ret
initialize endp
start:
call initialize
CS:006E int 60
CS:0070 int 61
CS:0072 nop
end
Таблица 1. – Таблица векторов
Вектор |
Адрес |
CS |
IP |
60 |
0000:00F0 |
0100 |
001D |
61 |
0000:00F4 |
0100 |
002D |
Таблица 2. – Таблица состояний
Состояние |
CS |
IP |
SP |
до int 60 |
0100 |
006E |
0000 |
после int 60 |
0100 |
001D |
FFFA |
до iret |
0100 |
002C |
FFFA |
после iret |
0100 |
0070 |
0000 |
до int 61 |
0100 |
0070 |
0000 |
после int 61 |
0100 |
002D |
FFFA |
до iret |
0100 |
0044 |
FFFA |
после iret |
0100 |
0072 |
0000 |
