Приложение 5. Форматы машинных команд.

Здесь кратко представлены форматы команд микропроцессора Intel на двоичном уровне. Более подробно с ними можно познакомиться в [2, 4, 6]. Семь возможных форматов команд представлены ниже на рисунке.

Введены следующие обозначения:

код операции REG - регистр MOD-режим R/M - регистр или память DISP - смещение

- непосредственные данные.

КОР от 1 до байт

КОР

REG

КОР 11

REG I I

R/M I I от 1 до 2 байт

КОР

MOD

REG

I_I

R/M

I_I

KOP

MOD

I

REG J_I

R/M

J_L

DISP

от 1 до 4 байт

КОР

11

КОР

_i__l

R/M

DATA

от 1 до 4 байт

КОР

MOD

КОР

_L_L

R/M

_j_l

DISP

DATA

Ниже приводятся примеры на каждый из форматов.

1) . NOP 90H

90Н - КОР

HLT F4H F4H - КОР

2) . INC AX 40H

01000В - КОР 000В     - АХ (REG)

DEC AX 48H 01001В - КОР 000В    -АХ (REG)

INC BX 43H

01000В - КОР

011В      - BX (REG)

DEC BX 4BH 01001В - КОР.

011В    - BX (REG)

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

3) .  MOV АХ,ВХ ' 89D8H

89Н - КОР 11

011 - BX (REG) 000 - АХ (R/M)

ADD АХ,СХ 01C8H

01Н     - КОР ■ ■ ■

11В

001В     -   СХ (REG)

000В     -  АХ (R/M)

4) .  MOV BX,  [SI] 8B1CH

8ВН - КОР 00В    - MOD

011В - BX (REG)

100В   -    [SI] (R/M)

mov ах, [di] 8b05h 8вн  - кор 00в - mod 000в - ах (reg) 101в -   [di] (r/m)

jmp   [si] ff24h ffh - кор 00в - mod 100в - reg

100в - (r/m)

5) .   add АХ, [ЮбН] 03060601н

озн   - кор

00В    - mod 000в   - ах (reg) нов  - r/m 060ш     -  disp (106н)

6) .   sub bx,43a4h 81ева443н

81н - кор 11в

101в - кор

011в - вх (r/m)

а443н  -   data (43a4h)

7) .mov   [12А7Н] , 3456Н с706а7125634

с7   - кор 00В - mod 000в - кор нов - r/m а712н  - disp 5634Н - data

После представленных схем и примеров читатель, я думаю, без труда сможет ра­зобрать любую команду на отдельные поля.

Представленный материал не является необходимым при программировании на языке ассемблера. Транслятор делает все сам. Лишь при написании очень специфи­ческих программ, связанный с самомодификацией кода программы, эта информация может Вам пригодиться.

Приложение 6. прерываний (кроме вызовов

функций BIOS и DOS).

Список векторов

Данная информация взята автором из различных компьютерных источников. Бо­лее полную информацию о векторах прерываний можно получить в известном элект­ронном справочнике INTER, где собран столь огромный объем информации, что при­ходится только удивляться. На устаревшую информацию, представленную в данном приложении, смотрите как на исторический экскурс.

INT 0 - деление на ноль.

Прерывание через вектор 0 генерируется процессором в ситуации, когда результат выполнения инструкции DIVhjih ЮГУ не помещается в регистр или ячейку памяти, а также при попытке деления 0. BIOS устанавливает пустой обработчик прерывания О, возвращающий управление следующей инструкции процессора. При загрузке MS DOS устанавливается другой обработчик INTO. Он выводит на экран сообщение "Де­ление на ноль" и возвращает управление MS DOS. Обычно MS DOS прекращает вы­полнение прикладной программы, вызвавшей это прерывание.

Замечание: в компьютерах на основе микропроцессоров Intel 80286 и выше обра­ботчик ШТ 0, аналогичный обработчику MS DOS, устанавливается BIOS, поскольку эти микропроцессоры при прерывании 0 загружают в стек адрес инструкции DIV (IDIV), а не адрес следующей инструкции.

INT 1 - режим пошагового выполнения программы.

Прерывание через вектор 1 генерируется после выполнения любой инструкции в тех случаях, когда флаг TF процессора установлен в 1. Флаг TF сбрасывается любым прерыванием, так что обработчик пошагового режима не будет сам выполняться в этом режиме, но после выхода из него TF будет вновь установлен.

