Главная страница

Emu8086 Запускаем программу Emu8086 и создаём новый файл через меню file new com template (Файл Новый Шаблон файла com). В редакторе исходного кода после этого мы увидим следующее Рис. Создание нового файла в Emu8086


Скачать 251.21 Kb.
НазваниеEmu8086 Запускаем программу Emu8086 и создаём новый файл через меню file new com template (Файл Новый Шаблон файла com). В редакторе исходного кода после этого мы увидим следующее Рис. Создание нового файла в Emu8086
Дата05.04.2018
Размер251.21 Kb.
Формат файлаdocx
Имя файлаEmu8086.docx
ТипДокументы
#40430
страница4 из 10
1   2   3   4   5   6   7   8   9   10

Прерывания


Прерывания можно рассматривать как номер функции. Эти функции делают программирование более легким - вместо написания кода путем печатания символов вы можете просто вызвать прерывание и оно все сделает за вас. Существуют также функции прерываний, которые работают с дисками и другим "железом". Мы называем такие функции программными прерываниями

Прерывания могут быть также вызваны различными устройствами. Такие прерывания называются аппаратными прерываниями. Но сейчас нас интересуют только программные прерывания


Чтобы выполнить программное прерывание, используют командуINT, которая имеет очень простой синтаксис:

INT значение

Где значение может быть числом в диапазоне от 0 до 255 (или от 0 до 0FFh), обычно мы будем использовать шестнадцатиричные числа. Вы можете подумать, что имеются только 256 функций, но это не так. Каждое прерывание может иметь подфункции. Чтобы определить подфункцию, в регистр AH нужно записать ее номер перед вызовом прерывания. Каждое прерывание может иметь до 256 подфункций (таким образом мы получаем 256 * 256 = 65536функций). В основном используется регистр AH, но иногда могут использоваться и другие регистры. Обычно другие регистры используются для записи параметров и данных подфункции.

Следующий пример использует прерывание INT 10h и подфункцию0Eh, чтобы напечатать сообщение "Hello!". Эта функция выводит символ на экран, перемещая курсор и прокручивая экран по необходимости.





#MAKE_COM# ; инструкция компилятора для создания СОМ-файла.
ORG 100h


; Подфункция, которую мы используем
; не изменяет регистр АН после завершения,
; так что мы можем использовать его только один раз


MOV AH, 0Eh ; выбор подфункции.


; Подфункция INT 10h / 0Eh принимает
; в качестве параметра ASCII-код символа,
; который нужно записывать в регистр AL.


MOV AL, 'H' ; ASCII-код: 72
INT 10h ; напечатать его!


MOV AL, 'e' ; ASCII-код: 101
INT 10h ; напечатать его!


MOV AL, 'l' ; ASCII-код: 108
INT 10h ; напечатать его!


MOV AL, 'l' ; ASCII-код: 108
INT 10h ; напечатать его!


MOV AL, 'o' ; ASCII-код: 111
INT 10h ; напечатать его!


MOV AL, '!' ; ASCII-код: 33
INT 10h ; напечатать его!


RET ; вернуться в операционную систему.




Скопируйте и вставьте эту программу в редактор кода Emu8086 и нажмите кнопку [Compile and Emulate]. Запустите ее! 

Список поддерживаемых прерываний с описаниями:

 

INT 10h / AH = 00h - установить видеорежим.
вход:
AL = нужный видеорежим.

Следующие видеорежимы поддерживаются:

00h - Текстовый режим 40x25, 16 цветов, 8 страниц.

03h - Текстовый режим 80x25, 16 цветов, 8 страниц.

 

INT 10h / AH = 01h - установить форму курсора в текстовом режиме.
вход:
CH = вершина курсора (биты 0-4) и опции (биты 5-7).
CL = основание курсора (биты 0-4).

Если биты 6-5 регистра CH установлены в 00, то курсор виден. Чтобы скрыть курсор, установите биты в 01(следующее значение в CH будет скрывать курсор: 28h - 00101000b). Бит 7 должен быть всегда нулем.

