АВМиС - бывшее АПЭВМ / Shpora / Шпора
.docPSP
-
смещение
длина
содержимое
0
2
в
3. my_9h proc in al,60h cmp al,01h je fin iret fin: push ds es dx mov ax,2509h lea dx, old_09h int 21h mov ax,252fh lea dx,old_2fh
int 21h mov es,cs:2Ch mov ah,49h int 21h
push cs pop es mov ah,49h int 21h pop dx es ds iret my_9h endp RES=$ init proc push cs
pop ds int 2fh cmp al,0ffh je exit mov ax, 352fh int 21h mov word ptr CS:old_2fh,bx
mov word ptr CS:old_2fh+2,es mov ax,seg my_2fh mov ds,ax mov ax,252fh lea dx, my_2fh int 21h {09h} mov ax,3100h mov dx,(res-main+10fh)/16 int 21h exit: mov ax, 4c00h int 21h init endp
ызов INT 20h (CDh, 20h)2
2
сегмент верхней границы памяти
6
4
far call к диспетчеру функций DOS
0Ah
4
адрес обработчика завершения программ (INT 22h)
0Eh
4
адрес обработчика нажатия Ctrl+Break (INT 23h)
12h
4
адрес обработчика критических ошибок (INT 24h)
16h
2
сегмент PSP программы-предка
18h
20
таблица открытых файлов программы
2Ch
2
сегмент среды программы
32h
1
max число открытых файлов (FILES)
34h
4
far-указатель на таблицу открытых
файлов программы
5Ch
16
неоткрытый FCB номер 1 (для 1-го параметра)
6Ch
16
неоткрытый FCB номер 2 (для 2-го параметра)
80h
1
количество символов в командной строке
81h
127
символы из командной строки DOS + CR
Итак, векторная
таблица связи MS/DOS:
(-2) 2 mcb_seg сегмент
первого управляющего блока памяти
(MCB)
(0) 4 dev_cb указатель
на первый блок управления устройствами
DOS (DOS Device Control Block)
(+4) 4 file_tab
указатель на таблицу файлов DOS
(+8) 4 clock_dr указатель
на драйвер CLOCK$, установленный или
резидентный
(+12) 4 con_dr указатель
на актуальный драйвер CON, установленный
или резидентный
--------------- DOS
3.x, 4.x----------------
(+16) 2 max_btbl
максимальное число байт в блоке блочного
устройства
(+18) 4 disk_buf
указатель на первый дисковый буфер
(+22) 4 drv_info
указатель на массив информации об
устройствах
(+26) 4 fcb_tabl
указатель на таблицу FCB
(+30) 2 fcb_size размер
таблицы FCB
(+32) 1 num_bdev число
блочных устройств
(+33) 1 lastdriv значение
LASTDRIVE в файле CONFIG.SYS (по умолчанию равно
5)
(+34) null_dr начало
драйвера NUL - первого драйвера в списке
драйверов DOS
8. new_09
proc push ax dx in al,60h cmp al, 85h jne exit mov ah,9h lea dx,ms
int 21h mov ind,1 exit: pop dx ax jmp dword ptr old_9h ret
new_09 endp
9. txt
segment'code' assume ss:txt,ds:dta,es:dta ,ss:stk begin: mov ax,dta
mov ds,ax mov ax, zseg mov dx,es sub ax,dx mov bx,ax mov ah, 4ah int
21h push ds pop es mov ah,4bh mov al,0 lea bx,param lea dx,child int
21h mov ah, 4ch int 21h txt ends dta segment 'data' param dw envseg
dd 0 dd fcb1 dd fcb2 fcb1 db 0fcb2 db 0 child1 db 'mf.exe',0 dta
ends stk segment 'stack' dw 256 dup(?) stk ends envseg segment
name_file
db 'tx.txt$',0 envseg ends zseg segment 'zseg' zseg ends end begin
dta segment 'data' name db 30 dup (?) dta ends
stk segment
'stack' dw 100 dup(?) stk ends
txt segment
'code' assume cs:txt,ds:dta,es:dta ,ss:stk my_proc proc mov ax, dta
mov ds,ax
mov
ax,es:2ch mov es,ax mov bx,0 xor si,si
xor di,di
cld replay: mov al,byte ptr es:[si+bx]
cmp al,0 je
exit mov name[di],al inc bx inc di
jmp replay
exit: mov ah,4ch int 21h txt ends
11. ПЗУ BIOS содержит
по адресу FFFF:FFFE байт, значение которого
можно использо-вать для идентификации
типа компьютера:
FF
оригинальный IBM
PC;
FE
XT,
Por-table
PC;
FD
PCjr;
FC
AT;
FB
XT
с памятью 640 К на материнской плате;
FA PS/2 модель 25 или
30; F9
Conve-rtible
PC;
F8
PS/2
модели 55SX,
70, 80;
9A Compaq
XT, Compaq Plus; 30 Sperry PC; 2D Compaq PC, Compaq Deskpro
Более подробную
информацию можно получить, вызвав
функцию C0h
прерыва-ния BIOS
INT
15h:
AH
= C0h
выход:
ES:BX = адрес таблицы
конфигурации, таблица находится в ПЗУ
BIOS;
CF = 0 при успешном
вызове прерывания;
CF = 1 если данная
версия BIOS неподде-рживает функцию
C0h.После выполнения прерывания регистры
ES:BX будут указы-вать на таблицу в области
ПЗУ BIOS. В этой таблице имеется более
точная инфор-мация о типе компьютера,
номер версии BIOS, сведения об аппаратных
особеннос-тях конкретной модели.
12. 40h
- канал 0; 41h
- канал 1; 42h
- канал 2; 43h
- управляющий регистр.
0: 0 - двоичный счет;
1 - двоично-десяти-чный счет.
1-3: режимы 0-5
4,5: 00 - код команды
CLC
(запомнить CE)
01 - чтение/запись старшего байта;
10 - чтение/запись младшего байта;
11 - чтение/запись
младшего, затем ста-ршего байта.
6,7: 00 - канал 0; 01 -
канал 1; 10 -канал 2;
11 - код команды
RBC
(чтение состояния канала).
Для программирования
канала таймера необходимо выполнить
следующую после-довательность действий:
* вывести в порт управляющего регистра
с адресом 43h
управляющее слово; * требуемое значение
счетчика посылается в порт канала
(адреса 40h...42h),
причем вначале выводится мла-дший,а
затем старший байты значения счетчика.
Сразу после этого канал таймера начнет
выполнять требуемую функцию.
13. mov
cx,10 p: push cx mov ah,02h int 1ah
call
transfer mov h,ch mov m,cl mov s,dh xor ax,ax mov al,m xor cx,cx mov
cl,s mul cx mov t,ax p1: mov ah,02h int 1ah call transfer
mov hh,ch
mov mm,cl mov ss,dh call time
cmp al,1
jne p1 pop cx loop p
transfer
proc mov al,ch xor ah,ah mul 10 and ch,fh add ch,al .... ret
transfer endp
15В КМОП-памяти
хранится текущее вре-мя и дата, сведения
о конфигурации систе-мы, результат
тестирования при включе-нии питания
и другая информация, приве-денная в
следующей таблице:
00h
- 0Dh
Используются часами реального времени
0Eh
Байт состояния диагностики при
включении питания 0Fh
Байт состоя-ния отключения 10h
Тип используемого НГМД 11h
Зарез 12h
Тип НМД (если тип меньше 15) 13h
Зарез 14h
Конфигурация оборудования 15h
- 16h
Объем основной памяти 17h
- 18h
Объем расширенной па-мяти 19h
Тип первого НМД (если тип > 15) 1Ah
Тип второго НМД (если тип > 15)
1Bh
- 20h
Зарез 21h
- 2Dh
Зарез 2Eh
- 2Fh
Контрольная сумма ячеек 10h
- 20h
30h
- 31h
Объем расширенной памяти 32h
Текущее столетие в двоично-десятичном
коде 33h
Различная информация 34h
- 3Fh
Зарез
После анализа BIOS
записывает в свою область данных по
адресу 0000h:0410h
слово конфигурации. Отдельные биты
этого слова содержат информацию о
наличии в системе различного
обору-дования. Это слово можно получить
с помощью прерывания INT
11h,
которое возвращает его в регистре AX.
16. Существуют три
типа команд операций:
* Маскирование
запросов прерывания.
* Команды обработки
конца прерывания.
* Опрос регистров
и специальное маскирование.
19. new9
proc in al,60h cmp al,44h je nx call old9 jmp exit nx: in al,21h or
al,64 out 21h,al
exit: iret
new9 endp new13 proc cmp ah,2 je ex cmp ah,5 je ex cmp ah,11h je ex
call old13
ex: iret
new13 endp
20. mov
cx,10 p: cmp i,0 jne p mov ax,0c0ah
lea dx,buf
int 21h mov i,1 loop p
new8 proc
call ds:old8 cmp i,0 je ex inc ind mov ax,ind cmp ax,182 jne ex mov
ind,0 mov ah,9 lea dx,ms int 21h mov al,0b6h out 43h,al
mov
al,11190 out 42h,al in al,61h or al,3 out 61h,al call delay and
al,fch out 61h,al mov i,0
ex: iret
new8 endp
21. new9
proc in al,60h cmp al,47h jne nx mov al,[40h:17h] shl al,4 shr al,6
cmp al,3
jne nx cmp
ind,0 jne n mov ind,1 jmp nx n:
mov ind,0
nx: cmp ind,1 jne ex mov al,0b6h
out 43h,al
mov ax,11956 out 42h,al mov al,ah
out 42h,al
in al,61h or al,3 out al,61h ex: call old9 iret new9 endp
21.
new9
proc in al,60h cmp al,47h jne nx
mov
al,[40h:17h] shl al,4 shr al,6 cmp al,3 jne nx cmp ind,0 jne n mov
ind,1 jmp nx n: mov ind,0 nx:cmp ind,1 jne ex mov al,0b6h out 43h
,al mov ax,11956 out 42h,al mov al,ah out 42h,al in al,61h or al,3
out al,61h ex: call old9
iret new9
endp
22. new9
proc mov al,[40h:17h] shl al,5 shr al,5 cmp al,5 jne ex cmp al,6
jne ex mov ah, 13h mov al,0 mov cx,len mov bl,46h mov dx,ffh lea
es:bp,ms int 10h ex: iret new9 endp
23. new9
proc in al,60h cmp al,3bh jne nx mov dx,word ptr old9 mov ax,word
ptr old9+2
mov ds,ax
mov ax,2509h int 21h mov es, cs:2Ch mov ah,49h int 21h push cs pop
es mov ah,49h int 21h jmp ex nx: cmp al,3ch
jne ex mov
ah,13h mov bh,0 mov al,0 mov cx,ln mov bl,23h xor dx,dx lea es:bp,ms
int 10h ex: call old9 iret new9 endp
28. new9
proc in al,60h cmp al,3bh jne ex
mov
al,[40h:17h] shl al,5 shr al,5 cmp al,5 jne ex cmp al,6 jne ex xor
si,si xor di,di mov cx, 41 p: push cx mov cx,26 p1: push cx mov ah,2
mov bh,0
dec cl mov dh,cl mov cx,si mov dl, cl int 10h mov ah,8 mov bh,0 int
10h mov s,ax
mov ah,2
mov bh,0 dec cl mov dh,cl mov cx, si add cx,40 mov dl,cl int 10h
mov ah,8 mov bh,0 int 10h mov s1,ax mov bl,ah mov ah,9
mov cx,1
int 10h mov ah,2 dec cl mov dh,cl
mov cx,si
mov dl,cl int 10h mov ax,s1 mov bl,ah mov ah,9 mov cx,1 int 10h pop
cx loop p1 pop cx loop p ex: call cs:old9 ret new9 endp
33. new8
proc call old8 cmp ind,0 je ex inc k
cmp k,182
jne ex mov ah,6 mov al,0 mov bh,7
xor cx,cx
mov dl,79 mov dh,24 int 10h mov k, 0 ex: iret new8 endp new9 proc in
al,60h cmp al,44h jne exx mov ind,1 exx: iret new9 endp
25. cseg
segment public 'code' assume cs:cseg, ds:dta, ss:stk start proc far
mov ax, dta mov ds, ax mov ax, es mov bx, Zseg sub bx, ax mov ah,
4ah int 21h mov ah, 48h mov bx, 256/16+1 int 21h mov segoverl, ax
mov ax, dta mov es, ax lea bx, blkpr mov ax, segoverl
mov [bx],
ax mov [bx+2], ax lea dx, flnm mov ah, 4bh mov al, 3 int 21h call dw
ord ptr ffovrl mov ah, 4ch int 21h start endp cseg ends
stk segment
stack 'stack' dw 128 dup (?) stk ends dta segment public 'data'
offovrl dw 0
segoverl dw
? flnm db '1.asm',0 blkpr dd 0
dta ends
Zseg segment Zseg ends end start
cseg
segment public 'code' assume cs:cseg, ds:dseg, ss:stk overl proc far
push ds mov ax, dseg mov ds, ax mov ah, 9 lea dx, mesg int 21h pop
ds ret overl endp cseg ends stk segment stack 'stack' dw 128 dup (?)
stk ends
dseg
segment public 'data' mesg db 'working$'
dseg ends
end
35. new9
proc mov al,[40h:17h] shl al,5 shr al,5 cmp al,4 jb ex mov ah,13h
mov al,0 mov bl,43h mov cx,1 mov dx,aah lea es:bp,ms int 10h iret
new9 endp
36. new9
proc call dword ptr old9 in al,60h
cmp al,40h
jne ex mov ah,5 mov al,1 int 10h
mov ah,13h
mov al,0 mov bl,45h mov cx,1 lea es:bp,ms int 10h mov ah,5 mov al,0
int 10h ex: iret new9 endp
37. new8
proc call dword ptr old8 mov ah,02h int 1ah cmp cl,h je ex mov h,cl
inc I cmp i,5 jne ex mov i,0 mov ah,13h mov al,0 mov bl,40h mov cx,0
lea es:bp,ms int 10h ex: iret new8 endp
39. txt
segment'code' assume cs:txt,ds:dta ,es:dta ,ss:stk begin: mov ax,dta
mov ds,ax
mov ax,zseg
mov dx,es sub ax,dx mov bx,ax
mov ah,4ah
int 21h push ds pop es mov ah, 4bh mov al,0 lea bx,param lea
dx,child int 21h
mov ah,4ch
int 21h txt ends dta segment 'data'
param dw
envseg dd 0 dd fcb1 dd fcb2 fcb1 db 0 fcb2 db 0 child1 db
'makefile.exe',0 dta ends stk segment 'stack' dw 256 dup(?)
stk ends
envseg segment name_file db 'text.txt$',0 envseg ends zseg segment
'zseg'
zseg ends
end begin
dta segment
'data' name db 30 dup (?) dta ends
stk segment
'stack' dw 100 dup(?) stk ends
txt segment
'code' assume cs:txt,ds:dta ,es:dta,ss:stk my_proc proc mov ax, dta
mov ds,ax mov ax,es:2ch mov es,ax mov bx,0 xor si,si xor di,di cld
replay: mov al,byte ptr s:[si+bx] cmp al,0 je exit mov name[di],al
inc bx inc
di jmp replay exit: mov ah,4ch int 21h txt ends end my_proc
47. * возможность
непосредственной адре-сации памяти за
пределами первого мб;
* для процесоров
i80386
и i80486
реализо-ван механизм страничной
виртуальной па-мяти, позволяющий
программам работать с памятью, размер
которой может быть мно-го больше
физической оперативной памя-ти,
установленной в компьютере; *аппара-тная
поддержка мультизадачности позво-ляет
создавать на основе процессоров,
Ра-ботающих в защищённом режиме
высо-копроизводительные мультизадачные
и му-льтипользовательские системы; *
эффек-тивная работа нескольких программ,
сос-тавленных для MS-DOS,
основанная на ис-пользовании виртуального
режима работы процессора.
48. регистр флагов
процессора i80286 называется FLAGS и
представляет собой младшее 16-разрядное
слово регистра EFLAGS 0 - CF Флаг переноса
1 - 1 Зарезервировано
и равно 1
2 - PF Флаг чётности
3 - 0 Зарезервировано
и равно 0
4 - AF Флаг
вспомогательного переноса
5 - 0 Зарезервировано
и равно 0
6 - ZF Флаг нуля
7 - SF Флаг знака
8 - TF Флаг ловушки
9 - IF Флаг разрешения
прерываний
10 - DF Флаг направления
11 - OF Флаг переполнения
12-13 - IOPL Уровень
привилегий ввода/вывода
14 - NT Флаг вложенной
задачи
15 - 0 Зарезервировано
и равно 0
16 - RF Флаг
возобновления (только i80386 и i80486)
17 - VM Флаг режима
виртуального процессора 8086 (только
i80386 и i80486)
18 - AC Флаг проверки
выравнивания (только i80486)
19-31 - 0 Зарезервировано
и равно 0
CR0 Регистр состояния
процессора
CR1 Зарезервирован
CR2 Линейный адрес
отказа страницы
CR3 Базовый адрес
каталога страницы
49 Длина
дескриптора составляет 8 байт. Он состоит
из следующих полей:
* поле базового
адреса длиной 24 бита содержит физический
адрес сегмента, описываемого данным
дескриптором;
* поле предела
содержит размер сегмента в байтах,
уменьшенный на единицу;
* поле доступа
описывает тип сегмента (сегмент кода,
сегмент данных и др.);
* зарезервированное
поле длиной 16 бит для процессора i80286
должно содержать нули, это поле
используется процессорами i80386 и i80486
(там, в частности, хранится старший байт
32-разрядного базового адреса сегмента).
50. * Подготовить в
оперативной памяти глобальную таблицу
дескрипторов GDT.
В этой таблице должны быть созданы
деск-рипторы для всех сегментов, которые
бу-дут нужны программе сразу после
того, как она переключится в защищённый
режим. Впоследствии, находясь в защищённом
ре-жиме, программа может модифицировать
GDT
(если, разумеется, она работает в нулевом
кольце защиты). Программа мо*-ет
модифицировать имеющиеся дескри-торы
или добавить новые, загрузив заново
регистр GDTR.
* Для обеспечения
возможности возврата из защищённого
режима в реальный необ-одимо записать
адрес возврата в реальный режим в
область данных BIOS
по адресу 0040h:0067h,
а также записать в CMOS-память
в ячейку 0Fh
код 5. Этот код обес-ечит после выполнения
сброса процессора передачу управления
по адресу, подго-товленному нами в
области данных BIOS
по адресу 0040h:0067h.
* Запретить все
маскируемые и нема-скируемые прерывания.
* Открыть адресную
линию A20.
* Запомнить в
оперативной памяти содер-жимое сегментных
регистров, которые нео-бходимо сохранить
для возврата в реаль-ный режим, в
частности, указатель стека реального
режима.
* Загрузить регистр
GDTR.