Вопросы и ответы по ОС реального режима (DOS) Часть 2


Добавил:DMT
Дата создания:19 июня 2008, 0:25
Дата обновления:19 июня 2008, 0:29
Просмотров:8681 последний сегодня, 1:46
Комментариев: 0

9. TSR программы: структура, порядок написания и отладки.

•  Вы разрабатываете TSR программу, которая непрерывно находится в памяти и к которой время от времени должны обращаться запускаемые в MS DOS приложения. Составьте блок-схему алгоритма работы модуля TSR программы, который бы отвечал интересующимся приложениям на запросы:

•  какой адрес буфера данных в TSR программе?

•  сколько времени “я” уже отработала?

•  есть ли для “меня” какие-либо указания?

Ответ:

Алгоритм реализации :

•  модуль установки программы в память;

•  модуль предотвращения повторной установки программы в память;

•  модуль проверки команд (команды, их номера передаются прерыванию в регистре al )

•  модуль расчёта и вывода буфера данных а регистры es : bx

•  модуль расчёта и вывода времени работы TSR программы в регистры ax , bx , dx , cx

•  модуль активизации и вывода на экран сообщения;

•  модуль выгрузки программы из памяти.

•  Составьте блок-схему работы TSR программы MS DOS, решающей следующую задачу: модуль находится в памяти и контролирует запуск программ. Как только запускается программа SECRET.EXE начинается запоминание кодов всех клавиш, нажимаемых пользователем на клавиатуре. После завершения сеанса работы программы SEKRET.EXE, запомненные коды клавиш записываются в файл KEYBOARD.DAT.
Из блок-схемы ДОЛЖНО быть абсолютно ясно, на каких особенностях, прерываниях, приемах работы ОС решается данная задача.

10) Драйверы MS DOS: структура, порядок взаимодействия с MS DOS, порядок написания и отладки.

6) Напишите процедуру, которая возвращает число (int) равное количеству драйверов, загруженных в память ПЭВМ.

Ответ:

mov count_drv,1

mov ah, 9h ; Выводим заголовок

mov dx, OFFSET msg

int 21h

 

mov ah,52h ; Получаем адрес первого

int 21h ; драйвера в цепочке

add bx,22h ; es:bx - адрес первого драйвера

dr_loop:

inc count_drv

cmp WORD PTR es:[bx+2], 0ffffh ; последний ?

jz end_of_driver_list

cmp WORD PTR es:[bx], 0ffffh

jz end_of_driver_list

mov ax,es:[bx] ; получаем адрес следующего

mov cx,es:[bx+2] ; драйвера

mov bx,ax

mov es,cx

jmp dr_loop

end_of_driver_list:

mov ax, count_drv

Подпрограмма передаст количество драйверов в AX .

•  Составьте блок-схему программного модуля, который, минуя операционную систему MS DOS, обращался бы к драйверу с именем SD00XXX и запускал его на выполнение чтения данных с устройства.

Заголовок драйвера :

(0) 4

next

указатель на заголовок следующего драйвера. Если смещение адреса следующего драйвера равно FFFF, это последний драйвер в цепочке

(+4) 2

attrib

атрибуты драйвера

(+6) 2

strateg

смещение программы стратегии драйвера

(+8) 2

interrupt

смещение программы обработки прерывания для драйвера

(+10) 8

dev_name

имя устройства для символьных устройств или количество обслуживаемых устройств для блочных устройств.

 

Приведем формат заголовка запроса:

(0) 1

size

Длина запроса в байтах (длина заголовка запроса плюс длина переменной части запроса)

(+1) 1

unit

Номер устройства (используется для блочных устройств, указывает, с каким именно устройством, обслуживаемым драйвером, будет работать операционная система)

(+2) 1

cmd

Код команды, которую требуется выполнить (может иметь значение от 0 до 18h)

(+3) 2

status

Слово состояния устройства, заполняется драйвером перед возвратом управления операционной системе

(+5) 8

reserved

Зарезервировано

Ответ :

•  Вы пишете драйвер в MS DOS. При выполнении каждой команды, полученной от MS DOS, драйвер должен выдавать размер области данных, передаваемых драйверу операционной системой. Приведите ФРАГМЕНТ программы, выполняющей данное действие. Где в драйвере должен располагаться данный фрагмент?

Ответ :

mov es : word ptr [ bx ]+3,10 ; Status – наша команда 10, необязательно mov al, es:byte ptr [bx] sub al,13 mov es : byte ptr [ bx ]+5, al ; Передадим в Зарезервированную часть запроса размер области данных, передаваемых драйверу операционной системой   Этот фрагмент должен располагаться в обработке прерывания драйвера, после каждой процедуры обработки команды.  

•  Драйверы MS DOS: характеристика стандартных драйверов по управлению устройствами в MS DOS.

•  В MS DOS портом LPT управляет стандартный драйвер, загружаемый при старте системы из BIOS. Вы достали новый драйвер (файл HPLPT.SYS) который позволяет присоединять к ПЭВМ в MS DOS современные лазерные принтеры. Какую запись надо сделать в файле Config.sys, чтобы стандартный драйвер был заменен Вашим новым драйверм?

Ответ:

device=[d:][path] HPLPT.SYS

12. Клавиатура: порядок взаимодействия с MS DOS. Порядок программирования контроллера клавиатуры.

13) При работе Вашей программы надо запретить пользователю перезапуск компьютера по Ctrl+Alt+Del. Напишите фрагмент программы, реализующий этот запрет.

Ответ:

int_09h:

push ax

