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


Добавил:DMT
Дата создания:19 июня 2008, 1:02
Дата обновления:19 июня 2008, 1:03
Просмотров:7006 последний сегодня, 6:53
Комментариев: 0

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

15. При печати на принтере вместо русских букв печатаются какие-то “греческие” значки.

Почему? И что мне делать чтобы напечатать русский текст в MS DOS?

Ответ: Принтеры содержат внутри себя специальное ПЗУ, на котором, в частности, хранятся наборы шрифтов, используемые принтером при печати документов в текстовом режиме.

Если ПЗУ принтера содержит наборы символов с русскими символами, то вам достаточно выбрать данный шрифт, установив переключатели принтера в определенное положение или, если принтер имеет энергонезависимую память, выбрав нужный шрифт с помощью меню.

В большинстве случаев встроенные шрифты принтеров не содержат русских букв или в них используется неправильная кодировка. В этом случае вы можете использовать возможность загрузки в принтер собственных наборов шрифтов. Для этого вам не обязательно вручную программировать принтер. Достаточно использовать уже разработанные программы загрузки шрифтов. К таким программам можно отнести программу SETPR, пакеты SOLO, LOADFONT и многие другие. Кроме того вы можете распечатывать документы в графическом режиме из Microsoft Windows.

2. Составьте блок-схему фрагмента программы, проверяющего готовность принтера к печати.

Ответ:

Порт 379h.

Порт состояния принтера, доступен только для чтения:

7 6 5 4 3 2 1 0
T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦ ¦ ¦ ¦
LT+T+T+T+T+T+-+T-
¦ ¦ ¦ ¦ ¦ L===¦= установлены в 0;
¦ ¦ ¦ ¦ ¦
¦ ¦ ¦ ¦ L======= сигнал ошибки, активный уровень - 0,
¦ ¦ ¦ ¦ контакт разъема - 15, ERROR;
¦ ¦ ¦ ¦
¦ ¦ ¦ L========= принтер выбран, контакт 13, SLCT;
¦ ¦ ¦
¦ ¦ L=========== конец бумаги, контакт 12, PE;
¦ ¦
¦ L============= готовность принтера, активный уровень - 0,
¦ контакт разъема - 10, ACK;
¦
L=============== 0 - принтер занят, находится в состоянии
offline или произошла ошибка, контакт 11,
BUSY.

Обычно редко приходится работать с принтером на уровне портов ввода/вывода, так как достаточно использовать функции BIOS или MS-DOS, предназначенные для этого. Приведенная выше информация может пригодиться вам для разработки собственного драйвера принтера или для подключения к принтерному порту какого-либо другого устройства ввода/вывода, например, аналого-цифрового преобразователя.

17. Программирование контроллера прерываний ПЭВМ.

Номер

Описание

8

IRQ0 прерывание интервального таймера, возникает 18,2 раза в секунду.

9

IRQ1 прерывание от клавиатуры. Генерируется при нажатии и при отжатии клавиши. Используется для чтения данных с клавиатуры.

A

IRQ2 используется для каскадирования аппаратных прерываний в машинах класса AT.

70

IRQ8 прерывание от часов реального времени.

71

IRQ9 прерывание от контроллера EGA.

72

IRQ10 зарезервировано.

73

IRQ11 зарезервировано.

74

IRQ12 зарезервировано.

75

IRQ13 прерывание от математического сопроцессора.

76

IRQ14 прерывание от контроллера жесткого диска.

77

IRQ15 зарезервировано.

B

IRQ3 прерывание асинхронного порта COM2.

C

IRQ4 прерывание асинхронного порта COM1.

D

IRQ5 прерывание от контроллера жесткого диска для XT.

E

IRQ6 прерывание генерируется контроллером флоппи диска после завершения операции

F

IRQ7 прерывание принтера. Генерируется принтером, когда он готов к выполнению очередной операции. Многие адаптеры принтера не используют это прерывание.

•  Напишите фрагмент программы, настраивающей контроллер прерываний ПЭВМ так, что прерывание таймера получает наименьший приоритет, а прерывание часов реального времени – максимальный приоритет.