BIOS устанавливает пустой обработчик INT 1, так что установка флага TF приве­дет лишь к (значительному) замедлению выполнения программы. MS DOS не изменя­ет и не использует но это прерывание используется в большинстве отладчиков, в частности, в отладчике DEBUG MS DOS.

INT 2 - немаскируемое прерывание.

Прерывание генерируется при выполнении некоторых зависящих от модели ком­пьютера условий, обычно связанных с ошибками. Во многих моделях компьютеров немаскируемое прерывание генерируется при сбоях памяти. В некоторых моделях это прерывание используется для сигналов процессору от арифметического сопроцессо­ра. Обработчик прерывания 2, устанавливаемый BIOS, зависит от модели компьюте­ра. В старых советских компьютерах "Искра-1030", где немаскируемое прерывание связано с ошибками памяти, на экран выводилось сообщение "НП", и процессор вхо­дил в бесконечный цикл. В других компьютерах сообщение может содержать адрес ячейки памяти, вызвавшей ошибку.

MS DOS не изменяет и не использует обработчик немаскируемого прерывания, однако выполняемые под управлением MS DOS программы, распознающие и' исполь­зующие арифметический сопроцессор, могут устанавливать собственные обработчи­ки INT 2 для его поддержки.

Прерывание 2 - единственное прерывание, которое нельзя замаскировать очист­кой флага IF процессора (инструкцией CLI). Во многих компьютерах предусмотрен специальный порт (см. главу 26) для маскирования этого прерывания.

Замечания:

немаскируемое прерывание присоединялось к прерыванию от клавиату­ры.

2. В исключая модель 30, немаскируемое прерывание выдавало на эк­ран один из четырех кодов ошибки:

И 0 - сбой памяти на системной плате;

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

112-тайм-аут сторожа (Watchdog) - обнаружено прерывание от некоторого тай­мера, мешающее работе системы;

113 - тайм-аут шины НДП - некоторое устройство пытается захватить шину данных больше, чем на 7.8 мксек.

3. В PC Convertible немаскируемое прерывание присоединялось к прерываниям от клавиатуры, устройств, часов и вызывалось проверкой канала вво­да-вывода.

4. В системах с сопроцессором 8087 ошибка сопроцессора вызывает немаскируе­мое прерывание.

В системах с сопроцессором 80287 или 80387 ошибка сопроцессора вызывает прерывание через линию IRQ 13; обработчик этого прерывания для совмести­мости вызывает прерывание 2.

5. Если пользователь хочет обрабатывать немаскируемые прерывания от сопро­цессора, то он должен обрабатывать и другие ошибки. В частности, если при выполнении обработчика немаскируемого прерывания происходит ошибка не­маскируемого прерывания, то управление должно быть передано системному обработчику INT 2.

INT 3 - точка прекращения.

Длявызова прерывания 3 предусмотрена специальная инструкция процессора INT3, отличающаясяотдругихинструкцийГ^

многим отладчикам (вчастности, DEBUG) использовать прерывание Здляустановки точки прекращенияпро1раммы.Сп-ладчикзаменяет байт инструкции в точке прекращения байтом инструкции       и восстанавливает    при достижении точки прекращения.

BIOS устанавливает пустой обработчик INT 3, который не заменяется и не ис­пользуется MS DOS.

6. Список векторов прерываний

INT 4 - арифметическое переполнение.

Прерывание через вектор 4 вызывается специальной инструкцией INTO, если при ее выполнении установлен в 1 флаг OF процессора. Оно может быть также вызвано обычной инструкцией прерывания (INT4) независимо от состояния OF.

BIOS устанавливает пустой обработчик INT 4, который не заменяется и ' не ис­пользуется MS DOS. Многие программы, в частности, компиляторы и программы, ими генерируемые, устанавливают собственные обработчики INT4, сигнализирую­щие об арифметическом переполнении.

INT 5 - печать экрана.

Прерывание 5 устанавливается BIOS ПП ЭВМ любой модели на выполнение фун­кции печати экрана. При выполнении этого прерывания, которое может быть вызвано инструкцией INT 5 программы или нажатием специальной клавиши или комбинации клавиш на клавиатуре компьютера, содержимое экрана выводится на устройство пе­чати LPT1.

Вызов INT 5 не требует и не возвращает никакой информации в регистрах процес­сора, но устанавливает код состояния печати экрана в байте памяти с адресом 0000:0500Н:

ООН - функция не вызвана или завершена;

01Н - функция выполняется;

OFFH - обнаружена ошибка при выполнении функции (обычно устройство печати выключено).

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

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

