Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Что нужно знать для экзамена



?

Функции прерывания DOS INT 21H

Ниже приведены базовые функции для прерывания DOS INT 21H. Код функции устанавливается в регистре AH:

Завершение программы (аналогично INT 20H).

Ввод символа с клавиатуры с эхом на экран.

Вывод символа на экран.

Ввод символа из асинхронного коммуникационного канала.

Вывод символа на асинхронный коммуникационный канал.

Вывод символа на печать (гл.19).

Прямой ввод с клавиатуры и вывод на экран.

Ввод с клавиатуры без эха и без проверки Ctrl/Break.

Ввод с клавиатуры без эха с проверкой Ctrl/Break.

Вывод строки символов на экран.

Ввод с клавиатуры с буферизацией.

Проверка наличия ввода с клавиатуры.

Очистка буфера ввода с клавиатуры и запрос на ввод.

0D

Сброс диска.

Установка текущего дисковода.

0F

Открытие файла через FCB.

Закрытие файла через FCB.

Начальный поиск файла по шаблону.

Поиск следующего файла по шаблону.

Удаление файла с диска.

Последовательное чтение файла.

Последовательная запись файла.

Создание файла.

Переименование файла.

Внутренняя операция DOS.

Определение текущего дисковода.

Установка области передачи данных (DTA).

Получение таблицы FAT для текущего дисковода.

Получение FAT для любого дисковода.

Чтение с диска с прямым доступом.

Запись на диск с прямым доступом.

Определение размера файла.

Установка номера записи для прямого доступа.

Установка вектора прерывания.

Создание программного сегмента.

Чтение блока записей с прямым доступом.

Запись блока с прямым доступом.

Преобразование имени файла во внутренние параметры.

Получение даты (CX-год, DН-месяц, DL-день).

Установка даты.

Получение времени (CH-час, CL-мин, DН-с, DL-1/100с).

2D

Установка времени.

Установка/отмена верификации записи на диск.

2F

Получение адреса DTA в регистровой паре ES: BX.

Получение номера версии DOS в регистре АХ.

Завершение программы, после которого она остается резидентной в памяти.

Проверка Ctrl/Break.

Получение вектора прерывания (адреса подпрограммы).

Получение размера свободного пространства на диске.

Получение государственно зависимых форматов.

Создание подкаталога (команда MKDIR).

ЗА

Удаление подкаталога (команда RMDIR).

Установка текущего каталога (команда CHDIR).

3C

Создание файла без использования FCB.

3D

Открытие файла без использования FCB.

3E

Закрытие файла без использования FCB.

3F

Чтение из файла или ввод с устройства.

Запись в файл или вывод на устройство.

Удаление файла из каталога.

Установка позиции для последовательного доступа.

Изменение атрибутов файла.

Управление вводом-выводом для различных устройств.

Дублирование файлового номера.

«Склеивание» дублированных файловых номеров.

Получение текущего каталога.

Выделение памяти из свободного пространства.

Освобождений выделенной памяти.

Изменение длины блока выделенной памяти.

Загрузка/выполнение программы (подпроцесса).

Завершение подпроцесса с возвратом управления.

4D

Получение кода завершения подпроцесса.

Начальный поиск файла по шаблону.

4F

Поиск следующего файла по шаблону.

Получение состояния верификации.

Переименование файла.

Получение/установка даты и времени изменения файла.

Получение расширенного кода ошибки.

Создание временного файла.

Создание нового файла.

Блокирование/разблокирование доступа к файлу.

Получение адреса префикса программного сегмента (PSP).

?

Порты

Порт представляет собой устройство, которое соединяет процессор с внешним миром. Через порт процессор получает сигналы с устройств ввода и посылает сигналы на устройство вывода. Теоретически процессор может управлять до 65 536 портами, начиная с нулевого порта. Для управления вводом-выводом непосредственно на уровне порта используются команды IN и OUT:

u Команда IN передает данные из входного порта в регистр AL (байт) или в регистр АХ (слово). Формат команды:

IN регистр, порт

u Команда OUT передает данные в порт из регистра AL (байт) или из регистра АХ (слово). Формат команды:

OUT порт, регистр

Номер порта можно указывать статически или динамически:

1. Статическое указание порта возможно при непосредственном использовании значения от 0 до 255:

Ввод: IN AL.порт#; Ввод одного байта

Вывод: OUT порт#, АХ; Вывод одного слова

2. Динамическое указание порта устанавливается в регистре DX от 0 до 65535. Этот метод удобен для последовательной обработки нескольких портов. Значение в регистре DX в этом случае увеличивается в цикле на 1. Пример ввода байта из порта 60Н:

MOV DX, 60H; Порт 60Н (клавиатура)

IN AL, DX; Ввод байта

 

Ниже приведен список некоторых портов (номера в шестнадцатеричном представлении):

Регистры маски прерывании.

40...42

Таймер/счетчик

Ввод с клавиатуры

Звуковой порт (биты 0 и 1)

Управление играми

3B0...3BF

Монохромный дисплей и параллельный адаптер печати

3D0...3DF

Цветной/графический адаптер

3F0...3F7

Дисковый контроллер

В случае, если, например, программа запрашивает ввод с клавиатуры, то она выдает команду прерывания INT 16H. В этом случае система устанавливает связь с BIOS, которая с помощью команды IN вводит байт с порта 60Н.

На практике рекомендуется пользоваться прерываниями DOS и BIOS.

Однако можно также успешно обойтись без BIOS при работе с портами 21, 40...42, 60 и 201.

 

Что нужно знать для семинара

?

Справочник по директивам языка Ассемблера

Индексная адресация памяти

При прямой адресации памяти в одном из операндов команды указывается имя определенной переменной, например для переменной COUNTER:

ADD CX, COUNTER

Во время выполнения программы процессор локализует указанную переменную в памяти путем объединения величины смещения к этой переменной с адресом сегмента данных.

При индексной адресации памяти ссылка на операнд определяется через базовый или индексный регистр, константы, переменные смещения и простые переменные. Квадратные скобки, определяющие операнды индексной адресации, действуют как знак плюс (+). Для индексном адресации памяти можно использовать:

u базовый регистр BX в виде [BX] вместе с сегментным регистром DS или базовый регистр BP в виде [BP] вместе с сегментным регистром SS. Например, с помощью команды:
MOV DX, [BX]; Базовый регистр
в регистр DX пересылается элемент, взятый по относительному адресу в регистре BX и абсолютному адресу сегмента в регистре DS; — индексный регистр DI в виде [DI] или индексный регистр SI в виде [SI], оба вместе с сегментным регистром DS. Например, с помощью команды:

MOV AX, [SI]; Индексный регистр
в регистр AХ пересылается элемент, взятый по относительному адресу в регистре SI и абсолютному адресу сегмента в регистре DS;

u [константу], содержащую непосредственный номер или имя в квадратных скобках. Например, с помощью команды
MOV [BX+SI+4], AX; База+индекс+константа
содержимое регистра АХ пересылается по адресу, который вычисляется, как сумма абсолютного адреса в регистре DS, относительного адреса в регистре BX, относительного адреса в регистре SI и константы 4;

u смещение (+ или -) совместно с индексным операндом. Существует небольшое различие при использовании константы и смещения. Например, с помощью команды:
MOV DX, 8[DI][4]; Смещение+индекс+константа
в регистр DX пересылается элемент, взятый по абсолютному адресу в регистре DS, смещению 8, относительному адресу в регистре DI и константе 4.

Эти операнды можно комбинировать в любой последовательности. Но нельзя использовать одновременно два базовых регистра [BX + BP] или два индексных регистра [DI + SI]. Обычно индексированные адреса используются для локализации элементов данных в таблицах.

Операторы языка ассемблер

Существует три типа ассемблерных операторов: операторы атрибута, операторы, возвращающие значение, и операторы, специфицирующие битовую строку.

Операторы, специфицирующие битовую строку, оператор MASK, счетчик сдвига и оператор WIDTH относятся к директиве RECORD.

Оператор LENGTH

Оператор LENGTH возвращает число элементов, определенных операндом DUP. Например, следующая команда MOV заносит в регистр DX значение 10:

TABLEA DW 10 DUP(? )...

MOV DX, LENGTH TABLEA

В случае, если операнд DUP отсутствует, то оператор LENGTH возвращает значение 01.

 

Оператор OFFSET

Оператор OFFSET возвращает относительный адрес переменной или метки внутри сегмента данных или кода. Оператор имеет следующий формат:

OFFSET переменная или метка

Например, команда

MOV DX, OFFSET TABLEA

устанавливает в регистре DX относительный адрес (смещение) поля TABLEA в сегменте данных. (Заметим, что команда LEA выполняет аналогичное действие, но без использования оператора OFFSET.)

Оператор PTR

Оператор PTR используется совместно с атрибутами типа BYTE, WORD или DWORD для локальной отмены определенных типов (DB, DW или DD) или с атрибутами NEAR или FAR для отмены значения дистанции по умолчанию. Формат оператора следующий:

тип PTR выражение

В поле «тип» указывается новый атрибут, например BYTE. Выражение имеет ссылку на переменную или константу.

Оператор SEG

Оператор SEG возвращает адрес сегмента, в котором расположена указанная переменная или метка. Наиболее подходящим является использование этого оператора в программах, состоящих из нескольких отдельно ассемблируемых сегментов. Формат оператора:

SEG переменная или метка

Примеры применения оператора SEG в командах MOV:

MOV DX, SEG FLOW; Адрес сегмента данных

MOV DX, SEG A20; Адрес сегмента кода

Оператор SHORT

Назначение оператора SHORT — модификация атрибута NEAR в команде JMP, если переход не превышает границы +127 и -128 байт:

JMP SHORT метка

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

 

Оператор SIZE

Оператор SIZE возвращает произведение длины LENGTH и типа TYPE и полезен только при ссылках на переменную с операндом DUP. Формат оператора:

SIZE переменная

Оператор TYPE

Оператор TYPE возвращает число байтов, соответствующее определению указанной переменной:

Определение Число байтов

DB 1

DW 2

DD 4

DQ 8

DT 10

STRUC Число байтов, определённых в STRUC

NEAR метка FFFF

FAR метка FFFE

Формат оператора TYPE:

TYPE переменная или метка

Директивы ассемблера

Директива ASSUME

Назначение директивы ASSUME — установить для ассемблера связь между сегментами и сегментными регистрами CS, DS, ES и SS. Формат директивы:

ASSUME сегментный_регистр: имя [, ... ]

В директиве указываются имена сегментных регистров, групп (GROUP) и выражений SEG.

Одна директива ASSUME может назначить до четырех сегментных регистров в любой последовательности, например:

ASSUME CS: CODESG, DS: DATASG, SS: STACK, ES: DATASG

Для отмены любого ранее назначенного в директиве ASSUME сегментного регистра необходимо использовать ключевое слово NOTHING:

ASSUME ES: NOTHING

В случае, если, например, регистр DS оказался не назначен или отменен ключевым словом NOTHING, то для ссылки к элементу из сегмента данных в командах используется операнд со ссылкой к регистру DS:

MOV AX, DS: [BX]; Использование индексного адреса

MOV AX, DS: FLDW; Пересылка содержимого поля FLDW

Конечно, регистр DS должен содержать правильное значение сегментного адреса.

Директива EXTRN

Назначение директивы EXTRN — информировать Ассемблер о переменных и метках, которые определены в других модулях, но имеют ссылки из данного модуля. Формат директивы:

EXTRN имя: тип [, ... ]

Директива GROUP

Программа может содержать несколько сегментов одного типа (код, данные, стек). Назначение директивы GROUP — собрать однотипные сегменты под одно имя так, чтобы они поместились в один сегмент объемом 64 Кбайт, формат директивы:

имя GROUP имя сегмента [, ... ]

Директива INCLUDE

Отдельные фрагменты ассемблерного кода или макрокоманды могут использоваться в различных программах. Для этого такие фрагменты и макрокоманды записываются в отдельные дисковые файлы, доступные для использования из любых программ. Пусть некоторая подпрограмма, преобразующая ASCII-код в двоичное представление, записана на диске С в файле по имени CONVERT.LIB. Для доступа к этому файлу необходимо указать директиву