Ответ:

Алгоритм смены приоритета:

1. Сбросить бит в ISR с наибольшим приоритетом

2. Сбросить бит в ISR для определенного уровня прерываний

3. Установить низший приоритет для определенного уровня

4. Поменять приоритеты уровней с максимальным и минимальным приоритетами

5. Поменять приоритеты уровней с заданным и минимальным приоритетами

Данный приказ посылается в порт 20 h

Команды обработки конца прерывания приведем в виде таблицы:

Биты байта команды Описание D7 D6 D5 D4 D3 D2 D1 D0 0 0 1 0 0 0 0 0 Обычный конец прерывания. 0 1 1 0 0 B2 B1 B0 Специальный конец прерывания, B0...B2 - двоично-десятичный код сбрасываемого разряда в регистре обслуживания прерывания ISR. 1 0 1 0 0 X X X Циклический сдвиг уровней приоритета с обычным концом прерывания. Дно приоритетного кольца устанавливается по обслуженному запросу. 1 1 1 0 0 B2 B1 B0 Циклический сдвиг уровней приоритета со специальным концом прерывания, B0...B2 - двоично-десятичный код дна приоритетного кольца. 1 0 0 0 0 X X X Разрешение вращения уровней приоритета. 0 0 0 0 0 X X X Сброс разрешения вращения уровней приоритета. 1 1 0 0 0 B2 B1 B0 Циклический сдвиг уровней приоритета без завершения прерывания, B0...B2 - двоично-десятичный код дна приоритетного кольца

Команды третьего типа выдаются также в порты с адресами 20h и A0h.

out 20h, 00100000h ; сброс бита в ISR с наибольшими приоритетами

out 20h, 01100101h ; Специальный конец прерывания

out 20h, 10000101h ; разрешение вращения

mov cx, 8

loop1: ; возможно циклы не нужны

out 20h, 11100101h ; циклический сдвиг

loop loop1

out 20h, 00000101h

Mov cx,8

Loop1:

Out 20h,14

Loop1

•  На время выполнения фрагмента Вашей программы необходимо заблокировать ВСЕ прерывания ПЭВМ. Напишите фрагмент программы, выполняющий, а затем снимающий такую блокировку.

Ответ:

cli

.

.

.

sti

•  Напишите фрагмент программы, перепрограммирующий контроллер прерываний ПЭВМ так, что прерывание таймера получает 3-й приоритет, а прерывание контроллера НГМД - 4-й.

Ответ: Невозможно т.к. приоритеты выставляются по кольцевой схеме.

•  Напишите фрагмент программы, перепрограммирующий контроллер прерываний ПЭВМ так, что прерывание таймера получает 3-й приоритет.

Ответ:

out 20h, 00100000h ; сброс бита в ISR с наибольшими приоритетами

out 20h, 01100101h ; Специальный конец прерывания

out 20h, 10000101h ; разрешение вращения

mov cx, 3

loop1:

out 20h, 11100101h ; циклический сдвиг

loop loop1

out 20h, 00000101h

Mov cx,3

Loop 1:

Out 20 h , 14

Loop 1

19. Контроллер прямого доступа к памяти, его программирование.

  1. Напишите фрагмент программы, настраивающий DMA на запись области ПЗУ ПЭВМ типа PC/AT на вичестер.

Ответ:

;Hачинаем инициализацию микросхемы DMA

mov al,4 A h ;Kод записи данных контроллера HГМД

out 12,al

out 11,al

; Вычисляем адрес буфера

lea ax , buffer ;Берём смещение буфера в DS

mov bx , ds ;Помещаем DS в BX

mov cl,4 ;Готовим вращение старшего нибла

rol bx,cl ;Вращаем младшие 4 бита

mov dl,bl ;Копируем DL в BL

and dl,0fh ;Чистим старший нибл в DL

and bl,0f0h ;Чистим старший нибл в BX

add ax,bx ;Складываем