Примечание переводчика. Высота курсора - это разность между вершиной и основанием курсора. Т.е. если установить биты 0-4 регистра СН в 00000, а регистра CL - в 11111, то курсор будет высотой в 32 строки (не текстовых строки - а строки экранных). Если установить биты 0-3 регистра СН в 1111, а регистра CL - в 1111, то курсор будет высотой в одну строку и располагаться под буквами. Ну и так далее...

 

INT 10h / AH = 02h - установить позицию курсора.
вход:
DH = строка.
DL = столбец.
BH = номер страницы (0..7).

 

INT 10h / AH = 03h - получить позицию и размер курсора.
вход:
BH = номер страницы.
выход:
DH = строка.
DL = столбец.
CH = вершина курсора.
CL = основание курсора.

 

INT 10h / AH = 05h - выбрать активную видео страницу.
вход:
AL = номер новой страницы (0..7).
активированная страница отображается.

   

INT 10h / AH = 06h - прокрутка окна вверх.
INT 10h / AH = 07h - прокрутка окна вниз.
вход:
AL = количество строк, которые должны быть прокручены (00h = полная очистка окна).
BH = атрибут, используемый для записи строки пробелов в нижней части окна.
CH, CL = строка, столбец - координаты верхнего левого угла окна.
DH, DL = строка, столбец - координаты нижнего правого угла окна.

 

INT 10h / AH = 08h - прочитать символ и атрибут с позиции курсора.

вход:
BH = номер страницы.
выход:
AH = атрибут.
AL = символ.

 

INT 10h / AH = 09h - записать символ и атрибут в позиции курсора.

вход:
AL = символ для вывода на экран.
BH = номер страницы.
BL = атрибут.
CX = сколько раз символ будет выведен на экран.

 

INT 10h / AH = 0Ah - записать символ только в позицию курсора.

вход:
AL = символ для вывода на экран.
BH = номер страницы.
CX = сколько раз символ будет выведен на экран.

 

INT 10h / AH = 0Eh - вывод в режиме телетайпа.

вход:
AL = символ для записи.

Эта функция отображает символ на экране, передвигает курсор и прокручивает экран, если это необходимо. Печать всегда выполняется на текущей видеостранице. 

 

INT 10h / AH = 13h - записать строку.

вход:
AL = режим записи:
    bit 0: не изменять курсор после записи;
    bit 1: строка содержит атрибуты.
BH = номер страницы.
BL = атрибут, если строка содержит только символы (бит 1 регистра AL - ноль).
CX = количество символов в строке (атрибуты не считаются).
DL,DH = столбец, строка - координаты, с которых начинается запись строки.
ES:BP указатель на строку, которая будет напечатана.


 

INT 10h / AX = 1003h - выбрать интенсивность/мерцание.

вход:
BL = режим записи:
    0: включить интенсивность (16 возможных цветов фона).
    1: включить мерцание (не поддерживается эмулятором!).
BH = 0 (чтобы избежать проблем на некоторых адаптерах).

 
Таблица цветов:
Атрибут символа - это 8-ми битовое значение. Младшие четыре бита представляют набор цветов переднего плана, а старшие 4 бита - цвета фона. Мерцание цветов фона не поддерживается.

HEX BIN ЦВЕТ
0 0000 черный

1 0001 синий

2 0010 зеленый

3 0011 бирюзовый

4 0100 красный

5 0101 фиолетовый

6 0110 коричневый

7 0111 светло-серый

8 1000 темно-серый

9 1001 светло-синий

A 1010 светло-зеленый

B 1011 голубой (светло-бирюзовый)

C 1100 ярко-красный

D 1101 малиновый

E 1110 желтый

F 1111 белый

 


INT 11h - получить список оборудования BIOS.
выход:
AX = слово списка оборудования BIOS. Фактически эта функция возвращает содержимое слова в 0040h:0010h.

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

Бит(ы) Описание

15-14 количество параллельных портов.

13 не поддерживается.

12 игровой прот установлен.