INCLUDE C: CONVERT.LIB

причем в том месте исходной программы, где должна быть закодирована подпрограмма преобразования ASCII-кода. В результате Ассемблер найдет необходимый файл на диске и вставит его содержимое в исходную программу. (В случае, если файл не будет найден, то Ассемблер выдаст соответствующее сообщение об ошибке и директива INCLUDE будет игнорирована.) Для каждой вставленной строки Ассемблер выводит в LST-файл в 30-й колонке символ С (исходный текст в LST-файле начинается с 33-й колонки).

Директива LABEL

Директива LABEL позволяет переопределять атрибут определенного имени.

Формат директивы:

имя LABEL тип

 

В качестве типа можно использовать BYTE, WORD или DWORD для переопределения областей данных или имен структур или битовых строк.

Директивой LABEL можно переопределить выполнимый код, как NEAR или FAR.

Эта директива позволяет, например, определить некоторое поле и как DB, и как DW.

Директива NAME

Директива NAME обеспечивает другой способ назначения имени модулю:

NAME имя

Ассемблер выбирает имя модуля в следующем порядке:

1) если директива NAME присутствует, то ее операнд становится именем модуля;

2) если директива NAME отсутствует, то Ассемблер использует первые шесть символов из директивы TITLE;

3) если обе директивы NAME и TITLE отсутствуют, то именем модуля становится имя исходного файла.

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

Директива ORG

Для определения относительной позиции в сегменте данных или кода Ассемблер использует адресный счетчик.

Начальное значение адресного счетчика — 00. Для изменения значения адресного счетчика и соответственно адреса следующего определяемого элемента используется директива ORG. Формат директивы:

ORG выражение

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

Директива PROC

Любая процедура представляет собой совокупность кодов, начинающуюся директивой PROC и завершающуюся директивой ENDP. Обычно эти директивы используются для подпрограмм в кодовом сегменте. Ассемблер допускает переход на процедуру с помощью команды JMP, но обычной практикой является использование команды CALL для вызова процедуры и RET для выхода из процедуры.

Процедура, находящаяся в одном сегменте с вызывающей процедурой, имеет тип NEAR:

имя-процедуры PROC [NEAR]

В случае, если операнд опущен, то Ассемблер принимает значение NEAR пo умолчанию.

В случае, если процедура является внешней по отношению к вызывающему сегменту, то ее вызов может осуществляться только командой CALL, а сама процедура должна быть объявлена как PUBLIC. Более того, если в вызываемой процедуре используется другое значение ASSUME CS, то необходимо кодировать атрибут FAR:

PUBLIC имя-процедуры, имя-процедуры PROC FAR

При вызове любой процедуры с помощью команды CALL необходимо обеспечить возврат по команде RET.

Директива PUBLIC

Назначение директивы PUBLIC — информировать ассемблер, что на указанные имена имеются ссылки из других ассемблерных модулей. Формат директивы:

PUBLIC имя [,...]

Директива RECORD

Директива RECORD позволяет определять битовые строки. Одно из назначений этой директивы — определить однобитовые или многобитовые переключатели. Формат директивы:

имя RECORD имя-поля: ширина [=выражение] [, ... ]

Имя директивы и имена полей могут быть любыми уникальными идентификаторами. После каждого имени поля следует двоеточие (: ) и размер поля в битах, которое может быть от 1 до 16 бит.

Любой размер поля до 8 бит представляется восемью битами, а от 9 до 16 бит — представляется шестнадцатью битами, выровненными справа (если необходимо).

Дополнительно к директиве RECORD имеются операторы WIDTH, MASK и фактор сдвига. Использование этих операторов позволяет изменять определение директивы RECORD без изменения команд, которые имеют ссылки на директиву RECORD.

Оператор WIDTH

Оператор WIDTH возвращает число битов в директиве RECORD или в одном из ее полей.

Фактор сдвига

Прямая ссылка на элемент в RECORD, например:

MOV CL, BIT2