jnc nocr ;Если не было переноса, то # страницы в DL

inc dl ;Увеличиваем DL, если был перенос

nocr:

out 4,al ;Посылаем младший байт адреса

mov al,ah ;Сдвигаем старший байт

out 4,al ;Посылаем младший байт адреса

mov al,dl ;Засылаем номер страницы

out 82h,al ;Посылаем номер страницы

;Kонец инициализации

mov ax,511 ;Значение счётчика

out 5,al

mov al,ah

out 5,al

mov al,3 ;Готовим размещение канала 3

out 10,al ;DMA ожидает данные

Канал 3 - адаптер накопителя на магнитном диске (НМД).

Канал 3 являются каналом 8-битовой передачи данных.

Размер страницы составляет 128 килобайт, поэтому при передаче данных с спользованием DMA не должна пересекаться граница 128 килобайт.

82h - регистр страниц канала 3

20. Программирование контроллера НГМД в MS DOS.

•  Напишите фрагмент программы, которая перехватывает обращения других программ к портам НГМД и записывает передаваемые в них значения в свой буфер.

Ответ: Невозможно перехватить обращение к портам НГМД и других.

21. Компьютерная вирусология

  1. Я просмотрел каталоги переданной мне дискеты, после чего резидентный антивирус моего компьютера “halt”-онул систему, сказав, что в памяти компьютера вирус. Неужели я заразил компьютер?
    Что мне делать?

Ответ: Вы не заразили свой компьютер, просто при обращении к дискете, директория ROOT копируется в ОЗУ. Теперь в ОЗУ наше системы находится содержимое файлов ROOT , и если там расположен известный вашему антивирусу вирус, то он его обнаружит. Пока вы не запустите на выполнение зараженный исполняемый файл, система не заразится, поэтому нахождение в ОЗУ вируса ещё не свидетельствует о его выполнении. Унесите дискету другу.

  1. Включаю компьютер, запускаю антивирусную программу, она обнаруживает и начинает лечить зараженные файлы, долго лечит, наконец сообщает, что все вылечено. Работаю до конца дня (автономно, без Интернета и чтения чужих дискет). Выключаю компьютер. На следующий день все повторяется сначала.
    Как мне избавиться от этого дурдома. Только не надо мне предлагать форматировать винчестер!!!

Ответ: Вероятнее всего вирус не ставит метки на повторное заражение и заражает уже зараженный файл несколько раз. Для прекращения этого дурдома необходимо прогонят антивирус до тех пор пока на винчестере не останется ни одного зараженного файла.

  1. Запускаю компьютер с дискеты, включаю антивирусную программу, она находит зараженные файлы и сообщает о их успешном излечении. Проходит весь винчестер. Заканчивает.Я снова запускаю эту программу. Она снова находит вирус в тех же самых файлах, снова сообщает об успешном излечении. Снова проходит весь винчестер… И так раз пять – шесть. И вдруг все заканчивается. Вирусов больше нет. И больше они не появляются, хоть включай, хоть выключай компьютер.
    Что же это было? Почему не удалось вылечить вирус с одного раза?

Ответ: Как и предыдущий вопрос.

  1. Компьютер поражен вирусом, прицепляющимся к . COM программам. Вам представлены дампы одной из программ ДО и ПОСЛЕ заражения. Предложите алгоритм программы-лечилки для удаления вируса с компьютера.

Ответ:

Алгоритм лечения:

1) Прочитать 2 байта ( 2 и 3) зараженного файла в переменную Offset 1.

2) Перейти по смещению Offset 1+ FD (253) зараженного файла

3) Прочитать 3 байта в переменную right _ head

4) Обрезать файл по смещению Offset 1+2

5) Записать в начало файла 3 байта переменной right _ head

1) Компьютер поражен вирусом, прицепляющимся к . EXE программам. Вам представлены дампы одной из программ ДО и ПОСЛЕ заражения. Предложите алгоритм программы-лечилки для удаления вируса с компьютера.

Ответ:

