- •По курсу: ”организация эвм и систем”
- •Печатается по решению редакционно-издательского совета
- •Введение
- •1Введение в архитектуру реального режима ibm pc
- •Память и процессор
- •Распределение адресного пространства
- •Система прерываний
- •Система ввода-вывода
- •Архитектурные особенности процессоров ia-32
- •Дополнительные режимы адресации
- •Использование средств 32-разрядных процессоров в программировании
- •2Общие указания по выполнению лабораторных работ
- •Лабораторная работа № 1 Изучение структуры программы и способов адресации мп 8086
- •Домашняя подготовка
- •Лабораторное задание
- •Варианты задания
- •Контрольные вопросы
- •Теоретическая часть
- •Способы адресации и оптимизация программ
- •Строковые команды
- •Сканирование строки.
- •Загрузка регистра из строки.
- •Сегментная структура программ (структура и образ памяти программы .Exe).
- •Двоично-десятичные числа
- •Лабораторная работа № 2. Организация доступа к дискам в режиме ms dos и анализ системных ошибок.
- •Домашняя подготовка
- •Лабораторное задание
- •Варианты заданий
- •Контрольные вопросы
- •Теоретическая часть
- •Лабораторная работа № 3. Организация прерываний и резидентные программы.
- •Домашняя подготовка
- •Лабораторное задание
- •Контрольные вопросы
- •Варианты задания
- •Теоретическая часть (См. Также разделы 1.3 и 2.4)
- •3Организация прерываний и резидентные программы.
- •Резидентные программы
- •Механизм прерываний
- •Структура и образ памяти программы .Сом
- •Примеры резидентных программ
- •Лабораторная работа № 4. Системное время в компьютерах ibm pc
- •Варианты задания
- •Домашняя подготовка
- •Контрольные вопросы
- •Теоретическая часть
- •4 Системное время в компьютерах ibm pc
- •Измерение частоты при помощи rdtsc
- •Назначение каналов таймера в ibm pc
- •Библиографический список
- •Приложение Функции ms dos для выполнения лабораторных работ
- •Установка вектора прерывания
- •Чтение вектора прерывания
- •Завершение программы
- •Создание файла
- •Закрытие файла
- •Чтение из файла
- •Очистка экрана
- •Дополнительные средства ассемблера
Контрольные вопросы
1 ASCIIZ-строка: назначение, примеры ASCIIZ-строк.
2 Дескриптор файла: для чего предназначен, какими средствами создаётся?
3 Роль флага CF и регистра AX при выполнении операций с файлам.
4 Основные характеристики файла, где MS DOS сохраняет информацию о найденном файле после выполнения операции поиска файла?
5 Что такое PSP и DTA и каким образом эти понятия связаны с предыдущим вопросом?
6 С помощью какой функции MS DOS можно осуществлять операции ввода данных с клавиатуры и чтения из файла?
7 С помощью каких функций MS DOS можно осуществлять вывод данных
на экран?
Теоретическая часть
Язык ассемблера не содержит средства для работы с файлами. Если возникает такая необходимость, то программа должна содержать фрагменты кода, в которых производится обращение к средствам ОС, осуществляющим взаимодействие с файловой системой.
Система функций MS DOS предоставляет пользователю широкие возможности для работы с файлами. Метод работы с файлами в среде MS DOS называется методом описателя или дескриптора. Идея этого метода заключается в следующем:
- в начале файл должен быть открыт, при этом должно быть указано имя файла - либо полное (полный путь), либо краткое. В последнем случае файл берётся из текущего каталога. В конце имени файла должен стоять код «0»;
- после того, как файл был удачно открыт, ему присваивается описатель – двухбайтное число. Дальнейшая работа с файлами будет вестись теперь через этот описатель. В PSP программы, по смещению 18h , находится таблица описателей. Под неё отводиться 20 байт (содержащие FFh соответствуют свободному описателю);
- в конце работы файл следует закрыть.
Следует знать, что признаком ошибки при выполнении функции DOS является единичное состояние флага переполнения – «С».
Таким образом, при открытии или создании файлов, DOS возвращает в регистр AX описатель файла (в англоязычной терминологии – HANDLE). Все последующие операции с данным файлом следует производить с использованием этого описателя. Удобство такого подхода заключается в том, что стандартным устройствам (на этапе инициализации ПК) также присваиваются свои описатели – от 0 до 4:
устройство ввода (клавиатура) – 0;
устройство вывода (экран) – 1;
устройство для вывода ошибок ( обычно экран ) – 2;
последовательный порт (COM1) – 3
печатающее устройство ( LPT1) – 4
Это позволяет легко перенаправить ввод или вывод с одного устройства на другое.
Описатель файла есть лишь некий индекс, по которому можно найти область памяти, выделенную для работы с данным файлом. Эта область памяти необходима для того, чтобы буферизировать ввод и вывод в этот файл, что делает работу с ним более быстрой.
При записи в файл данные записываются сначала в буфер и, если только он переполнен, записываются на диск. Таким образом, значительно увеличивается скорость работы с диском.
При закрытии файла содержимое буфера записи сбрасывается на диск, и далее этот буфер может использоваться для работы с другими файлами. Аналогично работает буферизация при чтении из файла. Из вышесказанного понятно, почему при открытии файла необходимо указывать режим работы с файлом (чтение, запись, чтение/запись). Некоторые функции MS DOS для работы с файлами приведены в приложении.
Для закрепления теоретического материала рассмотрим примеры программ.
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h
Begin: mov ax, 3D00h
mov dx, offset File_name ;DS:DX указывают на путь к файлу
int 21h ;открываем
jc Error_file ;если произошла ошибка (нет такого файла, слишком много открытых файлов, ошибка чтения) – то на метку Error_file
mov Handle, ax ;запомним номер файла в переменной Handle
mov bx,ax
mov ah,3Fh ;функция 3Fh – чтение файла
mov cx, 0FF00h ;будем читать 0FF00h
mov dx, offset Buffer DS:DX указывает на буфер в памяти для чтения
int 21h
mov ah,3Eh ;закрываем файл
mov bx, Handle ;номер файла должен быть в BX
int 21h ;закрываем файл
mov dx, offset Mess_ok
Out_prog:
mov ah,9
int 21h
int 20h ;выходим из программы
Error_file:
mov dx, offset Mess_error
jmp Out_prog
; данные
Handle dw 0
Mess_ok db 'Файл загружен в память! Смотрите в отладчике! $'
Mess_error db 'Не удалось открыть (найти) файл'
File_name db ‘c:\msdos.sys’,0,’!$’
Buffer equ $
CSEG ends
end Begin
; комментарий к строке Buffer equ $
Запомните оператор $. При ассемблировании нашей программы Ассемблер заменит этот знак на адрес, по которому он расположен.
Ниже приводится ещё одна программа, которая поможет уяснить, как обрабатываются операции создания файла, записи в файл и закрытия файла в случае возникновения критической ошибки.
DATA SEGMENT |
||||||
|
BUF DB “0123456789” |
|||||
|
BUFLEN EQU $-BUF |
|||||
|
FILENAME DB 'A:\TEST\MN1_FIL.001',0 |
|||||
|
HANDLE DW ? |
|||||
|
TEXT1 DB 'Жду нажатия клавиши’,13,10,’$ |
|||||
|
TEXT2 DB ‘Файл Создан’,13,10,’$’ |
|||||
|
TEXT3 DB ‘Произошла ошибка’,13,10,’$’ |
|||||
DATA ENDS |
|
|
||||
STK SEGMENT |
STACK ‘STACK’ |
|
||||
|
DW 128 DUP (0) |
|
||||
STK ENDS |
|
|
||||
CODE SEGMENT ‘CODE’ |
|
|
||||
ASSUME |
CS: CODE, DS:DATA, SS:STK |
|
||||
BEGIN: |
MOV AX, DATA |
|
||||
|
MOV DS, AX |
|
||||
;Переустановить вектор 24h |
|
|||||
|
XOR AX, AX |
|
||||
|
MOV ES, AX |
|
||||
|
LEA AX, NEW_24h |
|
||||
|
MOV ES:[24h*4],AX |
|
||||
|
MOV ES:[24h*4+2],CS |
|
||||
|
LEA DX, TEXT1 |
|
||||
|
CALL TOUT |
|
||||
|
CALL INPUT |
;ждём нажатия клавиши |
||||
|
CMP AL ,27 |
;проверка на нажатие ESC |
||||
|
JZ END |
|
||||
;создадим файл |
|
|||||
|
MOV AH, 3Ch |
;функция создания файла |
||||
|
MOV CX, 0 |
;без атрибутов |
||||
|
LEA DX, Filename |
;адрес имени файла |
||||
|
INT 21h |
|
||||
|
MOV HANDLE, AX |
;сохраним описатель файла |
||||
|
LEA DX, TEXT2 |
|
||||
|
CALL TOUT |
|
||||
;запишем строку в файл |
|
|||||
INP: |
MOV AH, 40h |
;функция записи |
||||
|
MOV BX, HANDLE |
;дескриптор в ВХ |
||||
|
MOV CX, BUFLEN |
;число записываемых байт |
||||
|
MOV DX, OFFSET BUF |
;адрес буфера |
||||
|
INT 21h |
|
||||
|
JNC M1 |
|
||||
|
LEA DX, TEXT3 |
|
||||
|
CALL TOUT |
|
||||
|
JMP SHORT INP |
;повторить операцию записи |
||||
;закроем файл |
|
|||||
M1: |
LEA DX, TEXT1 |
|
||||
|
CALL TOUT |
|
||||
|
CALL INPUT |
|
||||
|
MOV AH, 3Eh |
;функция закрытия |
||||
|
MOV BX, HANDLE |
|
||||
|
INT 21h |
|
||||
|
JNC END |
|
||||
|
LEA DX, TEXT3 |
|
||||
|
CALL TOUT |
|
||||
|
JMP SHORT M1 |
;повторить операцию закрытия |
||||
END: |
MOV AX, 4C00h |
|
||||
|
INT 21h |
|
||||
;обработчик прерывания 24h |
|
|||||
NEW_24h PROC |
||||||
|
MOV AL, 1 |
|
||||
|
IRET |
|
||||
NEW_24H ENDP |
|
|||||
;вывод текстовой строки |
|
|||||
TOUT PROC |
|
|
||||
|
MOV AH, 9 |
|
||||
|
INT 21h |
|
||||
|
RET |
|
||||
TOUT ENDP |
|
|
||||
INPUT PROC |
|
|
||||
|
MOV AH, 0 |
|
||||
|
INT 16h |
|
||||
|
RET |
|
||||
INPUT ENDP |
|
|
||||
CODE ENDS |
|
|
||||
END BEGIN |
|
|
Обработчик прерывания INT 24h присваивает AL=1. Это означает, что все операции с файлами обрабатываются одинаково, т.е. повторяются до тех пор, пока не перестанут возникать ошибки (флаг С=1). При других значениях AL операции с файлами обрабатываются по-разному. Это необходимо будет проверить при выполнении данной лабораторной работы.
AL=0 – игнорировать ошибку;
AL=1 – повторить операцию;
AL=2 - снять (завершить через адрес INT 23h);
AL=3 - вернуться в приложение, инициируя сбившуюся функцию;
Следует заметить, что при входе в процедуру обработчик прерывания INT 24h содержит в стеке всю необходимую информацию, чтобы самостоятельно обработать возникшую ситуацию. Структура стека выглядит так:
Адрес возврата в MS DOS (3 слова: IP,CS,Flags). Команда IRET использует эти данные.
Значения регистров перед вызовом INT 21h: АХ,BX,CX,DX,SI,DI,BP,DS,ES.
Адрес возврата к команде INT 21h (3 слова: IP,CS,Flags), т.е. непосредственно в приложение; в регистре флагов – состояние флагов приложения.
Эту информацию можно использовать, чтобы определить сбившуюся функцию (через регистр АН в стеке) и любые параметры (через другие регистры). Кроме того, ваш обработчик INT 24h может восстановить регистры и осуществить возврат непосредственно в прикладную программу.