в действительности не имеет отношения к содержимому BIT2. Вместо этого Ассемблер генерирует непосредственный операнд, который содержит «фактор сдвига», помогающий изолировать необходимое поле. Непосредственное значение представляет собой число, на которое необходимо сдвинуть BIT2 для выравнивания справа.

Оператор MASK

Оператор MASK возвращает «маску» из единичных битовых значений, которые представляют специфицированное поле, иными словами, определяют битовые позиции, которые занимает поле.

Выравнивание

Операнд выравнивания определяет начальную границу сегмента, например

PAGE = xxx00

PARA = хххх0 (граница по умолчанию)

WORD = ххххe (четная граница)

BYTE = ххххх

где х — любая шестнадцатеричная цифра, е — четная шестнадцатеричная цифра.

Объединение

Операнд объединения указывает способ обработки сегмента, при компоновке:

u NONE: Значение по умолчанию. Сегмент должен быть логически отделен от других сегментов, хотя физически он может быть смежным. Предполагается, что сегмент имеет собственный базовый адрес;

u PUBLIC: Все PUBLIC-сегменты, имеющие одинаковое имя и класс, загружаются компоновщиком в смежные области. Все такие сегменты имеют один общий базовый адрес;

u STACK: Для компоновщика операнд STACK аналогичен операнду PUBLIC. В любой компонуемой программе должен быть определен по крайней мере один сегмент STACK. В случае, если объявлено более одного стека, то стековый указатель (SP) устанавливается на начало первого стека;

u COMMON: Для сегментов COMMON с одинаковыми именами и классами компоновщик устанавливает один общий базовый адрес. При выполнении происходит наложение второго сегмента на первый. Размер общей области определяется самым длинным сегментом;

u AT-параграф: Параграф должен быть определен предварительно. Данный операнд обеспечивает определение меток и переменных по фиксированным адресам в фиксированных областях памяти, таких, как ROM или таблица векторов прерываний в младших адресах памяти.

Класс

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

Типичными примерами являются классы 'STACK' и 'CODE'.

Директива STRUC

Директива STRUC обеспечивает определение различных полей в виде структуры. Данная директива не поддерживается в малом ассемблере ASM.

Формат директивы:

Имя-структуры STRUC...

[определение полей данных]...

Имя-структуры ENDS

Структура начинается собственным именем в директиве STRUC и завершается таким же именем в директиве ENDS.

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

Правильными операторами определения полей являются DB, DW, DD и DT с указанием имен или без них.

 

 

?


Поделиться:



Популярное:

  1. I.4. СЕМЬЯ И ШКОЛА : ОТСУТСТВИЕ УСЛОВИЙ ДЛЯ ВОСПИТАНИЯ
  2. II. Ассистивные устройства, созданные для лиц с нарушениями зрения
  3. II. Порядок представления статистической информации, необходимой для проведения государственных статистических наблюдений
  4. III. Защита статистической информации, необходимой для проведения государственных статистических наблюдений
  5. III. Перечень вопросов для проведения проверки знаний кандидатов на получение свидетельства коммерческого пилота с внесением квалификационной отметки о виде воздушного судна - самолет
  6. MS Excel. Знак, указывающий что число не вмещается в ячейку
  7. P.S., где рассказывается о том, что было услышано 16 февраля 1995 г., во второй половине седьмого дня нашего отступления.
  8. Past Simple переводится глаголами несовершенного вида, прошедшего времени (что делал?).
  9. Qt-1 - сглаженный объем продаж для периода t-1.
  10. V Методика выполнения описана для позиции Учителя, так как Ученик находится в позиции наблюдателя и выполняет команды Учителя.
  11. V. Порядок разработки и утверждения инструкций по охране труда для работников
  12. VI. СЕКСУАЛЬНАЯ ЭНЕРГИЯ. ЦЕНТРЫ НАСЫЩЕНИЯ. ЧТО ЖЕ ЭТО ТАКОЕ, «СЕКСУАЛЬНАЯ РЕВОЛЮЦИЯ»


Последнее изменение этой страницы: 2017-03-08; Просмотров: 799; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.077 с.)
Главная | Случайная страница | Обратная связь