Будем считать, что мы проверили несколько здоровых и заражённых программ и установили, что тело вируса имеет постоянный размер. В связи с такими заключениями будем считать конец зараженного файла, как сектор заражённой программы, который у здоровой бал последним.

Алгоритм:

•  Перейдем на конец зараженного файла – 57б

•  Прочитаем 22 байта в переменную right _ head

•  Перейдем на 20 байт от начала и прочитаем 2 слова в 2-е переменных TruncIP и TruncCS

•  Запишем в начало файла right _ head

•  Перейдём по сегмент смещению TruncCS : TruncIP и обрежем файл.

(+20) 2

ip_reg

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

(+22) 2

cs_reg

смещение от начала программы для установки сегментного регистра кода CS

99) Процесс загрузки операционной системы

При включении питания компьютера управление передается базовой системе ввода/вывода, BIOS.Она выполняет проверку аппаратных узлов компьютера, формирует начальную часть таблицы векторов прерываний, инициализирует устройства и начинает процесс загрузки операционной системы.

Загрузка начинается с того, что BIOS делает попытку прочитать самый первый сектор дискеты, вставленной в дисковод А: (на загрузочной дискете этот сектор содержит загрузчик операционной системы). Если в дисковод вставлена системная дискета, с нее считывается загрузчик и ему передается управление.

Если дискета не системная, т.е. не содержит загрузочной записи, на экран выдается сообщение с просьбой заменить дискету.

Если же дискеты в дисководе А: вообще нет, то BIOS читает основную загрузочную запись диска С: (Master Boot Record). Обычно это самый первый сектор на диске. Управление передается загрузчику, который находится в этом секторе. Загрузчик анализирует содержимое таблицы разделов (она также находится в этом секторе), выбирает активный раздел и читает загрузочную запись этого раздела. Загрузочная запись активного раздела (Boot Record) аналогична загрузочной записи, находящейся в первом секторе системной дискеты.

Загрузочная запись активного раздела считывает с диска файлы IO.SYS и MSDOS.SYS (именно в этом порядке). Затем считываются и загружаются резидентные драйверы. Начинается формирование связанного списка драйверов устройств. Анализируется содержимое файла CONFIG.SYS, загружаются описанные в этом файле драйверы. Сначала загружаются драйверы, описанные параметром DEVICE, затем (только в MS-DOS версии 4.х и 5.0) резидентные программы, указанные операторами INSTALL. После этого считывается командный процессор и ему передается управление.

Командный процессор состоит из трех частей - резидентной, инициализирующей и транзитной. Первой загружается резидентная часть. Она обрабатывает прерывания INT 22H, INT 23H, INT 24H, управляет загрузкой транзитной части. Эта часть командного процессора обрабатывает ошибки MS-DOS и выдает запрос пользователю о действиях при обнаружении ошибок.

Инициализирующая часть используется только в процессе загрузки операционной системы. Она определяет начальный адрес, по которому будет загружаться пользовательская программа и инициализирует выполнение файла AUTOEXEC.BAT.

Транзитная часть командного процессора располагается в старших адресах памяти. В этой части находятся обработчики внутренних команд MS-DOS и интерпретатор командных файлов с расширением имени .BAT. Транзитная часть выдает системное приглашение (например, А:\> ), ожидает ввода команды оператора с клавиатуры или из пакетного файла и организует их выполнение.

После загрузки командного процессора и выполнения начальных процедур, перечисленных в файле AUTOEXEC.BAT, подготовка системы к работе завершается.

Исходный текст драйвера:

.MODEL tiny
.CODE ; Драйвер состоит из одного
; сегмента кода

org 0 ; Эта строка может отсутствовать

include sysp.inc

;========================================================

simple PROC far ; Драйвер - это FAR-процедура

;========================================================

E_O_P: ;Метка конца программы,
;устанавливаем ее в начало
;драйвера, т.к. не надо
;оставлять драйвер резидентно
;в памяти

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