push es

in al ,60 h ; Скан код клавиши из PA

cmp al,53h

jne not_press

mov ah,12h

int 16h

and ah,00001111b; 0b = Левый Ctrl, 1b= Левый Alt, 2b= Правый Ctrl, 3b= Правый Alt.

jnz not_press

pop es

pop ax

iret

not_press:

pop es

in al,61h ; Ввод порта PB

mov ah,al

or ah ,80 h ; Установить бит подтверждения ввода

out 61h,al

xchg ah , al

out 61 h , al ; Вывод старого значения PB

mov al ,20 h ; Послать сигнал EOI

out 20h,al; контроллеру прерываний

pop ax

iret

14) Что происходит в приведенном ниже фрагменте программы? Дайте не формальные пояснения к каждой строке:

Ответ:

# include < stdio . h >

void main(void); void main(void) { int i; // Посылаем процессору клавиатуры // команду управления светодиодами outp(0x60,0xed); // Перед посылкой второго байта команды // выполняем небольшую задержку for(i=0; i<4000; i++); // Выводим второй байт команды, // младшие три бита которого определяют // состояние светодиодов на лицевой панели // клавиатуры. outp(0x60,7); // Ожидаем нажатия на любую клавишу. getch(); // Выключаем все светодиоды. outp(0x60,0xed); for(i=0; i<4000; i++); outp(0x60,0); exit(0); }

15) Напишите на АССЕМБЛЕРЕ фрагмент программы, обеспечивающей сброс буфера клавиатуры.

Ответ:

a) mov ax,0c00h

int 21h

b)

mov ax, 0000h

mov es,ax

mov bx, 0480h

mov ax,[es:bx]

mov bx, 0482h

mov [es:bx],ax

16) Напишите фрагмент программы , определяющей , нажаты ли пользователем клавиши :
LeftCntrl + RightShift + ScrollLock + NumLock

Ответ:

proc Spec_keys_press near

mov bx,01

mov ah,12h

int 16h

and al,00000010b

jz shift_press

jmp end_proc

shift_press:

and ah,00110001b; 0b = Левый Ctrl, 4b = Scroll Lock, 5b = Num Lock

jz other_press

jmp end_proc

other_press:

mov bx,1

end_proc:

ret

endp

; Если клавиши LeftCntrl + RightShift + ScrollLock + NumLock нажаты , то функция передаёт в bx=1.

13. CMOS память ПЭВМ. Часы реального времени ПЭВМ. Порядок программирования.

  1. Напишите программу, снимающую пароль, установленный на SETUP -е компьютера.

Ответ:

CMOS:

#include <stdio.h> # include < stdlib . h > main() { // Эта строка будет записана в КМОП-память static char password[12] = ""; int i,j; for (i=0;i<12;i++) password[i]=0; printf ("\ n *Запись в CMOS \ n \ n "); for(i=0x34,j=0; i<0x40; i++,j++) { // Задаем адрес ячейки КМОП-памяти outp(0x70,i); // Выполняем запись в эту ячейку outp(0x71,password[j]); } }

 

Составьте подробный алгоритм работы программы, использующей БУДИЛЬНИК SETUP-а компьютера.

•  Прочитать и сохранить обработчик прерывания int 4 Ah ( int 35 h )

•  Определить свой обработчик прерывания int 4 Ah ( int 25 h )

•  Установить байты будильника в CMOS памяти (1- секунды, 3 – минуты, 5- часы) в BCD формате (как вижу так пишу)

•  Выйти и остаться в памяти int 27 h

14. Программирование таймера ПЭВМ.

10) Ваша резидентная программа (выполняющая некоторые измерительные действия) должна вызываться 1000 раз в секунду. Предложите блок-схему всех функциональных блоков реализующих эту задачу без нарушения работы MS DOS.

Ответ:

Замечание: часы обновляются каждые 1193180/65536 ( 18.2) тиков в секунду.

Установка счётчика часов 1000 раз/сек.

Mov cx,04h

Mov dx, a9h

Int 1ah

11) Напишите фрагмент программы, настраивающей таймер ПЭВМ на запуск некого внешнего программного модуля, снимающего значения амплитуды исследуемого сигнала, представленного на рисунке, для последующего построения его графика:

Ответ:

Установка счётчика часов 100000 раз/сек.

Mov cx,0h

Mov dx,0 С h

Int 1ah

.

.

.

New_1C Proc

mov ax,cs mov ds,ax mov dx,offset cs: Name_com mov es,ax mov bx,offset cs: EPB _com mov AH , 4BH mov AL , 0 int 21h

jmp cs:[Old_1С] ;и перейти по адресу старого обработчика

;прерывания 2F.

Old_1С DD 0 ; это место под адрес старого обработчика преры-

;вания 2F.

Name_com db ‘graphic.com',0

EPB _com db 16 DUP (0)

New_1 С endp

15. Программирование контроллера порта последовательной передачи данных

Через СОМ порт по протоколу: скорость передачи – 16000 Кбит/с

контроль на четность – Да

число стоповых бит – 2

число бит данных – 8

пришли девятибитные коды: 257 303 285 154 172 219 182

укажите, какие из этих кодов приняты портом с ошибками

Ответ:

Для того, чтобы узнать какие коды приняты портом с ошибками, нужно перевести девятибитные коды в двоичные:

257 = 100000001

303 = 100101111

285 = 100011101

154 = 10011010

172 = 10101100

219 = 11011011

182 = 10110110.

285 182 приняты с ошибками, т.к. количество единиц нечётное

up