11-9 количество последовательных портов.

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

7-6 количество дисководов (минус 1):

00 один дисковод;

01 два дисковода;

10 три дисковода;

11 четыре дисковода.

5-4 видеорежимы:

00 EGA,VGA,PGA, или другой со встроенной видео BIOS;

01 40x25 CGA цвета;

10 80x25 CGA цвета (по умолчанию в эмуляторе);

11 80x25 монохромный текст.

3 не поддерживается.

2 не поддерживается.

1 математический сопроцессор установлен.

0 установлен, если дисковод может быть загрузочным (всегда установлен в эмуляторе).

 


INT 12h - получить размер памяти.
выход:
AX = килобайты смежной памяти, начинающейся с абсолютного адреса 00000h. Возвращает содержимое слова по адресу 0040h:0013h.


Дисководы эмулируются с помощьюфайловFLOPPY_0(..3). 

 


INT 13h / AH = 00h - сброс дисковода (в настоящее время эта функция не работает). 

   


INT 13h / AH = 02h - прочитать сектор диска в память.
INT 13h / AH = 03h - записать сектор на диск.
вход:

AL = количество секторов для чтения/записи (не должно быть нулем)
CH = номер цилиндра (0..79).
CL = номер сектора (1..18).
DH = номер головки (0..1).
DL = номер дисковода (0..3 , зависит от количества файлов FLOPPY_?).
ES:BX указатель на буфер данных.

выход:

CF устанавливается в случае ошибки.
CF очищен, если ошибок нет.
AH = состояние (0 - если все выполнено успешно).
AL = количество переданных секторов. 

Примечание: каждый сектор имеет 512 байтов.

 


INT 15h / AH = 86h - функция ожидания BIOS.

вход:

CX:DX = интервал в микросекундах

выход:

CF сброшен, если операция выполнена успешно (ждет окончания интервала),
CF установлен, если произошла ошибка или функция ожидания уже в работе.


Примечание:

на многих системах разрешение периода ожидания равно 977 микросекундам. Emu8086 использует 1000-микросекундный период.


 


INT 16h / AH = 00h - прочитать следующую нажатую клавишу (без эха).
выход:

AH = скан-код BIOS.
AL = ASCII-символ.
(если клавиша прочитана, она удаляется из буфера клавиатуры).

 


INT 16h / AH = 01h - проверить готовность символа в буфере клавиатуры.
выход:

ZF = 1 если символ не готов.
ZF = 0 если символ готов.
AH = скан-код BIOS.
AL = ASCII-символ.
(если клавиша прочитана, она удаляется из буфера клавиатуры).

 


INT 19h - перезагрузка системы.
Обычно BIOS пытается прочитать сектор 1, головку 0, дорожку 0 с дисковода А: в 0000h:7C00h. Эмулятор просто останавливает выполнение. Для загрузки с дисковода выберите из меню: 'Virtual Drive' -> 'Boot from Floppy'

 


INT 1Ah / AH = 00h - получить системное время.
выход:

CX:DX = количество тиков, начиная с полночи.
AL = 0, если таймер не переполнялся за 24 часа с момента сброса.

Примечания:
Часы обновляются приблизительно 18.20648 раз в секунду,
и 1800B0h за 24 часа. 
AL еще не устанавливается эмулятором!  

MS-DOS все-же не может полностью быть загружен в эмулятор, поэтому я сделал эмуляцию для некоторых основных прерываний DOS:

INT 20h
 - выход в операционную систему.

INT 21h / AH=09h - вывод строки из DS:DX.

INT 21h / AH=0Ah - ввод строки в DS:DX, первый байт - размер буфера, второй байт - количество фактически прочитанных символов.

INT 21h / AH=4Ch - выход в операционную систему.

INT 21h / AH=01h - чтение символа из стандартного устройства ввода с эхом, результат записывается в AL.

INT 21h / AH=02h - запись символа в стандартное устройство вывода, DL = символ для записи. После выполнения AL = DL.
1   2   3   4   5   6   7   8   9   10


написать администратору сайта