Àññåìáëåð3_á
Download
Report
Transcript Àññåìáëåð3_á
Подсистема прерываний
Схема подсистемы прерываний
1
Процедура прерывания
1) Проверяется установка флажка IF (для немаскируемых
прерываний этот пункт игнорируется):
1- прерывания разрешены, 0 - прерывания запрещены;
2) Если прерывание разрешено, то
PUSHF
PUSH
CS
PUSH
IP
3) mov CS, <Сегмент программы обработки прерывания>
mov IP, <Смещение программы обработки прерывания>
4) После чего начинается выполнение программы обработки
прерывания.
5) По завершению программы обработки:
POP
IP
POP
CS
POPF
2
Структура обработчика прерывания
<Имя>
proc
far
<Сохранение содержимого регистров>
<Обработка>
<Восстановление содержимого регистров>
iret
; возврат управления
<Имя>
endp
3
Классификация прерываний
I. Прерывания микропроцессора(0Н-6Н):
0 - прерывание от схем контроля микропроцессора “Деление на 0”;
1 - прерывание специального режима работы
микропроцессора, устанавливаемого, если флажок
TF=1 - “Пошаговое выполнение”;
2 - немаскируемое прерывание;
3 - прерывание микропроцессора, осуществляемого при
обнаружении адреса останова - “Точка останова”;
4 - инициируется по команде INTO, используемой после
выполнения арифметической операции “Переполнение”;
5 - печать содержимого экрана - инициируется
нажатием клавиши Print Screen.
4
Классификация прерываний (2)
II. Прерывания микроконтроллера прерываний (8H0FH, 70Н-77Н):
8 – прерывание от таймера;
9 – прерывание от клавиатуры;
0BH – последовательный порт COM2;
0CH – последовательный порт COM1;
0DH – параллельный порт LPT2;
0EH – прерывание от НГМД (дискеты);
0FH – параллельный порт LPT1;
70H – прерывание от часов реального времени;
74H – мышь;
75H – числовой сопроцессор;
76H – контроллер винчестера (1 канал);
77H – контроллер винчестера (2 канал).
5
Классификация прерываний (3)
III. Процедуры BIOS (10Н-1AH, 33H):
10Н – управление дисплеем;
11Н – определение конфигурации ПЭВМ;
12Н – определение объема памяти ПЭВМ;
13Н – управление дисковой памятью;
14Н – управление асинхронной связью;
16Н – управление клавиатурой;
17Н – управление печатающим устройством;
1AH – управление часами реального времени;
33H – управление мышью.
6
Классификация прерываний (4)
IV. Процедуры пользователя (1BH и 1CH):
1BH – возможность подключения при
обнаружении Ctrl-Break;
1СН – возможность подключения к обработке
кванта таймера.
V. Указатели системных таблиц (1DH-1FH,
41H):
1DH - таблица параметров видео;
1EH - таблица параметров дискеты;
1FH - таблица символов для графического
режима;
41H - таблица параметров жесткого диска.
7
Классификация прерываний (5)
VI. Прерывания DOS (20H- 3FH):
20H - нормальное завершение программы и возврат
управления DOS;
21H - вызов диспетчера функций DOS;
22H - адрес пользовательской программы обработки
нормального завершения программы;
23H - адрес пользовательской программы обработки
завершения по Ctrl-Break;
24H - адрес пользовательской программы обработки
завершения по ошибке;
25H - абсолютное чтение секторов с диска;
26H - абсолютная запись секторов на диск;
27H - завершение программы с сохранением в памяти.
VII. Прерывания, зарезервированные для
пользователей (60H-66H, 0F0H-0FEH).
8
Микроконтроллер прерываний
IRQ8
IRQ9
IRQ10
IRQ11
IRQ12
IRQ13
IRQ14
IRQ15
IRQ0
IRQ1
int
номер
Контроллер
прерываний
Базовый вектор 70h
Порты А0h, A1h
IRQ3
IRQ4
IRQ5
IRQ6
IRQ7
МП
Контроллер
прерываний
Базовый вектор 8h
Порты 20h, 21h
9
Стандартное подключение устройств
IRQ
Вектор
регистра маски
IRQ0
08h
IRQ1
09h
IRQ2
0Ah
IRQ8
70h
…
IRQ12
74h
IRQ13
75h
IRQ14
76h
IRQ15
77h
IRQ3
0Вh
IRQ4
0Сh
IRQ5
0Dh
IRQ6
0Eh
IRQ7
0Fh
Устройство
Таймер
Клавиатура
Вход от схемы 2
CMOS и часы
Бит
0
1
2
Мышь
Числовой сопроцессор
Контроллер винчестера (1 канал)
Контроллер винчестера (2 канал)
Последовательный порт COM2 3
Последовательный порт COM1 4
Параллельный порт LPT2
5
Контроллер гибких дисков
6
Параллельный порт LPT1
7
0
4
5
6
7
10
Сервисные функции MS DOS int 21h
1. Функции ввода с клавиатуры
AH = 1
Ожидание ввода с
Вх. клавиатуры с «эхо» и
Вых.: AL = символ
проверкой на CTRL-Break
AH = 0AH Чтение строки в буфер
Примеры:
1) Ввод символа:
mov AH,1
int
21h
Вх.: DS:DX – адрес буфера,
первый байт – длина буфера
Вых.: второй байт – реальная
длина строки
2) Ввод строки
String DB 50,49 dup (?)
…
lea DX, String
mov AH,0AH
int 21H
50
размер буфера
50 3 ‘A’ ‘B’ ‘C’ 13 10
реальная длина
13
строки
Сервисные функции MS DOS int 21h (2)
2. Функции вывода
AH = 2
Вывод символа с
проверкой на CTRLBreak
Вх.: DL = символ
Вых.: -
AH = 9H
Вывод строки
Вх.: DS:DX – адрес строки,
завершающийся знаком $
Примеры:
1) Вывод символа:
mov DL,<символ>
mov AH,2
int
21h
2) Вывод строки:
MSG
DB ‘ Пример’, 13, 10, ‘$’
…
lea
DX, MSG
mov AH,9
int
21H
14
Программа извлечения корня квадратного
1 = 12
1+3 = 4 = 22
1+3+5 = 9 = 32
title primer
Code
segment
assume
CS:Code,DS:Code
;Данные
otw
db
13,10,' n= '
rez
db
'
',13,10,'$'
string
db
10,10 dup (0)
zap
db
'Введите число <65024:',13,10,'$‘
begin
proc
far
push
DS
mov
AX,0
push
AX
mov
AX,Code
15
mov
DS,AX
Программа извлечения корня квадратного (2)
;Ввод
vvod:
lea
mov
int
lea
mov
int
DX,zap
AH,9h
21h
DX,string
AH,0ah
21h
String
10
16
Программа извлечения корня квадратного (3)
cycle:
loop
mov
mov
mov
mov
lea
cld
xor
mov
mul
mov
lodsb
cmp
jb
cmp
ja
sub
cbw
add
cycle
CL,string+1
CH,0
BH,'9'
BL,'0'
SI,string+2
AX,AX
DI,10
DI
DI,AX
;Преобразование
SI
String
‘2 1 3 6 4’
10 N 32 31 33 36 34
N
AL,BL
vvod
AL,BH
vvod
AL,30h
AX,DI
17
Программа извлечения корня квадратного (4)
;Вычисление sqrt(dx#ax)
cycl:
mov
BX,1
mov
CX,0
mov
DI,1 ; сумма
cmp
DI,AX
ja
preobr
add
BX,2
add
DI,BX
jc
vvod
inc
CX
jmp
cycl
ND:=1
N:=0
S:=1
cycl
S>C
да
нет
ND:=ND+2
S:=S+ND
N:=N+1
18
Программа извлечения корня квадратного (5)
;Преобразование
preobr:
mov
mov
mov
mov
again:
cwd
div
add
mov
dec
loop
;Вывод
lea
mov
int
ret
begin
endp
code
ends
end
AX,CX
CX,3
DI,2
BX,10
BX
DL,30h
rez[DI],DL
DI
again
DX,otw
AH,9
21h
begin
19
Структура загрузочного модуля (.exe)
com
Структура заголовка .exe:
0 2 ‘MZ’ - маркер модуля .exe
2 2 длина неполной последней страницы
4 2 количество страниц образа программы
6 2 число элементов в таблице перемещений
8 2 длина заголовка в параграфах
А 2 мин. память за концом программы
С 2 мах. память за концом программы
Е 2 сегментное смещение сегмента стека SS
10 2 значение регистра SP при запуске
12 2 контрольная сумма файла
14 2 значение регистра IP при запуске
16 2 сегментное смещение сегмента кодов CS
18 2 смещение в файле таблицы перемещений
1А 2 номер оверлея
1С 4*[EXE+6] таблица перемещений
Образ
программы
Структура абсолютного модуля
exe
Заголовок
Образ
программы
21
Загрузка программ
Модуль .com
Модуль .exe
DS=ES
PSP
CS
IP
Сегмент
кода
256 байт
DS=ES=
=CS=SS
IP=100h
PSP
256 байт
Сегмент
кода
Сегмент
данных
SS
SP
push
mov
push
mov
mov
…
ret
Сегмент
стека
DS
AX,0
AX
AX, Data
DS, AX
SP = 64 Кб
Cтек
Begin:
org 100H
…
int 20h
22
Префикс программного сегмента (PSP)
0 2
int 20h (CD 20);
2 2
сегментный адрес первого свободного байта;
…
6 2
размер первого сегмента для com файлов;
…
0Ah 4 адрес int 22h;
0Eh 4 адрес int 23h;
12h 4 адрес int 24h;
16h 2 сегментный адрес PSP родителя;
18h 20 JFT
2Сh 2 сегментный адрес блока окружения;
2Eh 4 SS:SP при входе в последний вызов int 21h;
32h 2 число элементов в JFT;
34h 4 адрес JFT;
…
80h 1 длина строки аргументов в командной строке;
81h 127 строка аргументов командной строки.
23
Завершение программ
1. int 20h
– СS должен указывать на PSP
2. mov AH,4Ch – при любых значениях регистров
int 21h
3. int
27h
– с сохранением программы в памяти, СS должен
указывать на PSP
4. mov AH,31h
int 21h
– с сохранением программы в памяти, при любых
значениях регистров
24
Директива описания сегмента
<Имя сегмента> SEGMENT <выравнивание> <тип> <класс>
…
<Имя сегмента> ENDS
где <выравнивание>: BYTE, WORD, PARA, PAGE
<тип>: PUBLIC, STACK, COMMON, AT <адрес>
<класс>: ‘STACK’, ‘CODE’, ‘DATA’
1. Задание и модификация
адресов сегментов:
ASSUME CS:CODE, DS:DATA
…
mov AX,DATA
mov DS,AX
…
ASSUME DS:DATA1
mov AX,DATA1
mov DS,AX
…
2. Явное указание
сегментного регистра:
CS:A
ES:[80h]
25
Пример создания многосегментного
загрузочного модуля
<имя сегмента> SEGMENT
ASSUME …
EXTRN <имя внешнего объекта >:<тип>
PUBLIC <имя внутреннего объекта>
<имя процедуры> PROC FAR
PUSH DS
MOV AX, 0
PUSH AX
MOV AX, <имя сегмента>
MOV DS, AX
<имя сегмента> SEGMENT STACK
<тело процедуры>
DB 3000 DUB (?)
RET
<имя сегмента> ENDS
<имя процедуры > ENDP
<имя процедуры> PROC NEAR
<имя сегмента> SEGMENT
<тело процедуры>
<данные>
<имя процедуры> ENDP
<имя сегмента> ENDS
<имя сегмента>
ENDS
END
<имя точки входа >
26
Пример создания многосегментного
абсолютного модуля
Code
segment
assume CS:Code, DS:Data
org
100H
Begin: push
CS
pop
BX
mov
AX,offset e+15
mov
CL,4
shr
AX,CL
add
AX,BX
mov
DS,AX
…
mov
AH,4Ch
int
21h
e
EQU
$
Code
ends
Data
segment para
…
Data
ends
end
begin
Модуль .com
DS=ES=
=CS=SS
PSP
IP=100h
256 байт
Сегмент
кода
е
Сегмент
данных
27
Инсталлятор .exe
Code
segment
assume CS:Code,Ds:Code
user
proc
far
<обработка>
iret
DS=ES
finish equ
$
user
endp
set_up proc
far
CS
push
DS
IP
mov
AX,0
push
AX
finish
mov
DX,offset user
mov
AX,seg user
mov
DS,AX
mov
AL,<номер int>
mov
AH,25H
int
21H
mov
DX,finish+100H
mov
byte ptr ES:1,27H
ret
set_up endp
Code
ends
end
set_up
Модуль .exe
CD 20
PSP
Обработчик
Сегмент кода
Инсталлятор
28
Инсталлятор .com
Code
segment
assume CS:Code,Ds:Code
org
100H
Модуль .com
begin: jmp
short set_up
user
proc
far
DS=ES=
PSP
<обработка >
=CS=SS
iret
IP=100h
finish equ
$
Обработчик
user
endp
set_up:
Сегмент кода
finish
mov
DX,offset user
mov
AL,<номер int>
Инсталлятор
mov
AH,25H
int
21H
lea
DX,finish
int
27H
Code
ends
end
set_up
29
Резидентный обработчик int 1Ch(Ex3_1)
code segment
; Резидент int 1CH
CS,DS,ES,SS
CS
PSP
org
100h
assume cs:code,ds:code
begin: jmp
start
tik
db
?
nch
db
0
В момент вызова
process:
регистр DS не загружен
inc
byte ptr cs:tik
mp
byte ptr cs:tik,10
jl
a1
push
es
Программа
push
ax
Int 8h
Int 1ch
33
Резидентный обработчик int 1Ch (2)
a1:
mov
mov
mov
inc
mov
mov
mov
mov
pop
pop
push
pop
iret
ax,0b800h
es,ax
byte ptr cs:tik,0
byte ptr cs:nch
al,cs:nch
es:[0],al
al,00011110B
es:[1],al
ax
es
ES
ax
ax
Код
символа
Видеопамять
Байтатрибут
34
Инсталлятор
start:
code
mov
lea
int
mov
lea
int
ends
end
ax,251ch
dx,process
21h
byte ptr tik,al
dx,start
27h
begin
Модуль .com
DS=ES=
=CS=SS
PSP
IP=100h
Обработчик
start
Сегмент кода
Инсталлятор
35