dd 0ffffffffh ;адрес следующего драйвера
dw 8000h ;байт атрибутов
dw dev_strategy ;адрес процедуры стратегии
dw dev_interrupt ;адрес процедуры прерывания
db 'SIMPLE_D' ;имя устройство (дополненное
;пробелами)

;========================================================

; Программа стратегии

dev_strategy:
mov cs:req_seg,es
mov cs:req_off,bx
ret

; Здесь запоминается адрес заголовка запроса

req_seg dw ?
req_off dw ?

;========================================================

;Обработчик прерывания

dev_interrupt:
push es ;сохраняем регистры
push ds
push ax
push bx
push cx
push dx
push si
push di
push bp

; Устанавливаем ES:BX на заголовок запроса

mov ax,cs:req_seg
mov es,ax
mov bx,cs:req_off

; Получаем код команды из заголовка запроса и умножаем
; его на два, чтобы использовать в качестве индекса
; таблицы адресов обработчиков команд

mov al,es:[bx]+2
shl al,1

sub ah,ah ; Обнуляем AH
lea di,functions ; DI указывает на смещение
; таблицы
add di,ax ; Добавляем смещение в таблице
jmp word ptr [di] ; Переходим на адрес из таблицы

functions LABEL WORD ; Таблица функций

dw initialize
dw check_media
dw make_bpb
dw ioctl_in
dw input_data
dw nondestruct_in
dw input_status
dw clear_input
dw output_data
dw output_verify
dw output_status
dw clear_output
dw ioctl_out
dw Device_open
dw Device_close
dw Removable_media

; Выход из драйвера, если функция не поддерживается

check_media:
make_bpb:
ioctl_in:
nondestruct_in:
input_status:
clear_input:
output_verify:
output_status:
clear_output:
ioctl_out:
Removable_media:
Device_open:
Device_close:
output_data:
input_data:

or es:word ptr [bx]+3,8103h
jmp quit

;========================================================

quit:
or es:word ptr [bx]+3,100h
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
pop ds
pop es
ret

;========================================================

; Процедура выводит на экран строку
; символов в формате ASCIIZ

dpc proc near

push si

dpc_loop:
cmp ds:byte ptr [si],0
jz end_dpc
mov al,ds:byte ptr [si]
@@out_ch al
inc si
jmp dpc_loop

end_dpc:
pop si
ret

dpc endp

;========================================================

hello db 13,10,'+¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬+'
db 13,10,'¦ *SIMPLE* (C)Frolov A., 1990 ¦'
db 13,10,'+¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬+'
db 13,10
db 13,10,'Hit any key...'
db 13,10,0

;========================================================

initialize:

lea ax,E_O_P ;смещение конца программы в AX
mov es:word ptr [bx]+14,ax ;помещаем его в заголовок
mov es:word ptr [bx]+16,cs ;

; Стираем экран

mov dh,18h
mov dl,80h

xor cx,cx
mov bh,7
xor al,al
mov ah,6
int 10h

; Устанавливаем курсор в левый верхний угол экрана

mov bh,0
xor dx,dx
mov ah,2
int 10h

; Выводим сообщение

mov ax,cs
mov ds,ax
mov si,offset hello
call dpc

; Ожидаем нажатия на любую клавишу

mov ax,0
int 16h

jmp quit

simple ENDP

END simple
В программе используется макро @@out_ch, описанное в файле sysp.inc и предназначенное для вывода символов на экран дисплея. Файл sysp.inc имеется на дискете, прилагающейся к книге. Приведем текст макро @@out_ch:
@@out_ch MACRO c1,c2,c3,c4,c5,c6,c7,c8,c9,c10
mov ah,02h
IRP chr,<c1,c2,c3,c4,c5,c6,c7,c8,c9,c10>
IFB <chr>
EXITM
ENDIF
mov dl,chr
int 21h
ENDM
ENDM
Текст этого драйвера транслировался при помощи ассемблера, входящего в состав Quick C 2.01. Полученный объектный модуль обрабатывался пакетным файлом:
link %1.obj;
exe2bin %1.exe %1.sys
 

Структура памяти ПК класса XT АТ

up