MS DOS не заменяет обработчик прерывания 5, но команда MS DOS GRAPHICS устанавливает резидентный обработчик, позволяющий копировать графический экран. Печать экрана прекращается

INT 8 - прерывание от системного таймера.

Через вектор 8 выполняется аппаратное прерывание (IRQ 0), активируемое сис­темным таймером 18.2 раза в секунду (примерно через 55 мсек). BIOS устанавливает

обработчик прерывания, который:

- инкрементирует счетчик прерываний от системного таймера; декрементирует счетчик времени до выключения двигателя уст­ройств;

- генерирует прерывание 1СН.

Счетчик прерываний от системного таймера хранится в формате длинного целого (32 бита, младшее слово предшествует старшему) в ячейке памяти по адресу 0000:046СН. Когда содержимое счетчика достигнет значения, соответствующего 24 часам, то оно сбрасывается в 0, а в байте с адресом 0000:0470 устанавливается флаг этого события.

Счетчик времени до выключения двигателя дискетных устройств устанавливает­ся в значение, обычно соответствующее двум секундам, после выполнения любой опе­рации доступа кдискете. Каждое прерывание от системного таймерадекрементирует счетчик до тех пор, пока он не сбросится в 0. B этот момент двигатель дискетных устройств будет выключен. Счетчик времени до выключения двигателя располагается в слове по адресу 0000:0440.

Прерывание резервируется для прикладных программ, желающих использо­вать системный таймер для своих целей.

MS DOS не заменяет обработчик прерывания 8.

INT 9 - прерывание от клавиатуры.

Контроллер клавиатуры генерирует запрос на прерывание 9 (IRQ 1) всякий раз, когда нажимается или отпускается какая-либо клавиша. Если какая-либо клавиша, исключая некоторые регистровые клавиши, остается нажатой более сек, то кон­троллер выдает повторные прерывания как бы по новому ее нажатию каждые 0.Е сек. Контроллер содержит внутренний буфер, способный хранить информацию о несколь­ких (обычно о двадцати) клавиатурных действиях, при переполнении внутреннего

буфера информация теряется.

BIOS устанавливает вектор 9 на адрес обработчика клавиатурных прерываний, ко­торый принимает и удаляет из внутреннего буфера клавиатуры код нажатия иди отпус­кания клавиши (скан-код) и преобразует его в код символа по следующим правилам:

Е Если нажата клавиша, которой соответствует какой-либо символ кода, то скан-код клавиши и код символа размещаются в буфере. Буфер клавиатуры длиной 32 байта располагается в области памяти, начиная с адреса 0000:041 ЕН, и представляет собой кольцевой буфер. Указатель конца буфера (т.е. указатель свободной памяти в буфере) располагается в слове по адресу После приема знака указатель буфера

увеличивается 2, и если он начинает указывать за пределы буфера, то устанавлива­ется на начало. Bырабатываемый код символа зависит от состояния регистров клави­атуры.

2. Если нажата или отпущена регистровая клавиша, то в буфер не заносится ника­кой информации, а изменяются байты состояния регистров клавиатуры 0000:0417Н и 0000:0418Н. Из регистровых клавиш высший приоритет имеет клавиша Alt, затем Ctl и, наконец, клавиша перехода на верхний регистр Shift. Соответствующие состояния устанавливаются только на время, пока нажата регистровая клавиша, и сбрасываются при ее отпускании. Остальные регистровые клавиши - CapsLock, Num Lock, Scroll Lock - действуют как триггеры: каждое нажатие переключает соответствующее состо­яние. Регистр Shift действует только на алфавитные клавиши, набор которых зависит от текущей установки алфавита (состояния РУС/ЛАТ), инвертируя для них смысл на­жатой клавиши перехода на верхний регистр. Регистр Num Lock аналогично действу-

Приложение 6. Список векторов

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

3. Последовательность нажатий цифровых клавиш в состоянии Alt рассматрива­ется как поступление десятичных цифр кода одного символа и сохраняется в драйве­ре. При отпускании клавиши Alt остаток отделенияна256 введенного числа помеща­ется в буфер вместе со скан-кодом 0.

4. Нажатие клавиши Del в состоянии Alt+Ctrl (т.е. при одновременно нажатых кла­вишах Alt и Ctrl) вызывает системный сброс: флаг сброса - слово по адресу 0000:0472 -устанавливается в и управление передается на тесты самопроверки. Поскольку флагклавиатурного сброса установлен, то при выполнении тестов обходятся тесты ОЗУ.

5. Нажатие клавиши Num lock в состоянии (т.е. вместе с) Ctrl приостанавливает

выполнение любой программы до нажатия какой-либо клавиши.

6. Нажатие клавиши Print Screen на верхнем регистре вызывает прерывание 5, т.е. вывод на печать копии экрана.

7. Нажатие клавиши Scroll Ьоскв состоянии Ctrl вызывает прерывание ШН(Вгеак).

8. Отпускание любой клавиши, кроме некоторых регистровых, игнорируется.

Для AT, PC Convertible, System/2 и некоторых моделей XT (BIOS 1986 г.) перед выполнением системного сброса вызывалась функция (АН)=85Н прерывания 15Н, чтобы информировать систему о подготовленном сбросе. Крометого, клавиатурное прерывание может вызывать прерывание 15Нс (АХ) = 9102Н, чтобы сообщить систе­ме о наличии знака в буфере.

В некоторых моделях компьютеров (включая перечисленные выше) BIOS обеспе­чивает возможность преобразования скан-кодов клавиш перед размещением их в бу­фере. Для этого после приема каждого знака от клавиатуры вызывается функция (АН) = 4FH прерывания       позволяющая перекодировать байт, принятый от клавиатуры

(из порта 60Н).

INT 19H - прерывание начальной загрузки.

Прерывание вызывает чтение с дискового устройства первого сектора дорож­ки 0 на стороне 0. Сектор считывается в ОЗУ с адреса 7СОО:0, и байт по этому адресу получает управление. Прежде всего выполняется попытка считать сектор с первого дискетного устройства (INT 13Н с (DL) = 0), при неудаче - с первого жесткого диска (INT 13Н с (DL) = 80Н). Если и эта попытка оказывается неудачной, то выполняется прерывание INT 18, вызывающее в некоторых компьютерах кассетный Бейсик.

INT 1ВН - прерывание прекращения.

Прерывание 1ВН вызывается при нажатии комбинации клавиш Ctrl-Break (см. главу 9). BIOS инициирует обработчик этого прерывания, помещающий в буфер клавиату­ры специальный код (АН) = 03, (AL) = 0. MS DOS устанавливает свой обработчик прерывания прекращающий выполнение программы, вызвавшей это прерыва­ние. Пользователь может установить собственный обработчик (некоторые утилиты MS DOS делают это).

INT 1CH - обработчик пользователя прерываний от таймера.

Прерывание 1СН вызывается из обработчика прерываний от системного таймера (INT 8) при каждом прерывании. BIOS устанавливает пустой обработчик прерывания 1 СН; пользователь может заменять его для своих целей.

INT 1EH - указатель таблицы параметров дискеты.

BIOS устанавливает вектор 1ЕН на адрес в ПЗУ таблицы параметров дискетного устройства (см. главу 14).

INT 40H - функции дискетных устройств.

В компьютерах, снабженных жесткими дисками, драйвер BIOS жестких дисков переустанавливает вектор прерывания 13Н так, чтобы поддерживать через этот век­тор запросы к диску любого типа. Адрес обработчика запросов к дискете сохраняется в векторе 40Н. Не рекомендуется ссылаться к этому вектору, за исключением случая, когда нужно получить адрес обработчика дискетных функций в ПЗУ BIOS.

INT 41H - указатель таблицы параметров жестких дисков.

В большинстве компьютеров таблицы параметров жестких дисков расположены в ПЗУ. Это сделано для того, чтобы можно было загружать операционную систему с жесткого диска любого типа. Типы установленных дисков обычно отображаются пе­реключателями конфигурации, но некоторые адаптеры могут получать тип от устрой­ства. Во всех случаях после инициализации BIOS вектор прерывания 41Н устанавли­вается на таблицу параметров жесткого диска (если в системе есть жесткие диски). В большинстве компьютеров вектор указывает на начало таблицы в ПЗУ, а конкретный набор параметров выбирается на основании переключателей конфигурации, но в не­которых компьютерах (IBM AT, System/2) этот вектор устанавливается на таблицу па­раметров диска, фактически подключенного как жесткий диск 0. В этих компьютерах вектор 46Н указывает на таблицу параметров жесткого диска   если он подключен.

Параметры жесткого диска представляются структурой, приведенной в следую-

щейтаблице.

адрес

длина

параметр

0

слово

максимальный номер цилиндра

2

байт

максимальный номер головки

3

слово

цилиндр начала уменьшения тока записи

б

слово

цилиндр начала предкомпенсации записи

7

байт

наибольшая длина пакета исправимой ошибки чтения