Академический Документы
Профессиональный Документы
Культура Документы
А$$етЫег
для ОО,
У т4о\$
и омх
Издание второе,
исправленное и дополненное
Зубков
Сергей Владимирович
т Мнь
излательство
Москва, 2000
ББК 32.973.26-018.1
391
Зубков С. В.
391 АззетЫет для О$, УЯо4о\з и ОМХ. - М.: ДМК Пресс, 2000. - 608 с.: ил.
(Серия «Для программистов»).
15ВМ 5-94074-003-0
В книге освещаются все аспекты современного программирования на ассембле-
ре для 2О$, УЙпдо\$ 95/МТ и ОМХ (Зоапз, Гацах и ЕгееВЗЬ), включая созда-
ние резидентных программ и драйверов, прямое программирование периферий-
ных устройств, управление защищенным режимом и многое другое. Детально
рассматривается архитектура процессоров Пие! вплоть до Репйит Ш. Все главы
иллюстрируются подробными примерами работоспособных программ.
Издание ориентировано как на профессионалов, так и на начинающих без опыта
программирования.
ББК 32.973.26-018.1
Все права защищены. Любая часть этой книги не может быть воспроизведена
в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения
владельцев авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но, поскольку вероятность на-
личия технических и просто человеческих ошибок все равно существует, издательство не может
гарантировать абсолютную точность и правильность приводимых сведений. В связи с этим из-
дательство не несет ответственности за возможные ошибки, связанные с использованием книги.
Заключение .......................
ии иилилиьнлииниинининниий 558
Приложение 1. Таблицы символов ....................... ии 559
1. Символы АЗСИ ......... НИ 559
2. Управляющие символы АЗСИ .............
зи лиииаиниянияиниченине 560
3. Кодировки второй половины АЗСИ .................. еее: 561
4. Коды символов расширенного АЗСИ ................... нение. 564
5. Скан-коды клавиатуры ................ линии 565
76543210
Рис. 1. Байт
16 | |1] |1 Предварительные сведения `
принимать до 2 = 65 536 разных значений. Слова используют для представле-
ния целых чисел без знака со значениями 0-65 535 (тип ипзепе4 зВогё в С), це-
лых чисел со знаком от —32 768 до +32 767 (тип зВогё шё в С), адресов сегментов
и смещений при 16-битной адресации. Два слова подряд образуют двойное слово,
состоящее из 32 бит, а два двойных слова — одно учетверенное слово (64 бита).
Байты, слова и двойные слова — основные типы данных, с которыми мы будем
работать.
15 87 0
Рис. 2. Слово
> 00005
00015
00105
00116
01006
01016
01105
01115
10005
ю®хю
аьрьроютю
чо 10016
10105
10116
11005
1101Ь
11105
11116
ен
оплпьотл-Ъо 100006
Проверим, что число на самом деле —150: сумма с +150 должна быть равна
нулю:
+150 + (-150) = 00961 + ОРЕбАН = 100008
ОАМОО=0 = ОХОВ
0 =0
О АМО 1 =0 = 0 ХОВ 1=1
ТАМРО=О = 1 ХОН
0 =1
1 АМ 1 =1 = 1 ХОВ 1=0
т ПО ЕТ
АХ
31 16 15 87 0
вх
|=)
ОХ |= |) |
"|
ЕЗГ
ВОТ
.
ЕВР
ЕЗР
@® В реальном режиме селектор каждого сегмента равен адресу его начала, де-
ленному на 16. Чтобы получить адрес в памяти, 16-битное смещение скла-
дывают с этим селектором, предварительно сдвинутым влево на 4. Таким
образом, оказывается, что максимальный доступный адрес в реальном ре-
жиме 2* — 1 = 1048 575. Для сравнения: в защищенном режиме адрес нача-
ла для каждого сегмента хранится отдельно, так что возможно 2% (64 Тб)
различных логических адреса в формате сегмент:смещение (программа оп-
ределяет до 16 383 сегментов, каждый из которых до 4 Гб), хотя реально
процессор адресуется только к 4 или 64 (для Репнит Рго) Гб памяти.
В отличие от Б$, Е$, С$, Е$, которые называются регистрами сегментов дан-
ных, С5 и 55 отвечают за сегменты двух особенных типов -— сегмент кода и сегмент
стека. Первый содержит программу, исполняющуюся в данный момент, следова-
тельно, запись нового селектора в этот регистр приводит к тому, что далее будет
исполнена не следующая по тексту программы команда, а команда из кода, нахо-
дящегося в другом сегменте, с тем ‘же смещением. Смещение очередной выпол-
няемой команды всегда хранится в специальном регистре.ЕТР (указатель инст-
рукции, 16-битная форма ГР), запись в который также приведет к тому, что далее
будет исполнена какая-нибудь другая команда. На самом деле все команды пере-
дачи управления — перехода, условного перехода, цикла, вызова подпрограммы
ит. п. — и осуществляют эту самую запись в С$ и ЕР.
2.1.3. Стек
Стек — организованный специальным образом участок памяти, который ис-
пользуется для временного хранения переменных, передачи параметров вызыва-
емым подпрограммам и сохранения адреса возврата при вызове процедур и пре-
рываний. Легче всего представить стек в виде стопки листов бумаги (это одно из
значений слова «5(асК» в английском языке) — вы можете класть и забирать листы
только с вершины стопки. Поэтому, если записать в стек числа 1, 2, 3, то при чте-
нии они окажутся в обратном порядке - 3, 2, 1. Стек располагается в сегменте па-
мяти, описываемом регистром 5$, и текущее смещение вершины стека отражено
#
Регистры процессора — | 23
в регистре Е$Р, причем во время записи значение этого смещения уменьшается.
то есть он «растет вниз» от. максимально возможного адреса (см. рис. 4). Такое
расположение стека «вверх ногами» может быть необходимо, к примеру, в бес-
сегментной модели памяти, когда все сегменты, включая сегменты стека и кода,
занимают одну итту же.область — память. целиком. Тогда программа исполняет-
ся в нижней области памяти, в области малых адресов, и ЕР растет, а стек распо-
лагается в верхней области памяти, и Е$Р уменьшается.
При вызове подпрограммы параметры в большинстве случаев помещают в стек,
ав ЕВР записывают текущее значение ЕЗР. Если подпрограмма использует стек
для хранения локальных переменных, Е5Р изменится, но ЕВР можно будет ис-
пользовать для того, чтобы считывать значения параметров напрямую из стека
(их смещения занишутся как ЕВР + номер параметра). Более подробно вызовы
подпрограмм и все возможные способы передачи параметров рассмотрены в раз-
деле 5.2.1
Дно стека
ОРЕЕЕЕЕЕСВ
ОРЕЕЕЕРЕЗВ
Параметры-
ОЕРЕРЕРЕДЬ
ОЕЕЕЕЕЕЕОВ == _—— ЕВР=0ЕЕЕЕЕЕРОВ
ОЕЕЕРЕРЕСЬ
Локальные переменные
ОРЕРЕЕЕЕВВ
ОЕЕЕЕЕРЕДВ < ЕЗР=ОЕЕЕРЕЕАВ
| Рис. 4. Стек
Гоеаоея оо [ее 52
15 : | |
Рис. 5. Регистр флагов ЕЕАС$
РИМИШИШШИИ | Процессоры Не]! в реальном режиме
если требуется заем (при вычитании), в противном случае - в 0. Например,
после сложения слова ОЕЕЕЕК и 1, если регистр, в который надо поместить
результат, — слово, в него будет записано 0000 и флаг СЕ = 1..
ОРЕ - флаг четности. Устанавливается в 1, если младший байт результата
предыдущей команды содержит четное число битов, равных 1, ив 0, если
нечетное. Это не то же самое, что делимость на два. Число делится на два
без остатка, если его самый младший бит `равен нулю, и не делится, когда он
равен 1.
ОСАЕ-— флаг полупереноса или вспомогательного переноса. Устанавливается
в 1, если в результате предыдущей операции произошел перенос (или заем)
из третьего бита в четвертый. Этот флаг используется автоматически коман-
дами двоично-десятичной коррекции.
о 7Е - флаг нуля. Устанавливается в 1, если результат предыдущей команды —
НОЛЬ. |
О5Е- флаг знака. Он всегда равен старшему биту результата.
ОТЕ- флаг ловушки. Он был предусмотрен для работы отладчиков, не ис-
пользующих защищенный режим. Установка его в 1 приводит к тому, что
после выполнения каждой программной команды управление временно пере-
дается отладчику (вызывается прерывание 1 - см. описание команды 1МТ).
ОТЕ - флаг прерываний. Сброс этого флага в 0 приводит к тому, что процессор
перестает обрабатывать прерывания от внешних устройств (см. описание ко-
манды ПМТ). Обычно его сбрасывают на короткое время для выполнения
критических участков кода.
орЕ - флаг направления. Он контролирует поведение команд обработки
строк: когда он установлен в 1, строки обрабатываются в сторону уменьше-
ния адресов, когда ОЕ = 0 — наоборот.
СОР - флаг переполнения. Он устанавливается в 1, если результат предыду-
щей арифметической операции над числами со знаком выходит за допусти-
мые для них пределы. Например, если при сложении двух положительных
чисел получается число со старшим битом, равным единице, то есть отрица-
тельное, и наоборот.
поместит это слово в регистр АХ. В реальных программах для задания статичес-
ких переменных обычно используют директивы определения данных (раздел 3.3),
которые позволяют ссылаться на статические переменные не по адресу, а по име-
ни. Тогда, если в сегменте, указанном в Е$, была описана переменная мо г4_уаг
размером в слово, можно записать ту же команду как
мо\у ах, ез: чогд_\уаг
ЕАХ БАХ
С8: | ЕВХ
$$: | ЕСХ
ВХ |
ЕОХ ЕСХ 2
25 + ЕБХ * + смещение
Е$:| ЕВР Е ВР 4
сы 8
ЕП
№
ЕЯ
эквивалентна выражению
ах:=6х; |
Слова «выше» и «ниже» в табл. 5 относятся к сравнению чисел без знака, сло-
ва «больше» и «меньше» учитывают знак.
РУЗНА располагает в стеке регистры в следующем порядке: АХ, СХ, ОХ, ВХ,
$Р, ВР ЗГи 01. РОЗНАР помещает в стек ЕАХ, ЕСХ, ЕМОХ, ЕВХ, Е$ЗР ЕВР ЕЗ1
нЕПТ. (В случае с ЗРи ЕЗР используется значение, которое находилось в регист-
ре до начала работы команды.) В паре с командами РОРА/РОРАР, считывающи-
ми эти же регистры из стека в обратном порядке, это позволяет писать подпро-
граммы (обычно обработчики прерываний), которые не должны изменять
значения регистров по окончании своей работы. В начале такой подпрограммы
вызывают команду РОЗНА, а в конце - РОРА.
СВУ/ расширяет байт, находящийся в регистре АТ, до слова в АХ; С\/ПЕ рас-
ширяет слово в АХ до двойного слова в ЕАХ. Команды С\УШОЕ и С\УШ отличают-
ся тем, что С\УПЕ размещает свой результат в ЕАХ, в то время как СУ/Ю, выпол-
няющая точно такое же действие, располагает результат в паре регистров ОХ:АХ.
Так же как и в командах С\УШ/СОО, расширение выполняется путем установки
Непривилегированные команды И: ЕЕ
каждого бита старшей половины результата равным старшему биту исходного
байта или слова, то есть:
` ®_
МОУ а1, ОЕ5П ; АЁ = ОЕ5И = 245 = -11.
СБ ; Теперь АХ = ОЕЕЕБН = 65 525 = -1}.
© `Как и в случае с командами РИЗНА/РИ$НАО, пара СУБ/СРО — это одна
команда с кодом 99, и пара СВУ/СУ’ЮЕ - одна команда с кодом 98#. Интер-
претация этих команд зависит от того, в каком (16-битном или в 32-бит-
ном) сегменте они исполняются. Если указать СПО или СУПЕ в 16-битном
сегменте, ассемблер поставит префикс изменения разрядности операнда.
пом а1, 61
том ап, 0
- Зак. 459
34| Процессоры те! в реальном режиме
то теперь АТ. содержит не число ОСЬ, а А5СП-код буквы С. Разумеется, это пре-
образование разрешается выполнить посредством более компактного кода всего
из трех арифметических команд, который будет рассмотрен в.описании команды
РА$, но с ХГАТ можно осуществить любые преобразования такого рода.
3
Команда . Назначение Процессор
Если при вычитании младших двойных слов произошел заем, то он будет уч-
тен при вычитании старших слов.
Команда
ОО Назначение
ло Процессор
ыы
Ж№3С приемник Инкремент 8086
па Назначение . Процессор
5 ^риемник ^ Изменение знака 8086
ь Назначение | ‚ Процессор
трьемник, ИСТОЧНИК Сравнение - 8086
Если эта команда выполняется сразу после АБП (АРС, ПМС или ХАОО) ивре-
гистре АТ. находится сумма двух упакованных двоично-десятичных чисел, то в АТ.
Непривилегированные команды И:| | 39
записывается упакованное двоично-десятичное число, которое должно было
стать результатом сложения. Например, если АГ. содержит число 19Ъ, последова-
тельность команд
1пс а1
Чаа
гриведет к тому, что в АТ, окажется 201 (а не ТАЗ, как было бы послё ПМС).
| Если эта команда выполняется сразу после ЗОВ (5ЗВВ или ОЕС) и в регистре АГ,
ваходится разность двух упакованных двоично-десятичных чисел, то в АГ. записыва-
ется упакованное двоично-десятичное число, которое должно было быть результатом
вычитания. Например, если АТ. содержит число 201, последовательность команд
приведет к тому, что в регистре окажется 191 (а не 1ЕВ, как было бы после РЕС).
© РА$ выполняет следующие действия:
1. Если младише четыре бита АГ больше 9 или флаг АЕ = 1,
то АГ уменьшается на 6, СЕ устанавливается, если при этом вычита-
нии произошел заем, и АЕ устанавливается в 1.
2. Иначе АЕ= 0.
3. Если теперь старшие четыре бита АГ. больше 9 или флаг СЕ= 1,
то АГ уменьшается на 60й и СЕ устанавливается в 1.
4. Иначе СЕ = 0.
Известный пример необычного использования этой команды — самый ком-
пактный вариант преобразования шестнадцатеричной цифры в АУСП-код
соответствующего символа (более длинный и очевидный вариант этого
преобразования рассматривался в описании команды ХГАТ):
стр @р10 `
5ЬЬ а,69й
4а5
401 |1] 11 Процессоры Не! в реальном режиме
После 5ВВ числа 0-9 превращаются в 96Ё — ЭЕЙ, а числа ОАЙ — ОЕВ -
в ОАЛЁ - ОАбЁ. Затем РА5 вычитает 66# из первой группы чисел, переводя
их в ЗО — 39, и 60Р из второй группы чисел, переводя их в Ч1Ё — 46й.
Флаги АЕ и СЕ устанавливаются, если в ходе коррекции происходил заем из
первой или второй цифры. ЗЕ, ЕиРЕ устанавливаются в соответствии с резуль-
татом, ‚ флаг ОЕ не определен.
Код команды ААМ — Пай ОАй, где ОАЙ — основание системы счисления, по
@® отношению к которой выполняется коррекция. Этот байт можно заме-
нить на любое другое число (кроме нуля). и ААМ преобразует АХ к двум не-
упакованным цифрам любой системы счисления. Такая обобщенная форма
ААМ работает на всех процессорах (начиная с 8086), но появляется в доку-
ментации [те! только с процессоров Реппит. Фактически действие, кото-
рое выполняет ААМ, -— целочисленное деление А. на ОА (или любое другое
Непривилегированные команды |1 О О ПО ИР
сехлит старшие четыре бита регистра АТ, сохранив неизменными четыре младших.
’ Флаги ОЕ и СЕ обнуляются, ЗЕ, Е и РЕ устанавливаются в соответствии с ре-
ит льтатом, АЁ не определен.
приведет к тому, что младшие четыре бита регистра АТ. будут установлены в 1.
При выполнении команды ОК флаги ОЕ и СЕ обнуляются, ЗЕ, 2Е и РЕ уста-
навливаются в соответствии с результатом, АЁ не определен.
Команда: Назначение | Процессор
Эдо
ХОЯ приемник, источник -Логическое исключающее ИЛИ 8086
Р
Непривилегированные команды — СО О О ОНИ ЕЕ
2.3.5. Сдвиговые операции
Команда ._. Назначение Процессор
Эти четыре команды выполняют двоичный сдвиг приемника (регистр или пере-
менная) вправо (в сторону младшего бита) или влево (в сторону старшего бита)
за значение счетчика (число или регистр СГ. из которого учитываются только
младшие 5 бит, принимающие значения от 0 до 31). Операция сдвига на 1 экви-
=алентна умножению (сдвиг влево) или делению (сдвиг вправо) на 2. Так, число
3)10Ъ (2) после сдвига на 1 влево превращается в 0100Ъ (4). Команды ЗАГ
= ЗНГ. выполняют одну и ту же операцию (на самом деле это одна и та же коман-
-) — на каждый шаг сдвига старший бит заносится в СЕ все биты сдвигаются
лево на одну позицию, и младший‘бит обнуляется. Команда 5НК осуществляет
=рямо противоположную операцию: младший бит заносится в СЕ всебиты сдви-
-зются на 1 вправо, старший бит обнуляется. Эта команда эквивалентна беззнако-
зому целочисленному делению на 2. Команда ЗАК действует по аналогии с $НК,
-элько старший бит не обнуляется, а сохраняет предыдущее значение, вот почему,
=зпример, число 11111100 (-4) перейдет в 11111110Ъ (-2). ЗАВ, таким обра-
вом, эквивалентна знаковому делению на 2, но, в отличие от ТРТУ, округление
-роисходит не в сторону нуля, а в сторону отрицательной бесконечности. Так,
=сли разделить -9 на 4 с помощью ПТУ, получится -2 (и остаток —1), аесли вы-
толнить арифметический сдвиг вправо числа -—9 на 2, результатом будет -3. Сдви-
—и больше 1 эквивалентны соответствующим сдвигам на 1, выполненным после-
совательно. Схема всех сдвиговых операций приведена на рис. 7.
Сдвиги на 1 изменяют значение флага ОЕ. ЗАГ./$ НЕ. устанавливают его в 1,
если после сдвига старший бит изменился (то есть старшие два бита исходного
=исла не были одинаковыми), и в 0, если старший бит остался тем же. ЗАВ уста-
«звливает ОЕв 0, а $НВ - в значение старшего бита исходного числа. Для сдви-
гов на несколько битов значение ОЕ не определено. Флаги ЗЕ, Е РЕ назначаются
и 7,15,31
с:
вл Е 753
-=-
зн а 7,15,31
Приемник (регистр или переменная) сдвигается влево (в случае НЕ.) или впра-
во (в случае ЗНВО) на число битов, указанное в счетчике (число или регистр СГ.
откуда используются только младшие 5 бит, принимающие значения от 0 до 31).
Старший (для ЗНГ.О) или младший (в случае $ЗНКО) бит не обнуляется, а счи-
тывается из источника (регистр), значение которого не изменяется. Например,
если приемник содержит 00101001Ъ, источник — 1010Ъ;то счетчик равен 3, ЗНВР
даст в результате 010001015, а ЗНТО - 01001101Ъ (см. рис. 8).
зко Г кок
15,3] 0
| 15,31
пин 0
зо < [9 15,31
зы 0
Го жж
15,31 0
7,15,31 0 —
-«— 7.15.31 0
т =
РИ
| 7,1531
нии 0 В
Рис. 9. Циклические сдвиги
э
Несмотря на то что эта команда считывает единственный бит из памя-
ти, а процессор — целое двойное слово по адресу База + (4 Х (Смещение/
32)) или слово по адресу База + (2 Х (Смещение/16)), в зависимости от
разрядности адреса, все равно не следует пользоваться ВТ вблизи от недо-
ступных для чтения областей памяти.
СОШИИШИИШИИ | — Процессоры име! в реальном режиме
После выполнения команды ВТ флаг СЕ равен значению считанного бита,
флаги ОЕ ЗЕ 2Е АЕи РЕ не определены.
Команда Назначение Процессор
ВТ$ база, смещение Проверка и установка бита „ 80386
ВТВ база, смещение Проверка и сброс бита 80386
ВТС база, смещение Проверка и инверсия бита 80386
Е
; 4
р ИЕН
Если не равно
ЗЕТМЕ 2Е=0
ЗЕТМА. Если не ноль
О переход типа зо” (короткий переход) — если адрес перехода находится в пре-
делах —128...+127 байт от команды МР;
|
481111] Процессоры Н\е! в реальном режиме
О переход типа иеаг (ближний переход) - если адрес перехода находится в том
же сегменте памяти, что и команда ]МР;
О переход типа /аг (дальний переход) - если адрес перехода находится‘в дру-
гом сегменте. Дальний переход может выполняться и в тот же самый сегмент
при условии, что в сегментной части операнда указано число, совпадающее
с текущим значением С$;
О переход с переключением задачи — передача управления другой задаче в мно-
гозадачной среде. Этот вариант будет рассмотрен в разделе, посвященном за-
щищенному режиму.
При выполнении переходов типа зПог( и пеаг команда ]МР фактически преоб-
разовывает значение регистра Е1Р (или [Р), изменяя тем самым смещение следу-
ющей исполняемой команды относительно начала сегмента кода. Если операнд —
регистр или переменная в памяти, то его показатель просто копируется в ЕГР, как
если бы это была команда МОУ. Если операнд для ]МР - непосредственно ука-
занное число, то его значение суммируется с содержимым ЕТР, приводя`к относи-
тельному переходу. В ассемблерных программах в качестве операнда обычно
указывают имена меток, но на уровне исполняемого кода ассемблер вычисляет
и записывает именно относительные смещения. :
Выполняя дальний переход в реальном, виртуальном и защищенном режимах
(при переходе в сегмент с теми же привилегиями), команда ] МР просто загружа-
ет новое значение в ЕГР и новый селектор сегмента кода в С$, используя старшие
16 бит операнда как новое значение для С$ и младшие 16 или 32 битв качестве
значений ГР или ЕР
Команда Назначение Процессор
Усс метка Условный переход 8086 °
Это набор команд, выполняющих переход (типа зВог( или пеаг), если удовлет-
воряется соответствующее условие, которым в каждом случае реально является
состояние тех или иных флагов. Но, когда команда из набора ]сс используется
сразу после СМР, условия приобретают формулировки, соответствующие отно-
шениям между операндами СМР (см. табл. 7). Например, если операнды СМР
были равны, то команда ]Е, выполненная сразу после СМР осуществит переход.
Операнд для всех команд из набора ]сс - 8-битное или 32-битное смещение отно-
сительно текущей команды.
` Слова «выше» и «ниже» в таблице относятся к сравнению чисел без знака; сло-
ва «больше» и «меньше» учитывают знак.
Команды ]сс не поддерживают дальних переходов, поэтому, если требуется вы-
полнить условный переход на дальнюю метку, необходимо использовать команду
из набора ]сс с обратным условием и дальний ]МР как, например:
стр ах,0
пе 10са1_1
тр Гаг_]абе1 ; Переход, если АХ = 0. -
10са1_1:
Непривилегированные команды | | 49]
Таблица 7. Варианты команды Усс
Все перечисленные команды уменышпают регистр ЕСХ на один, после чего вы-
полняют переход типа Вог, если ЕСХ не равен нулю и если выполняется условие.
Для команд ГООРЕ и 1ООРЯ условием является равенство единице флага ГЕ для
команд ГТООРМЕ и ГООРМУ - равенство флага 7Е нулю. Сами команды ТООРсс
не изменяют значений флагов, так что 2Е должен быть установлен (или сброшен)
предшествующей командой. Например, следующий фрагмент копирует строку из
05:51 в строку в Е$:01 (см. описание команд работы со строками), пока не кончится
строка (СХ = 0) или пока не встретится символ с АЗСП-кодом 13 (конец строки):
поу `^ сх, 55г_1епаев
поуе 10оор:
10956 `,
$1085
стр а1,13
209рп2 моуе_1оор |
Размер этой команды — один байт (код ОССЬ), что делает ее удобной для до-
водки программ отладчиками, работающими в реальном режиме. Они записыва-
ют этот байт вместо первого байта команды, перед которой требуется точка оста-
нова, Ичтереопределяют адрес обработчика прерывания 3 на соответствующую
процедуру внутри отладчика.
[МТО - еще одна специальная форма команды [МТ. Она вызывает обработчик
прерывания 4, если флаг ОЕ установлен в 1.
` Назначение Процессор
° локальные |
Копирует один байт (МОУЗВ), слово (МОУ$\\) или двойное слово (МОУ$О)
из памяти по адресу О5:Е$Т (или 05:51, в зависимости от разрядности адреса) в па-
мять по адресу Е:ЕП] (или Е5:ОГ). При использовании формы записи МОУ$
ассемблер сам определяет по типу указанных операндов (принято указывать имена
копируемых строк, но можно применять любые два операнда подходящего типа), ка-
кую из трех форм этой команды (МОУЗВ, МОУ$\/ или МОУ$О) выбрать. Исполь-
зуя МОУ5 с операндами, разрешается заменить регистр 0$ другим с помощью пре-
фикса замены сегмента (Е$:, С5;, Е$:, С$;, $$:), регистр Е$ заменить нельзя. После
выполнения команды регистры Е$Е (или $1) и ЕП (или ОТ) увеличиваются на 1, 2
или 4 (если копируются байты, слова или двойные слова), когда флаг ОЕ = 0,
Непривилегированные команды ПИТ 155
и уменьшаются, когда ОЕ = 1. Команда МОУ$ с префиксом ВЕР выполняет копи-
рование строки длиной в ЕСХ (или СХ) байтов, слов или двойных слов.
Сравнивает один байт (СМРЗВ), слово (СМР$УУ) или двойное слово (СМР$Р)
из памяти по адресу 05:Е$1 (или 05:31, в зависимости от разрядности адреса) с бай-
том, словом или двойным словом по адресу ЕЗ:ЕПЛ (или ЕЗ:01) и устанавливает
флаги аналогично команде СМР При использовании формы записи СМР$ ассемб-
лер сам определяет по типу указанных операндов (принято указывать имена срав-
ниваемых строк, но можно использовать любые два операнда подходящего типа), .
какую из трех форм этой команды (СМРЗВ, СМР5У/ или СМР5О) выбрать.
Применяя СМР5 с операндами, можно заменить регистр 0$ другим, воспользо-
завшись префиксом замены сегмента (Е5;:, С$;, Е$;:, С$;:, $5: ), регистр Е$ заменить
нельзя. После выполнения команды регистры Е$] (или ЭТ) и ЕПГ (или ОТ) уве-
личиваются на 1, 2 или 4 (если сравниваются байты, слова или двойные слова),
хогда флаг ОЕ= 0, и уменьшаются, когда РЕ = 1. Команда СМР$ с префиксами
КЕРМЕ/КЕРМ2 или ВЕРЕ/ВЕРУ выполняет сравнение строки длиной в ЕСХ
‹ или СХ) байтов, слов или двойных слов. В первом случае сравнение продолжает-
-я до первого совпадения в строках, а во втором — до первого несовпадения:
ри
Команда Назначение Процессор
$СА$ приемник | Сканирование строки 8086
$САЗВ Сканирование строки байтов . 8086
САМ Сканирование строки слов 8086
$САЗО Сканирование строки двойных слов 80386
Копирует один байт (ГООЗВ), слово ((ОР$У\/) или двойное слово (1005$)
‚ из памяти по адресу 05:Е51 (или О5:$Т, в зависимости от разряяности адреса)
_в регистр АТ, АХ или ЕАХ соответственно. При использовании формы записи
ГОО5 ассемблер сам определяет по типу указанного операнда (принято указы-
вать имя строки, но можно использовать любой операнд подходящего типа), ка-
кую из трех форм этой команды (ГООЗВ, 1ОО$У/ или [ОО$) выбрать. Приме-
няя [05 с операндом, можно заменить регистр 0$ на другой с помощью
префикса замены сегмента (Е$:, С5:, Е$:, С$:, 55:). После выполнения команды
регистр Е$ЗТ (или $Т) увеличивается на 1, 2 или 4 (если считывается байт, слово
или двойное слово), когда флаг ОЕ = 0, и уменьшаётся, когда ОЕ = 1. Команда
ГОО5 с префиксом ВЕР выполнит копирование строки длиной в ЕСХ (или СХ),
и ваккумуляторе окажется последний элемент строки. На самом деле 1ОО$ ис-
пользуют без префиксов, часто внутри цикла в паре с командой ЗТО$, так что
ГОО считывает число, другие команды выполняют над ним какие-нибудь дей-
ствия, а затем ЗТО$ записывает измененное число на прежнее место в памяти.
Копирует младший байт регистра ЕТ.АС$ в АН, включая флаги ЗЕ (бит 7), СЕ
(бит б), АЕ (бит 4), РЕ (бит 2) и СЕ (бит 0). Бит 1 устанавливается в 1, биты 3
и5-в0. :
Команда Назначение Процессор
ЗАНЕ Загрузить флаги состояния из АН 8086
Считывает из вершины стека слово (РОРЕ) или двойное слово (РОРЕР) и по-
мещает в регистр ЕТ.АС$ или ЕЕЕАС$. Эффект этих команд зависит от режима,
в котором выполняется программа: в реальном и защищенном режимах с уров-
нем привилегий 0 модифицируются все незарезервированные флаги в ЕРГ.АС$,
кроме УТР, УТЕ и УМ. У[Р и УТЕ обнуляются, и УМ не изменяется. В защищен-
ном режиме с уровнем привилегий, большим нуля, но меньшим или равным
.
Непривилегированные команды ИО!| 59
ТОРГ, модифицируются все флаги, кроме УТР, УТЕ УМ и ГОРГ. В режиме У86 не
модифицируются флаги УТЕ, У[Р УМ, ОРГ и ВЕ
Второй операнд (источник) для всех этих команд — переменная в памяти раз-
мером в 32 или 48 бит (в зависимости от разрядности операндов). Первые 16 или
32 бита из этой переменной загружаются в регистр общего назначения, указанный
з качестве первого операнда, а следующие 16 бит - в соответствующий сегмент-
ный регистр (05$ для [.0$, Е$ для 1.Е$ ит. д.). В защищенном режиме значение,
загружаемое в сегментный регистр, всегда должно быть правильным селектором
сегмента (в реальном режиме любое число может использоваться как селектор).
2.3.11. Другие команды
Команда Назначение Процессор
ОР Отсутствие операции 8086
[557 ОР ООО ОО ОО В ВАЗ Процессоры име! в реальном режиме
МОР - однобайтная команда (код 906), которая не выполняет ничего, только
занимает место и время. Код этой команды фактически соответствует ХСНС
АГ, АГ. Многие команды разрешается записать так, что они не будут приводить
ни к каким действиям, например:
оу ах, ах ; 2 байта.
хсп9 ах, ах. ; 2 байта.
]еа Ьх, [6х+0] ; 3 байта (801, 5Ей, ООН, но многие ассемблеры,
‚ встретив такую команду, реально используют более
; короткую 1еа 5х, [6х] с кодом 808 1ЕП).
$11 еах, 0 ‚ 4 байта. |
эНга еах, еах, 0 ‚ 5 байт.
Количество
Тип данных Бит . значащих Пределы
цифр
Короткое целое 7 32 | 9
Длинное слово
Упакованное десятичное
т
Короткое вещественное 32 — 7 1,18%10-38 ... 3,40%1038
Длинное вещественное 64 15-16 2,23%10-308 ... 1,79х10308
в 9%
ОИ Г.
И
И
И
С ОНИ К
И
к
79
©
0
СВ ЕР
$8 ЕОР
ТУ 47 0
15 0
АИИС ВИССТИ
Значение ВС
Способ округления
1 К отрицательной бес
конечности
2 К положительной
бесконечности
3 К нулю
Биты РС определяют
точность результатов
ЕМЧТ, ЕТУ, ЕПГУК и команд ЕАБЬ, ЕЗОВ,
ЕЗОВТ (см. табл. 11). ЕЗОВВ,
Таблица 11. Точность
результатов
Но ОБинериая точность{92битыечот —
ИИ И И
2 [ов ба
б то
л
3 [Рбвиренная неит з )—
точность(-бии
тные чиста—
Биты 0-5 регистра СК
маскируют соответствую
кирующий бит установле щие исключения -— если
н, исключения не происх мас-
одит, а результат вызвав
шей его
Несравнимы,
Условие
$Т(0) > источник
$Т(0) < источник
$Т(0} = источник
Несравнимы
Нормальное конечное
число
Бесконечность
Ноль
Регистр пуст
Денормализованное
число
Ем Го Синус 80387
Вычисляст синус числа, находящегося в 5Т(0), и сохраняет результат в этом
же регистре. Операнд считается заданным в радианах и не может быть больше 28
или меньше —283 (можно воспользоваться ЕРВЕМ с делителем 27, если операнд
слишком велик). Если операнд выходит за эти пределы, флаг С2 устанавливается
в 1 и значение $Т(0) не изменяется.
—Х
от +п до +1]2
+л/2
Все эти команды помещают в стек (то есть уменьшают ТОР на один и поме-
щают в 5Т(0)) соответствующую часто используемую константу. Начиная с со-
процессора 80387, все константы хранятся в более точном формате, чем 80-бит-
ный формат, используемый в регистрах данных, и при загрузке в стек происходит
округление в соответствии с полем КС.
Поле ТОР регистра состояния ЕРИ уменьшается на 1. Если ТОР было равно
нулю, оно устанавливается в 7. Содержимое регистров данных и ТУ” не изменяется.
———ы—ы»ы»5»„»»»—»—»—»—»—»—»—»—»—ы„3з_—»—ы—ы—ю—ы—ы=—_ю—=—==—ы=—.„.—ы—ЫЫы——ЫыЫ——Ы—Ы—Ы—
Ы—Ы—Ы—=—==—=ПЛыП=[2,—,.П—=ы—=——=...
Команда . Назначение Процессор
—_
Р е
РЕВЕЕ операнд | Освободить регистр данных 8087
Команда отмечает в регистре ТУ, что операнд (регистр данных $Т(п)) пустой.
Содержимое регистра и ТОР не изменяется.
Команды обнуляют флаги исключений (РЕ, ОЕ, ОЕ, 7Е, РЕ, 1Е), а также фла-
ги Е$, 5Р и В в регистре состояния ЕРО. Команда ЕСГ.ЕХ, в отличие от ЕМСГЕХ,
проверяет наличие произошедших и необработанных исключений и обрабатыва-
ет их до выполнения. Команда ЕСГ.ЕХ полностью эквивалентна (и на самом деле
является) \/АГТ ЕМСГЕХ.
—_—_—___
диод
Команда Назначение , | Процессор
Е8ТС\У приемник Сохранить регистр СА | 8087
ЕМЗТСМ/ приемник Сохранить регистр СВ без ожидания 8087
Команда загружает все вспомогательные регистры ЕРО (регистры СКВ, 5В, ТУ/,
ЕТР, ЕР) из источника (область памяти в 14 или 28 байт, в зависимости от раз-
рядности операндов), сохраненные ранее командой ЕЗТЕМУ /ЕМЗТЕМУ, Если в за-
гружаемом ЗУ установлены несколько (или один) флагов исключений, которые
одновременно не замаскированы флагами СК, то эти исключения будут выполне-
ны перед следующей командой ЕРЦ (кроме команд без ожидания).
Копирует учетверенное слово (64 бита) из источника (регистр ММХ или пе-
ременная) в приемник: (регистр ММХ или переменная, оба операнда не могут
быть переменными).
Выполняет побитовое «логическое НЕ» (то есть инверсию битов) над прием-
ником (регистр ММХ) и затем побитовое «логическое И» над приемником и ис-
точником (регистр ММХ или переменная). Результат сохраняется в приемнике.
Каждый бит результата устанавливается в 1. только если соответствующий бит.
источника был равен 1, а приемника - 0. иначе бит сбрасывается в 0. Эта логичес-
кая операция называется также штрихом Шеффера.
Команды сдвигают влево биты в каждом элементе (в словах — для РЗ. РУ,
в двойных словах — для Р51.Т), во всем регистре — для РЗЕТО) приемника (ре-
гистр ММХ) на число битов, указанное в источнике (8-битное число, регистр
ММХ или переменная). При сдвиге младшие биты заполняются нулями, так что,
например, команды
р$1 м пупо, 15
р3119 тт, 31
р$119 то, 63
Команды сравнения
Команда Назначение Процессор
и т
СМРР$ приемник,источник, предикат Сравнение упакованных РИ /.
.вещественных чисел
4 Зак. 459
981 |1 || 111 Процессоры 1т4е| в реальном режиме
Предикат Проверяемое утверждение
6 (те) | Приемник строго больше источника |
7 (ога) Ни приемник, ни источник не являются не-числом
ООО ОИ
Целочисленные УМО-команды
° Помимо расширения для работы с упакованными вещественными числами в 55Е
входит расширение набора команд для работы с упакованными целыми числами,
которые размещаются в регистрах ММХ.
Каждый элемент (байт или слово) источника (регистр ММХ или 64-битная
переменная) добавляется к соответствующему элементу приемника (регистр
ММХ) как беззнаковое целое. Каждый из результатов сдвигается вправо на один
бит (делится на два). Затем в старший бит каждого элемента записывается бит |
переноса от соответствующего сложения. В результате этих действий получаются
средние арифметические целых чисел со знаками.
Команда Назначение Процессор
РЕХТН\У приемник, источник, индекс Распаковать одно слово . РИ
2.6.5. Исключения
Особые ситуации при выполнении команд 55Е вызывают новое системное
исключение #ХЕ (ТУТ 19), обработчик которого может прочитать содержимое
регистра МХСЪВ, чтобы определить тип исключения и выполнить соответствую-
щие действия. Кроме того, команды $5Е могут вызывать и обычные системные
исключения - #0Ш (неопределенная команда), #ММ (расширение отсутствует),
#55 (переполнение стека), #СР (общая ошибка защиты), #РЕ (ошибка странич-
ной защиты), #АС (невыровненное обращение к памяти). |
Собственные исключения, вызываемые командами $5Е и отраженные при
помощи флагов в регистре МХСЪЗЬ, - это:
ОЯТ - невыполнимая команда (вызывается перед выполнением команды);
0#1 - деление на ноль (вызывается перед выполнением команды);
9# - денормализованный операнд (вызывается перед выполнением команды):
О #0 - переполнение (вызывается после выполнения команды);
О #1 - антипереполнение (вызывается после выполнения команды);
ОЯР - потеря точности (вызывается после выполнения команды).
ТТ РТТТ
Глава 3. Директивы
и операторы ассемблера
Каждая программа на языке ассемблера помимо команд процессора содержит еще
`и специальные инструкции, указывающие самому ассемблеру, как организовы-. 1
вать различные секции программы, где располагаются данные, а где команды,
позволяющие создавать макроопределения, выбирать тип используемого процес-
сора, налаживать связи между процедурами и т. д. К сожалению, пока нет единого,
стандарта на эти команды (он существует для МХ, о чем рассказано в главе 11).
Разные ассемблеры используют различные наборы директив, но ТАЗМ и МАЗМ
(два самых популярных ассемблера для РОЗ и \Ип4о\5) поддерживают общий
набор, или, точнее, ТАЗМ поддерживает набор директив МА$М наряду с несов-
местимым собственным, известным как [4еа| Моде. Все примеры программ в кни-
ге написаны так, чтобы для их компиляции можно было воспользоваться ТАЗМ,
МАЗМ или \\А$М - еще одним популярным ассемблером, поэтому в данной гла-
ве рассмотрены те предопределенные идентификаторы, операторы и директивы,
которые поддерживаются этими тремя ассемблерами одновременно.
Причем все эти поля необязательны. Метка может быть любой комбинацией
букв английского алфавита, цифр и символов _, $, @; ?, но цифра не может быть
первым символом "метки, а символы $ и ? иногда имеют специальные значения
и обычно не рекомендуются к использованию. Большие и маленькие буквы по
умолчанию не распознаются, но различие можно включить, задав ту или иную оп-
цию в командной строке ассемблера. Во втором поле, поле команды, может рас-
полагаться команда процессора, которая транслируется в исполняемый код, или
директива, которая не приводит к появлению нового кода, а управляет работой:
самого ассемблера. В поле операндов располагаются требуемые командой или ди-
рективой операнды (то есть нельзя указать операнды и не указать команду или
директиву). И наконен, в поле комментариев, начало которого отмечается симво-
лом ; (точка с запятой), можно написать все что угодно -— текст от символа ; до
конца строки не анализируется ассемблером.
Для облегчения читаемости ассемблерных текстов принято, что метка начина-
ется на первой позиции в строке, команда - на 17-й (две табуляции), операнды —
Структура программы- о 107
на 25-й (три табуляции) и комментарии - на 41-й или 49-й. Если строка состоит
только из комментария, его начинают с первой позиции.
Если метка располагается перед командой процессора, сразу после неё всегда
ставится оператор : (двоеточие), который указывает ассемблеру, что надо создать
переменную с этим именем, содержащую адрес текущей команды:
зоте_1оор:
109$ ; Считать слово из строки.
стр ах, 7 ; Если это 7 - выйти из цикла.
]Щоорпе зоме_1оор :
Когда метка стоит перед директивой ассемблера, она обычно оказывается од-
ним из операндов этой директивы и двоеточие не ставится. Рассмотрим директи-
вы, работающие напрямую с метками и их значениями, — ТАВЕЕ, ЕОП и-=.
метка — 1абе1 тип
Директива ГАВЕГ, определяет метку и задает ее тип: ВУТЕ (байт), \МОВО
(слово), ОУГОВР (двойное слово), ЕХМОКО (6 байт), О\ОКГ (учетверенное сло-
во), ТВУТЕ (10 байт), МЕАВ (ближняя метка), ЕАВ (дальняя метка). Метка полу-
чает значение, равное адресу следующей команды или следующих данных, и тип,
указанный явно. В зависимости от типа команда’
[е№ метка,0
запишет в память байт (слово, двойное слово ит: д.), заполненный нулями, а ко-
манда
са11 метка
считает в регистр АТ. число 48В (код латинской буквы Н). Если вместо точного
значения указан знак 2, переменная считается неинициализированной и ее зна-
чение на момент запуска программы может оказаться любым. Если нужно запол-
нить участок памяти повторяющимися данными, используется специальный опе-
ратор РУР, имеющий формат счетчик ГИР (значение). Например, вот такое опре-
деление:
-а61е_512м 9м 512 4ир(?)
3.2.2. Структуры
Директива ТВОС позволяет определить структуру данных аналогично
структурам в языках, высокого уровня. Последовательность директив
ИМЯ ЗЕгис.
,
поля
имя епаз
ро1пт $гис
х 9м 0
у Чи 0
2 Чм 0
с1г со1ог <>
ро1пт епд$
имя_сегмента епаз
эквивалентно ,
_ТЕХТ зедтепЕ мог руБ11с 'С00Е’
. дата? .
‚ а1рпа
. _ #
гет
метка` | епар '
Все операнды РКОС необязательны.
Тип может принимать значения МЕАК и ЕАК, и если он указан, все команды
ВЕТ втеле процедуры будут заменены соответственно на ВЕТМ и ВЕТЕ По умол-
чанию подразумевается, что процедура имеет тип МЕАВ в моделях памяти ТЛМУ,
ЗМАШМ. и СОМРАСТ. | |
Операнд «язык» действует аналогично такому‹жеоперанду директивы МОРЕГ,
определяя взаимодействие процедуры с языками высокого уровня. В некоторых
ассемблерах директива РКОС позволяет также считать параметры, передаваемые
вызывающей программой. В этом случае указание языка необходимо, так как раз-
личные языки Высокого уровня используют разные способы передачи параметров.
ОЗЕ$- список регистров, значения которых изменяет процедура. Ассемблер по-
мещает в начало процедуры набор команд РОЗН, а перед командой ВЕТ- набор
команд РОР так что значения перечисленных регистров будут восстановлены.
3.3.5. Конец программы О:
епд зТтагт_1абе1
3.3.9. Условное-ассемблирование
В большинстве языков программирования присутствуют средства, позволяю-
щие игнорировать тот или иной участок программы в зависимости от вылолне-
ния условий, например: в языке С это осуществляется командами препроцессора
- #1, #Иеё, и\т4еР и т. д. Ассемблер тоже : предоставляет такую возможность.
1 выражение
епазЕ -
е15е
епа1Е
е1зе1 выражение?
е15е1Р выражениеЗ
6156
епа1+
3.4. Выражения
Мы уже упоминали выражения при описании многих директив ассемблера.
Выражение- это набор чисел, меток или строк, связанных друг с другом оператора-
ми. Например: 2 + 2 — выражение, состоящее из двух чисел (2 и 2) и оператора +.
Каждое выражение имеет значение, которое определяется как результат действия
операторов. Так, значение выражения 2 + 2 - число 4. Все выражения вычисля-
ются в ходе ассемблирования программы, следовательно, в полученном коде ис-
пользуются только значения.
Оператор <> (угловые скобки). Часть выражения, заключенная в угловые
скобки, не вычисляется, а применяется как строка символов, например:
теззаде1 еди _ ° «Рообаг>
Оператор {) (круглые скобки). Часть выражения, заключенная в круглые скоб-
ки, вычисляется в первую очередь.
тоу 21, 2*(3+4) ; МОУ а1, 14
Операторы адресации:
о$ЕС выражение — сегментный адрес;
о ОЕЕРЪЕТ выражение — смещение;
аТН!$ тин - текущий адрес (МАЗМ и ТА$М);
Выражения
Отип РТК выражение - переопределение типа; . ,
ОГАКСЕ выражение - 32-битное смещение (ТАЗМ и \АЗМ),;.
‚Э$МАШ. выражение - 16-битное смещение (ТАЗМ и \МА$М); `
о5НОКТ выражение - 8-битное смещение.
ЗЕС и ОЕЕЗЕТ возвращают соответствующую часть адреса своего аргумента:
поу 9х, оЁЁзет пзд ; Занести в ОХ ‘смещение переменной пз9.
Другие операторы:
О. (точка) — ссылка на элемент структуры; ° '
О: (двоеточие) — переопределение сегмента;
9 Оутловые скобки) — косвенная адресация;
О? - неинициализированное значение;
О число РОР (значение) — повторяющееся значение.
Эти пять операторов описаны ранее, когда говорилось в`е?руктурах данных,
методах адресации и псевдокомандах определения данных.
`
3.5. Макроопределения
Одно из самых мощных языковых средств ассемблера — макроопределения.
Макроопределением (или макросом) называется участок программы, которому
присвоено имя и который ассемблируется всякий раз, когда ассемблер встречает
11 Директивы и операторы ассемблера
ы.
Макрос начинается
это имя в тексте программ директивой МАСКО и заканчи-
- вается ЕМОМ. Например; пусть описано макроопределениеВех2азси, переводя-
щее шестнадцатеричное число, находящееся в регистре АТ, в АЗСП-код соответ-
ствующей шестнадцатеричной цифры:
Вех2а3с11 масго
стр а], 10
$66 а1, 69®
да$
епдт
Сейчас в программе можно использовать слово Вех2азсй, как если бы это было
имя команды, и ассемблер заменит каждое такое слово на три команды, содер-`
жащиеся в макроопределении. Разумеется, можно оформить этот же участок кода
в виде процедуры и вызывать его командой САМ. - если процедура вызывается
болыше одного раза, этот вариант программы займет меньше места, но вариант
с макроопределением станет выполняться быстрее, так как в нем не будет лиш-
них команд САЦ. и ВЕТ. Однако скорость выподнения — неглавное преимуще-
ство макросов. В отличие от процедур макроопределения могут вызываться
с параметрами, следовательно, в зависимости от ситуации, включаемый код бу-
дет немного различаться, например:
з_моу тасго гед1зтег1, гед1 тега
риз! ° гед1зфег1
` рор гед15Тег2
епат
Теперь можно. использовать $_МОУ вместо команды МОУ для того, чтобы
скопировать значение из одного сегментного регистра в другой. , |
Следующее важное средство, использую щееся в макроопре делениях, — дирек-
тивы условного ассемблирования. Например: напишем макрос, выполияющий:
умножение регистра АХ на число, причем, если множитель — степень двойки, то
умножение будет выполняться более быстрой командой сдвига влево.
Таз{_ми]1 пасго пипрег
и питбег ед 2 .
$11 ах, 1 ; Умножение на 2. : .
е1зе1Г' питбег е4 4° |
$81 ах, 2 ; Умножение на 4.
е1зе1Р' пишбег ед 8 —
$11 ах, 3 ; Умножение на 8.
... ; Аналогично вплоть до:
е13е17' питьег ед 32768
$11 ах, 15 ; Умножение на 2*.
е}зе | . ы
мо ах, питбег ‚ Умножение на число, не являющееся
_ пи} 9х `_; степенью двойки. .
епо1!`
епдт
Макроопределения. 2 НА ОО ИНЕТЕ
Можно, конечно, усложнить этот макрос, применяя особые свойства команды `
ГЕА и ее комбинации, сдвиги и сложения, однако в нынешнем виде он чрезмерно
громаздкий. Проблема решается с помощью третьего срёдства, постоянно исполь-
зующегося в макросах, — блоков повторений. `
ейдт
епат
Блок, описанный директивой [ЕР будет вызываться столько раз, сколько зна-
чений указано в списке (в угловых скобках), и при каждом повторении будет оп-
ределена метка с именем параметр, равная очередному значению из слиска. На-
пример, следующий блок повторений сохранит в стек регистры АХ, ВХ, СХирхХ:
1гр гед, <ах, 5х, сх, Чх>
риузй гед
епдм
3.5.2. Макрооператоры
Макрооператор & (амперсанд) нужен для того, чтобы параметр, переданный
в качестве операнда макроопределению или блоку повторений, заменялся значе-
нием до обработки строки ассемблером. Так, например, следующий макрос выпол-
нит команду РОЗН ЕАХ, если его вызвать как РОЗНКЕС А:
ризпгед. тасго 1е{ег
ризй ° её1етег&х
епат | |
Макрооператор <> (угловые скобки) действует так, что весь текст, заключен-
ный в эти скобки, рассматривается как текстовая строка, даже если он содержит
пробелы или другие разделители. Как мы уже видели, этот макрооператор ис-
пользуется при передаче текстовых строк в качестве параметров для макросов.
Другое частое применение угловых скобок - передача списка параметров вложен-
ному макроопределению или блоку повторений.
Макрооператор 1 (восклицательный знак) используется аналогично угловым
скобкам, но действует только на один следующий символ, так что, если этот сим-
вол — запятая или угловая скобка, он все равно будет передан макросу как часть
параметра.
Макрооператор % (процент) указывает, что находящийся за ним текст являет-
ся выражением и должен быть вычислен. Обычно это требуется для того, чтобы
передавать в качестве параметра в макрос не само: выражение, а его результат.
Макрооператор;; (две точки с запятой)— начало макрокоммеитария. В отли-
чие от обычных комментариев текст макрокомментария не попадает в листинг
и в текст программы при подстановке макроса. Это сэкономит память при ассем-
блировании программы с большим количеством макроопределений.
3.6.3. Комментарии
Кроме обычных комментариев, начинающихся с символа; {точка с запятой)
‘и заканчивающихся в конце строки, возможны большие блоки комментариев,
‘описываемых специальной директивой СОММЕМТ.
соттепт @
любой текст
@
и сохраните его как файл ВеПо-1.азт. Можно также использовать готовый файл
с этим именем. (Все программы, рассмотренные в этой книге как примеры, вы мо-
жете найти в. Пцегпеё по адресу: //м
Вр: лум Чти К,ги.)
‚ Для превращения программы в исполняемый файл сначала надо вызвать ас-
семблер, чтобы скомпилировать ее в объектный файл с именем ВеПо-1.05}, набрав
в командной строке следующую команду:
Для ТАЗМ:
Тазт Не110-1.азт
Для МАЗМ:
т] /с 1е]1о-1.азм
Для \А$М:
имазт пе110-1.азт
Программа типа СОМ. И ПВН ИО ПОИОИНЕР]
С ассемблерными программами также можно работать из интегрированных
сред разработки, как обычно поступают с языками высокого уровня. Но в них, как
правило, удобнее создавать. ассемблерные процедуры, вызываемые из ‘программ
на языке, для которого предназначена среда, а создание полноценных программ
на ассемблере требует некоторой перенастройки. -
Формат объектных файлов, применяе мых всеми тремя рассматриваемыми ас-
семблерами по умолчанию (ОМЕ-формат), совпадает, так что можно пользоватЬ-
ся ассемблером из одного пакета и компоновщиком из другого.
Для ТАЗМ:
пк /Е /х пе110-1.05) . .
Для \МАЗМ:
мик Ре ве110-1.05] Тоги 00$ С0М
5 Зак. 459
|} Основы программирования для М$ 20$
@& РО5 при вызове-СОМ. -файла помещает в стек сегментный адрес программы
и ноль, так что ВЕТ передает управление на нулевой адрес текущего сегмен-
та, то есть на первый байт Р5Р. Там находится код команды 1МТ 201, кото-
рая и используется для возвращения управления в РО$. Можно сразу закан-`
чивать программу командой МТ 20%, хотя это длиннее на 1 байт.
Компиляция Нео-2.азт.
Для ТАЗМ:
тазт Ве110-2. азт
нак Их ве110-2.00)
Размер получаемого файла ео-2.ехе — 559 байт.
Для МАЗМ:
21 /с 1е110-2. азм
ик ве110-2.06}
Размер получаемого файла ВеПо-2.ехе — 545 байт.
Для \А$М:
«азт Пе110-2. азт |
«ик Ее 1пе110-2.06] Рогт 60$
Размер получаемого файла Вео-2.ехе - 81 байт: ,
Расхождения в размерах файлов вызваны различными соглашениями о вырав-
нивании сегментов программы по умолчанию. Почти все примеры программ для
РО$ в этой книге рассчитаны на компиляцию в СОМ-файлы, так как идеология
работы с памятью в них во многом. совпадает с идеологией, используемой при
программировании под расширители РО$, ЭРМ! и УЛпдо\.
.0де1 {1пу
. соде у
0г9 100Н ; Начало СОМ-файла.
зФагт:
по\ сх; 256 Вывести 256 символов.
оу 91,0 Первый символ - с кодом 00.
тоу ав, 2 Номер функции 00$ “вывод символа“.
- 6100р: 111 218 Вызов 00$. -. ,
1пс 91 ; Увеличение ОЁ на 1`- следующий символ,.
тезт -91, ОЕ ; Если 01 не кратен 16, р
7072 соп1пче_1оор ; продолжить цикл.
| ризй 9х ! ; Иначе: сохранить текущий символ,
тому „. 91,001 ‚ вывести СВ,
117 21н . ` ”
оу 91, ОАЙ ; вывести (Е, / `
ит 2 :
рор 9х — ‚ восстановить текущий символ,
соп1пие_1оор:
1оор с1оор ‚ продолжить цикл.
гет ; Завершение СОМ-файла.
епд зтаге °
Это программа типа СОМ, и компилироваться она должна точно так же, как
ВеПо-1.азт из раздела 4.1. Здесь с помощью команды ГООР оформляется цикл,
выполняющийся 256 раз (значение регистра СХ в начале цикла). Регистр Г]. со-
держит код символа, который равен нулю в начале цикла и увеличивается каж-
дый раз на 1 командой ПМС РТ. Если значение ОТ. сразу после увеличения на 1
кратно 16, оно временно сохраняется в стеке и на экран выводятея символы СК
и ГЕ выполняющие переход на начало новой строки. Проверка осуществляется
командой ТЕЗТ ОГ.0ЕВ - результат операции АМЮ над ОТ. и 0ЕВ= 0, только есди
младшие четыре бита ОТ. равны нулю, что и соответствует кратности шестнаднахи.
Все функции 2О$ вывода на экран используют устройство 5ТРОТТ, стандар-
тный вывод. Это позволяет перенаправлять вывод программы в файл или на стан-
дартный ввод другой программы. Например, если написать в командной строке
1е110-1.сот > Пе110-1. оч{
Вывод на экран в текстовом режиме _ МММ
то на экране ничего не появится, а в текущей директории появится файл Бео-
1.01, содержащий строку Нео \Уой1. Точно так же, если написать
триб
0005 Черный Темно-серый ,
001 Синий Светло-синий
0105 Зеленый Светло-зеленый
01 16” -| Голубой Светло-голубой
1005 Красный у | Светло-красный
1015 Пуряурный Светло-пурпурный
1106 |Коричневый Желтый
1116 Светло-серый Белый
.то4е1 Т1тпу
. соде
ог9 1008 ; Начало СОМ-файла.
5тагт;
_ № = ах, 00038
11 108 ; Видеорежим 3 (очистка экрана
‚ ; и установка курсора в. 0, 0).
моу 9х, 0 ; ОНи 01 будут использоваться
; для хранения положения курсора.
; Начальное положение - 0,0.
тоу 31,256 ; $Г будет счетчиком цикла.
поу а1,0 ; „Первый символ - с кодом 008
оу ап, 9 °; Номер видеофункции “вывод символа с атрибутом“
ше сх, 1 : Выводится один символ за раз.
пом Ь1, 000111116 ‚ Атрибут символа - белый на синем.
-с1оор:
1 108 ; Вывести символ на экран
рузй ах - ; Сохранить текущий символ и номер функции.
|
ед ан, 2 | ; Номер видеофункции 2 -
; изменить положение курсора.
Тис 9] ` | ; Увеличить текущий столбец на 1.
1 тон : Переместить курсор
том ах, 09201 ‚ АН = 09, А = 201 (АЗСТ]Т-код пробела)
17 ‚ 108 ; Вывести пробел,
тому ай, 2 ; Номер видеофункции2.
1пс 91 - ; Увеличить столбец на 1.
пт 10. ; Переместить курсор.
рор ах ; Восстановить номер функции в аб
: И текущий символ в а].
1пс а] ; Увеличить АЁ на 1 - следующий символ.
тезт а1, ОРВ ‚ Если АЁ не кратен 16,
82 ° сопЕ1пие_1оор
| ‚ продолжить цикл.`
ризв ах ; Иначе - сохранить номер функции
| ; и текущий символ. |
мо ап, 2 ‚ Номер видеофункции 2.
1пс ЧИ . ; Увеличить номер. строки на 1.
оу 91,0 ; Столбец = 0.
Ти. 101 ‚ Установить курсор на начало следующей строки.
рор ‚ ах | ‚ Восстановить номер видеофункции `
‚ И текущий символ.
соп1пие_10оор:
` дес $1 °; Уменьшить 5Т на 1.
. ‚ Если он не стал нулем - продолжить.
712 с1оор ; СХ используется внутри цикла,
Ра
Вывод на экран в текстовом режиме ТТ|! | 139.
; так что нельзя применить команду Е00Р
; для его организации.
гет ; Завершение СОМ-файла.
епа таг
оу ах, 00038
111 101 ; Видеорежим 3 (очистка экрана).
с14 ‚ ; Обработка строк в прямом направлении.
‚ Подготовка данных для вывода на экран;
` МОУ еах, 1Е201Е00В ; первый символ 00 с атрибутом ЛЕВ,
‚ затем пробел (208) с атрибутом ЛЕВ
оу ьх, ОЕ201 ; Пробел с атрибутом ОЕВ.
оу сх, 255 ` :; Число символов минус 1.
поу 91, оГЕзет стаще ; ЕЗ:ОГ - начало таблицы,
71
ОИ ОЮИИЮЮ ИЩИ" Основы программирования для М$ 20$
с1оор:
$10$4 | : Записать символ и пробел в таблицу стае.
1пс а1 <; АЁ содержит следующий символ.
тезт сх, ОРВ ; Если СХ не кратен 16,
912 соп{1пие_1оор ; продолжить цикл.
рип сх ‚ ; Иначе: сохранить. значение счетчика.
том сх, 80-32 `; Число оставшихся до конца строки символов:
хсп9. — ах, 5х
гер $05 ; Заполнить остаток строки пробелами
; с атрибутом ОЕ.
хсН9 5х, ах ; Восстановить значение ЕАХ.
рор сх °; Восстановить значение счетчика.
соп{1пие_10ор:
1оор с1оор
‚то9е1 1пу ,
. соде
.286 ; Для команды зВг а1,4.
ого 100Н ; Начало СОМ-файла.
зтаге:
тому Чх, отРзе{ теззаде1
му ав,9
111 211 ; Вывести приглашение,ко вводу теззаде1.
мо\у 9х, оРРзеф Бийтег
по\ ан, оАВ |
ТИ 21и ; Считать строку символов В буфер.
моу 9х, оРЕзеф сг1Р
моу ап, 9 \
1 2 . : Перевод строки. |
азс_еггог: '
Те Чх’отРзет егг_пз9
пом ап,3
111 218 ‚ Вывести сообщение об ошибке
гет ‚ и завершить программу
‚ Процедура рг1пт_а1.
‚ Выводит на экран число в регистре АЁ
; В шестнадцатеричном формате,.
; модифицирует значения регистров АХ и 0%.
рг1п{_а1:
оу ЧИ, а]
апд дн, ОИ ; ОН - младшие 4 бита.
ЗПГ 21,4 ; АЁ - старшие.
са11 реп пе ‚ Вывести старшую цифру.
пом а], ЧИ ‚ Теперь АЕ содержит младшие 4’ бита.
рг1п{_п161е: ° ; Процедура вывода 4 бит (шестнадцатеричной цифры)
стр. а1, 10 | ; Три команды, переводящие цифру в АЁ
$ЬЬ, а], 69 ‚ в соответствующий АЗСТТ-код.
да$ ; (см. описание команды 0А$)
Функция ОСБ очищает буфер клавиатуры, так что следующая функция чте-
ния символа будет ждать ввода с клавиатуры, а не использовать нажатый ранее
иеще не обработанный символ. Например, именно эта функция используется для
считывания ответа на вопрос «Уверен ли пользователь в том, что он хочет отфор-
матировать диск?». .
Функции посимвольного ввода без эха можно использовать для интерактив-
ного управления программой, как в следующем примере.
‚ 903112. азт
; Изображает пентамино Е, которое можно перемещать по экрану клавишами
; управления курсором и вращать клавишами Х и 2. Выход из программы - Езс.
„тоде? пу
. соде .
огд 1008 ; Начало СОМ-файла.
Эфагт: -
с1а ‚; Будут использоваться команды
; строковой обработки. |
пом ° ах, 088001 — ‚ Адрес начала текстовой `видеопамяти -
моу ез, ах ; в Е.
оу ах, 00031
111 308 - ; Текстовый режим 03 (80х25).
моу ай, 021 ‚ Установить курсор
тоу В, 0 .
по\у ЧН, 26 | ; на строку 26, то есть за пределы экрана.
Ввод с клавиатуры 25
поу 31,1
171 108 ; Леперь курсора на экране нет.
«еу_ЕЗС: ; ЕС‘ |
гет ; Завершить СОМ-программу.
„зу ЦР: ; Стрелка вверх.
` сир Буфе ртг эТаге_гом ‚0 ; Если изображение на Верхнем
; краю экрана,
па ма1п_1оор ; считать следующую клавишу.
дес Буфе рег этагЕ_гом ; Иначе - уменьшить номер строки,
са11 ирдате_зсгееп ; вывести новое изображение
тр ЗПогЕ ма1п_1оор .; и считать следующую клавишу.
‚ Процедура ирдате_зсгееп. \
епа зТагт
. "у .
В этом примере для вывода на экран используется прямое копирование в ви-
деопамять, так как вызов функции ВТО$ вывода строки (ТМТ 101, АН = 13Ъ)
ТИМ Основы программирования для М$ 20$
прокручивает экран вверх на одну строку при выводе символа в нижнем правом
углу экрана. |
.тоде1 11пу
. соде
0г9 1008 ; СОМ-файл
этаге: ,
. тому с1,'9°’ ; С. = АЗС -код буквы “9”
са]11 упоетси .
МОУ с1,'1' ; АЗС -код буквы “1” в
са11 ипоетсв
му с1,'г’ ; АЗСТТ-код ‘буквы “г”
- Аса11 упдетси |
/ МОУ с1,001 ; перевод строки
упоетсн: | |
моу ап, 5 ; АН = номер функции
моу сп, 0 ; СН =О0 (скан-код неважен)
111 161 ; поместить символ в буфер
гет ; завершить программу
епд Уфагт
118 _ 640х480
121 640х480
320х200
.0е] $та11
„зтаск 1008: ; Явное задание стека - для ЕХЕ-программ.
‹ . соде
. 186 : Для команд 311 а1,4 и $1г а1,4.
зтагг:
ризй РАВ_855. ‹ Сегментный адрес буфера в 0$.
рор 9$
; Основной цикл.
пем_сус1е:
% Зак. 459
| Основы программирования для М5 205. |
СХ = первый изображаемый пиксел в строке (для ВГ. = 80В)`
.Х = первая изображаемая строка (для В1. = 801)
Выход: АГ.= 4ЕВ, если функция поддерживается
АН = 01, если произошла ошибка `
АН = 00, если функция выполнилась успешно
ВН = 00 (для ВИ. = 00)
СХ = первый изображаемый пиксел в строке (для ВТ. = 00)
ОХ = первая изображаемая строка (для ВТ. = 00)
С помощью этой функции можно выполнять как плавный сдвиг экрана, пере-
мещая начало изображения на одну строку за один раз,так и быстрый показ двух
разных изображений, изменяя одно, пока на экране находится другое, — своего
рода эффект плавной анимации.
авт
; 3Сго1]13. |
‚ Изображает в разрешении 1024х768х64К окрашенный конус, который можно |
; плавно перемешать по экрану стрелками вверх и вниз.
.104е1 \1пу
.собе. . .
. 386 В ; Используется команда $ПгГ@.
ог9 100% ‚ СОМ-файл.
таг: . . .
моу ах, 4ЕО1В ; Получить информацию о видеорежиме.
моу сх, 1161 - ; 1024х768х64К
тоу 91, оРРзет мбе_тоде_Би!ГТег
1 . 108
‚ Здесь для простоты опущена проверка наличия режима.
оу ах, 47021 | ‚ Установить. режим.
оу ьх, 1161 |
10 108 | | | .
ризй мог рАг [УБе_поде_рБиЁТег+8] |
рор е$ ра Поместить в Е5 адрес начала видеопамяти
, . (обычно А000П).
с19
.1оде1 лу
. соде
ого 1008 СОМ-файл.
. 186 Для команды эйг сх,3.
эТагт:
моу ах, 12Н
Ти 1оН Видеорежим 640х480.
ие ах.0 Инициализировать мышь.
111 338
моу ах,1 Показать курсор. мыши.
11 ЗЗВ
папа] ег: :
ризп 0А0О0В
рор е5 ЕЗ - начало видеопамяти.
и
ризй 65
_ рор 9$ 0$ - сегмент кода и данных этой программы.
рузп сх СХ (Х-координата) и ОХ. (У-координата)
ризп 9х потребуются в конце.
-:пе_Ьгезеппаю:
У ах, сх
зи ах, ргеу10и$_Х АХ = длина проекции прямой на ось Х.
]пз 9х_роз Если АХ отрицательный -
пед ах сменить его знак, причем
оу мог@ рЕг Х_1псгетепт, 1 координата Х при выводе
тр ЗВогЕ 9х_пед прямой будет расти.
:'_00$: МОУ мога рфг Х_1псгетепт,-1 Иначе - уменьшаться.
пед: моу Ьх, 9х
$и6 Ьх, ргеу1оиз_У ВХ = длина проекции прямой.на ось У.
]п$ Чу_роз Если ВХ отрицательный -
пед Ьх сменить его знак, причем
оу мог4 рег У_1псгемепт,1 координата У при выводе /
тр ЗПогЕ Чу_пед прямой .будет расти.
т. роз: поу мог руг \У_1псгетепт,-1 Иначе - уменьшаться.
№! Основы программирования
для М$ 005$
ада дх, мог раг У 1псгетепт ; перейти к следующему У
зи6 91, ах ‚ и уменьшить 0Т на 2 * 9х.
Ёгаст1 10: у
а93 сх, мога рфг Х_1псгетепе ; Следующий Х (на каждом шаге).
а94 91, 5х ; Увеличить ОТ на 2 + ду.
‚ са1 1 ритр1хе1 1. ; Вывести точку.
ар эпогЕ сус1е ; Продолжить цикл.
ритрухетль:
ризва = . ; Сохранить регистры.
хог Ьх, 6х .
пом ах, 4х ; АХ = номер строки.
1ти ах, ах, 80 ; АХ = номер строки х число байтов в строке.
ризН сх | _
‘8Вг сх, 3 | “СХ = номер байта в строке. `
ава ах, сх -:! АХ = номер байта`в видеопамяти:
‚ 0 91, ах ; Йоместить его в. ЭТ и ОТ для команд": ^
бу , 51,91 .`. 4 строковой обработки. .
мо 91, 320*200
поу сх, 6008 ; Заполнить часть видеопамяти, .
` ; остающуюся за пределами
гер ЗТозЬ ; экрана, ненулевыми значениями
р $ (чтобы питон не смог’выйти за
, ; пределы экрана).
хог $1, $1 | ; Начальный адрес хвоста в 0$:51..
том р, 10 ‚: Начальная длина питона - 10.
Этр пи 009 ‚ Создать первую еду. |
та1п_сус]е:
‚: Использование регистров в этой программе:
; АХ - различное. °
ВХ - адрес головы, хвоста или еды на экране.
СХ - 0 (старшее слово числа микросекунд для функции задержки).
; ОХ - не используется (модифицируется процедурой гапбот).
; 0$ - сегмент данных программы (следующий после сегмента кода).
; ЕЗ - видеопамять.
; 0$:0Т - адрес головы.
; 0$:$Т - адрес хвоста. |
; ВР - добавочная длина (питон растет, пока ВР > 0; ВР уменьшается на каждом
; шаге, пока не станет нулем). |
моу ` ах, 20000 ; Пауза - 20: 000 мкс.
тоу ан, 861 . <; (СХ =0 после ВЕР. 51088
Г. ; и больше не меняется)
| 11 151 . ; Задержка.
| моу ап, 1 ‚ Проверка состояния клавиатуры.
171 161 _ | В
7 зПогЕ по_Кеургезз ; Если клавиша нажата -
хог . ап, ай ; АН=О0 - считать’ скан-код
10 ^ 168 `; нажатой клавиви в АН.
стр ап, 488 ; Если это стрелка вверх,
зле эПогф поф_ир ‚
тоу могд рфг сз: тоуе_Ч1гест1оп,
-320 ; изменить
‚ направление движения на “вверх”.
у
тоуе_могт;: . :
моу [91], 6х ; Поместить адрес головы в 05:01
11с 91
1пс 91 ; и увеличить ОТ на 2.
оу Буте руг ез:[6х],09 ; Вывести точку на экран.
стр ‚ Бу рёг сз:еатеп_Тооа,1 ; Если предыдущим
| ‚; ходом была съедена`еда -
Другие устройства. ГД ПОНИИСУ
3]е 1{_еатеп_4009 создать новую еду.
тр зпог - пай п_бус1е Иначе - продолжить основной цикл.
170 мог:
. ризй Ьх у = Сохранить адрес головы.
оу 6х, мог4 рег с$:10049_ат ВХ - адрес еды,
хог ах, ах _ АХ = 0.
са11 Чгам_Роо@ Стереть еду.
са! 1 гапдот АХ - случайное число.
апд ах, ЗРВ _; АХ - случайное число от 0 до 63.
мо Бр, ах : Это число будет добавкой
| к длине питона. |
оу Буте рёг сз:еатеп_Тоод, 1 Установить флаг
; для генерации еды на следующем ходе.
рор Ьх , Восстановить адрес головы ВХ.
пр зНогт тоуё_могт Перейти к движению питона.
Процедура Чгам_Тоо8.
Изображает четыре’ точки на экране - две по адресу ВХ и две на. следующей
строке. Цвет первой точки из пары - АЁ, второй - АН.
дгам_Роо4:
` тоу ез:[Ьх},ах
ОУ могд ртг ез: [6х+320],ах
гетп._
; Генерация случайного числа. ‘ .
; Возвращает число в АХ, модифицирует:
ОХ.
еатеп_Тоод а6 0 Са
тоуе_091гест10оп м 1 ° ; Направление движения: 1 - вправо,
; -1 - влево, 320 - вниз; -320 - вверх.
зеед: ; Это число хранится за концом программы,
Ро0д_а+ еди 3ее4+2 ; а это - за предыдущим.
епд зтагт |
.1о4е1 лу
‚„соде .
огд 100Н | ; Начало СОМ-файла.
эТагт:
оу ав, 0 ‚ Инициализировать порт.
ей а], 111000116 ; 9600/8п1
по\у 9х, 1 ; Порт С0М2.
и 148
па1п_1оор:
пом ай, 2 |
111 148 ; Получить байт от модема, .‹
Тезт ан, ав ; Если что-нибудь получено,
912 по_1прит _.
т - 291 ; вывести его на экран,
по_1прит: : ; Иначе:
тоу ап, 1
11 161 , ‚ проверить, была ли нажата ‘клавиша.
ре па1п_100ор ‘°`’'’': Если да: о ь
оу ап,8
11 211 т считать ее Код (без’ отображения на экране).
тезт а1,а1 ; Если это нерасширенный АЗСТТ-код -
Другие устройства = = = МИ
312 зепд_спаг ; отправить его в.модем. . ;
_1и 218 ; Иначе получить расширенный АЗСТТ-код.
стр а1, 208 „ Если ‘это А1Т-Х
те зепв_спаг | |
гет ; завершить программу.
зепд_сваг: .
мо ав, 1 , .
17 148 ‚ Послать введенный символ в модем.
Эр зпогЕ пазп_1оор ; Продолжить основной цикл.
епд Зфагт
2. ‚тоде1 1ту
. соде
.186 ° . ; Для команды ризв 08800Н.
ог9 100н ` ; Начало СОМ-файла.
эТагт: | :
ЮУ ап, 1 .
моу ‚9х, 0 ; Порт ЕРТЛ:
т о В ; Инициализировать принтер.
стр ав, 908 ; Если принтер не готов,
‚ пе рг1пег_еггог ; выдать сообщение об. ошибке... . с
ризН 088001 ; Иначе: |
рор д ; 0$ = сегмент видеопамяти в текстовом‘ режиме,
хог $1, 31 ‚ ЗР= 0, , | `
то сх, 80*40 ; СХ = число символов на ‘экране.
с14 ; Строковые операции вперед.
та1п_1оор:
104$и ‚АБ - символ, АН - атрибут, 1 = $Г + 2.
тому ав, 0 ; АН - номер функции.
10 . ТТ ; Вывод символа из АЁ на принтер.
1юор ма1ип_1о0р
гет . ; Закончить программу.
рг1пТтег_еггог:
моу _ 9х, оРРзет 39 ; Адрес сообщения об ошибке в 05:0Х.
моу ав,9
17 РА ; Вывод строки на экран.
гет
.09е1 “1лу
. соде в с В д:
ога. 1000 ‚:. ; СОМ-файл
зтагт: | —. | |
лоу ^ ап,4 ^^ о ’’_”, Поиск первого файла.
. ХОГ сх, сх‘ В ‚ Не системный, не директория ит. д.
по\ 9х, отРзет` Г11езрёс ; Маска дяя поиска в 05:0Х.
Работа с файлами
*1]е_ореп:
11 ан
. © по_моге_#11ез ; Если СЕ = 1 - файлы кончились. |
тоу ах, 30021 ; Открыть файл:для чтения и. записи.
то 9х, 8ОН+1ЕВ .: Смещение ОТА + смещение ‚имени файла
1м 211 ; от начала БТА.
3с пот_ореп ; Если файл не открылся - перейти
; к следующему.
; ‘Записать в файл.
211
тр ЗногЕ ‘геад_пеху ‚ Считать следующий байт.^
ра
Е1пд_пех{:
му ап, ЗЕ. ; Закрыть. предыдущий файл.
и 21В
по{_ореп:
моу ап, 4Р\ `; Найти ‘следующий файл.`
поу 9х, 801 ; Смещение ОТА от начала Р5Р.
тр НОГЕ 1#1]е_ореп
обращались к памяти за концом программы, считая, что там имеется еще хотя
7 Зак. 459
ИИ Основы программирования для М$.00$
(аналог стандартной функции языка С таПос), изменение его размеров (аналог
геаПос) и освобождение (#гее).
Функция 2О5 48#: Выделить память
Вход: АН = 486
ВХ = размер блока в 16-байтных параграфах
Выход: СЕ = 0, если блок выделен
| АХ = сегментный адрес выделенного блока
СЕ = 1, если произошла ошибка:
АХ = 7 - блоки управления памятью разрушены
АХ = 8 - недостаточно памяти: =
ВХ - размер максимального доступного блока
Эта функция с большим значением в ВХ (обычно ОЕЕЕЕВ) используется
для
определения размера самого большого доступного блока памяти.
Функция 20$ 491: Освободить память
‚Вход: АН = 498
Е$ = сегментный адрес освобождаемого блока
®
Выход; СР = 0, если блок освобожден
СЕ=1, АХ = 7, если блоки управления намятью разрушены;
.
АХ= 9, если в Е5 содержится неверный адрес
Эта функция не позволит освободить блок памяти, которым текущая програм-
_ма не владеет, но с помощью функции ОО$ 506 (АХ= 50, ВХ = сегментный ад-
рес РЗР процесса) программа может «притвориться» любым другим процессом.
Функция 2О5 4Ай: Изменить размер блока памяти
Вход: АН = 4АБ
ВХ = новый размер в 16-байтных параграфах
Е$ = сегментный адрес модифицируемого блока
Выход: СЕ = 1, если при выполнении операции произошла ошибка
АХ = 7, если блоки управления памятью разрушены
АХ = 8, если не хватает памяти (при увеличении)
АХ= 9, если Е$ содержит неверный адрес
ВХ= максимальный размер, доступный для этого блока
‚Если для увеличения блока не хватило памяти, ВО$ расширяет его до возмож-
ного предела.
При запуске СОМ-программы загрузчик ОО$ выделяет самый `большой до-
ступный блок памяти для этой программы, так что при работе с основной памятью
эти функции требуются редко (в основном для того, чтобы сократить выделен-
ный программе блок памяти до минимума перед загрузкой другой программы),
но уже в М$ РО$ 5.0 и далее с помощью этих же функций можно выделять па-
мять в областях ОМВ - неиспользуемых участках памяти выше 640 Кб и ниже
1 Мб, для чего требуется снёчала подключить ОМВ к менеджеру памяти и изме-
нить стратегию выделения памяти с помощью функции РО$ 581.
Управление памятью _ —_ 95,
4.9.2, Область памяти ИМВ
Функция 2О$ 581: Считать/изменить стратегию выделения памяти
Вход: АН = 58В
АТ, = 001— считать стратегию
АТ, = 01Ъ - изменить стратегию
ВХ - новая стратегия
биты 2-0:
00 — первый подходящий блок
01 - наиболее подходящий блок
11 — последний подходящий блок |
биты 4-3: `
00 — обычная память
01 - ОМВ (00$ 5.0+) ,
10 - ОМВ; затем обычная память (РО$ 5.0+).
АТ, = 02 - считать состояние ОМВ
АГ. = 03 - установить состояние (МВ
ВХ = новое состояние: 00 — не используются, 01 — используются
Выход: СЕ=0, АХ = текущая стратегия для АТ. = 0, состояние МВ для АГ. =.2
СЕ - 1, АХ = 01Ъ, если функция не поддерживается (еслине запущен
менеджер памяти (например, ЕММЗ386) или нет строки
20$ = ОМВ в СОМЕ!С.5У5)
Если программа изменяла стратегию выделения памяти или состояние ОМВ,
она обязательно должна их восстановить перед окончанием работы.
4.9.3, Область памяти НМА
Область памяти от ОЕЕЕЕБ:0010В (конец первого мегабайта) до ОЕЕРЕВ:ОЕЕЕЕЬ
(конец адресного пространства в реальном режиме), 65 520 байт, может исполь-
зоваться на компьютерах, начиная с 80286. Доступ к этой области осуществля-
ется с помощью спецификации ХМ$5, причем вся она выделяется целиком од-
ной программе. Обычно, если загружен драйвер ННМЕМ.5У$ и если в файле
СОМЕГС.5У$ присутствует строка 2О$ = НТСН, РО$ занимает эту область, осво-
бождая почти 64 Кб в основной памяти. При этом ОС может оставить небольшой
участок НМА (16 Кб или меньше) для пользовательских программ, которые обра-
щаются к нему с помощью недокументированной функции мультиплексора ААВ.
[МТ 28, АХ - 4А01Ь: Определить размер доступной части НМА (20$ 5.0+)_
Вход: АХ = 4АО№ .
Выход; ВХ = размер доступной части НМА в байтах, 0000}, если 20$ нев НМА
Е$:01 = адрес начала доступной части НМА (0ЕЕРЕВ:ОЕЕЕЕЬ, если
рРО$ нев НМА)
ГУТ 2Е1, АХ = 4А028: Выделить часть НМА (20$ 5.0+)
Вход: АХ = 4А02Ь \
ВХ = размер в байтах .
ЕЕИНИИ И" Основы программирования для М$ 20$
„Выход: Е5:0Т = адрес начала выделенного блока
ВХ =размер выделенного блока в байтах
В версиях 00$ 5.0 и 6.0 нет функций освобождения выделенных таким обра-
зом блоков НМА. В РО5 7.0 (\Мтдо\з 95) выделение памяти в НМА было орга-
низовано аналогично выделению памяти в обычной памяти и ОМВ, сфункциями
- изменения размера и освобождения блока.
[МТ 2Е), АХ = 4АОЗЙ: Управление распределением памяти в НМА (20$ 7.0+)
Вход: АХ = 4А03ЗЬ
ОТ. = 0 - выделить блок (ВХ = размер в байтах)
ОТ. = 1 - изменить размер блока (Е5:01 = адрес, ВХ = размер) ‘
Следует помнить, что область НМА доступна для программ только в том
@©® случае, когда адресная линия процессора А20 разблокирована. Если ОО$ не
занимает НМА, она практически постоянно заблокирована на совмести-
мость с программами, написанными для процессора 8086/8088, которые
считают, что адреса ОЕЕЕЕР:О0010Ё— ОЕЕЕЕР:ОЕЕЕЕЙ всегда совпадают
с ООООР:0000Е —ОбООВЕЕЕЕЙ. Функции ХМ5 01-07 позволяют управлять
состоянием этой адресной линии. .
.тове1 пу
‚ с0де
. 186 ; Для команд сдвига на 4.
ог 1008 ‚ С0М-программа.
эфагт: .
с14 ‚Команды строковой обработки будут выполняться вперед.
мо ап, 461
1% 67Н ‚ Получить версию ЕМ5.
тез ап, ан -
912 по_ет$ , : Если ЕМ5 выдал ошибку - не стоит продолжать
| ; с ним работать.
том ап,а1
‚ ап а1, ЕВ ‚ АЁ = ‘старшая цифра.
[48 ай,4 - ; АН = младшая цифра. .
са]1, оутри{_мегз1оп ; Выдать строку о номере версии ЕМ$..
по_етё г ‚
пом ан, ЗЕй р
Че 21п ; Закрыть файл/устройство ЕММХХХХО.
по_етих:, `
; Проверка наличия ХМ5.
зитрит_1пРо:
ризй ах
поу ах, 9х ; Объем всей памяти в АХ.
оу Бр, оРРзег тота1тет” ; Адрес строки - в ВР.
са11 оифри{_1пто1 ; Вывод.
рор ах у ‚ Объем свободной памяти - в АХ.
моу Бр, $1 - ‚ Адрес строки - в ВР.
Бех24ес
Преобразует целое двоичное число В АХ.
В строку десятичных АЗСТТ- цифр. в ЕЗ:0Т, заканчивающуюся СИМВОЛОМ “$”.
тоу Ьх, 10 — ; Делитель в ВХ.
. хог , сх, сх | . ; Счетчик цифр в 0.
34\1р: ^ хог ах, ах |
91% Ьх ‚ Разделить преобразуемое число на -10,
ааЧ 91, '0’ | ; ‘добавить к остатку АЗСТТ-код нуля
ризй 9х ” ; записать полученную цифру в стек. у
Тис сх - | ; Увеличить счетчик цифр
тезт ахах — - ; и, если еще есть, что делить,
дп2 91\1р . : продолжить деление на 10.
${оге: |
рор ах : Считать цифру из’ стека.
то ‚ Дописать ее в конец строки в Е: ВТ.
]оор зтоге - ; Продолжить для всех СХ-цифр.
оу Бузе ртг е$:[91],'$° ; Дописать '$’ в конец строки.
.тоде1 11пу
. соде
р | , |
‚ 186
ог9 1008 —_ ; СОМ-программа
эТагт: | |
моу зр, ето В_о{_ргодгат+1001+2008 ; Перемещение ‘стека на 2001
; после конца. программы
‚ (дополнительные 1008 - для РУР)..
ШИ! Основы программирования для М5 20$
МОУ ` ав, 4АВ
зТаск_з1111=1еп9*Н_оР_ргодгат+100Н+200В
оу ‚ Бх, зтаск_зВ1Р эпг 4+1
11 218 ; Освободить всю память после конца
программы и стека,
па? п_1оор:
сир
ле
буте ртг соттапа_БиРег+1, 0
та1п_1оор
‚ Если введена
‚ продолжить
пустая
основной
строка,
цикл.
Загрузка и выполнение программ И.| | 207
Проверить, является ли введенная команда командой “ех1т”.
/
Командная строка и переменные ПИ НЕМА
; например: , ...
; сафт пеадег *.{хт Гоотег > а11-{ех{$ помещает содержимое файла
; Веадег, всех файлов с расширением .1ХЕ в текущей директории и файла
. Тоотег - в файл а1]-тех*$.
; Длинные имена файлов не используются, ошибки игнорируются.
.тоде1 11пу
;с0де
ог9 801 . По, смещению 801 от начала РЗР находятся:
стд_епа&А 96 ? ‹ длина командной строки
ста_11пе 96 ? ; и сама командная строка,
ог9 1008 ; Начало СОМ-программы - 1001 от начала РЗР.
ЗТагт: _. .
- 61а — .; Для команд ‘строковой’ обработки:
оу ор, зр ‚_ ; Сохранить текущую вершину стека в ВР.
оу с1, ста_Тепотн |
©тр с], 1 | ; Если командная строка пуста -
` Де пом. изаде ‚ вывести информацию о программе и выйти.
{1п9_рагам:
му а1,’' ; Искать первый. символ, —
герг зсазЬ ‚ не являющийся пробелом. | .
дес 91 ; 01 - адрес начала очередного параметра.
ризй 91 ; Поместить его в стек
1пс мога рог агае ; и увеличить агдс на один.
том $1, 91 , ; $1 = 01 для следующей команды 104935.
эсап_рагамз: | ,
10936 ‚ Прочитать следующий символ из параметра.
стр а1, 008 ; Если это ООбн`- это’был последний параметр
]}е рагаяз_епдед9 — ; и он кончился. т
стр а1, 20н ‹ Если это 208 - этот параметр кончился,
3 пе зсап_рагамз ; но могут быть еще.
ЗВои_изаде;
моу ав,9 Функция 00$ ОЭН..
поУ 9х, оРРзет изаде
111 218 Вывести строку на экран.
гет р Выход из процедуры.
Процедура оифри+_Роипа.
Выводит в ${90ит файл, имя которого находится в области ОТА.
Командная строка и переменные _ ПМ
сифри*_Тоипа:
поу 9х, отЕзет ОТА+ТЕН: Адрес А$С17-строки с именем файла.
моу ах, 3000Н ; Функция 00$ 301:
11 218 ; открыть файл (а1 = 0 - только на чтение).
3°` ЗК1р_Р1е ; Если ошибка - не трогать этот файл.
моу Ьх, ах ‚ Идентификатор файла - в ВХ.
му 91,1 ‚ ОТ будет хранить идентификатор 5ТООЦТ,
9о_очтрит:
пу сх, 1024 . Размер блока для чтения файла.
моу @х, оРРзет 0ТА+45°; Буфер для чтения/записи располагается за концом -ОТА.
тоу ан, ЗЕ! | ‚ Функция 00$ ЗРЕП.
117 211 ; Прочитать 1024 байта из файла.
3с #]е_9допе ‚ Если ошибка - закрыть файл.
„МОУ сх, ах . ; Число реально прочитанных байтов»в СХ.
сх? тПе_допе = ; Если это не ноль - закрыть файл.
Размер блока для чтения файла можно значительно увеличить, но в таком слу-
чае почти наверняка потребуется проследить за объемом памяти, доступным для
программы.
СТР ТРУТТР
‚ Для сложных условий часто оказывается, что одной командой условного пере-
хода обойтись нельзя, поэтому реализация проверки может сильно увеличиться.
Например, следующую строку на языке С
; Проверка условия.
оу ах,А
стр ах,В
пе ТВеп ‚ Если а! = 6 - условие выполнено.
поу ах,Х
стр ^ ах,у
19 еп Е ; Если х < или = у - условие не выполнено.
оу ах,2
“стр ‘‘ах.т
1 епб1® —; Если 2 >‘или`= н = условиб не выполнено.
=
ТАеп: , | <; Условие выполняется,
7 м 40 о |
тоу С, ах _
епё1Г: | о . ты .
5.1.2. Структуры СА$Е
- `Управляющая структура типа СА$Е проверяет значение> некоторойИ перемен-
ной били выражения) и передает: управление на: различные ‘участки программы:
Кажется очевидным, что эта`структура должна’реализовываться в виде серии
структур ГЕ.. ТНЕМ... 'ЕЁЗЕ, как показано в примерах) тде:требовались различные
действия в зависимости от Значения нажатой клавишги; :
Пусть переменная 1 принимает значения от 0:до 2, и-в зависимости от значе-
ния надо выполнить процедуры сазед, сазе] и сазе2; 2... :
= му ах, ИИ аа | .
| стр. ах, 0 ср Проверка на 0. | 7 : | а
’упе поф0 |
са11 сазед ° и. а Е воЬ,
. пр епсазе. `. \
ото: стр ах, 1 - з Проверка на 1. ^` -
дпе по+1 ,
са] сазе1
ар епасазе : : -.
пот1: стр ах,2 . ;. Проверка на 2.
| пе пот2 т
са11 сазе2
пота:
епдсазе:
5. 1.4. Циклы
лов, они годятся только для одного типа циклов — ЕОК-циклов, которые ВЫПОЛ-
НЯЮТСЯ фиксированное число раз: В общем виде любой цикл записывается в ас-
УННЕ--ЦИКЛ:
. (команды инициализации цикла)
метка: ТЕ (не выполняется условие ‘окончания цикла)
ТНЕМ .
{команды тела цикла)
]тр метка
ВЕРЕАТ/ИНТИ цикл: ,
(команды инициализации цикла)
метка: (команды тела цикла)
ТЕ (не выполняется условие _ окончания цикла)
ТНЕМ {переход на ‘метку)
ГООРИЕМОТ-ООР--цикл;
{команды инициализации ‘цикла)
метка:
(команды тела цикла)
ТЕ (выполняется условие окончания цикла) _
ТНЕМ )тр метка2
(команды тела цикла).
тр метка
метка2:
РЕЗ ИИ ИН! ’ Сложные приемы программирования
5.2. Процедуры и функции
Можно разделять языки программирования на процедурные (С, Разса1|,
Еоггап, ВАЗГС) и непроцедурные (115Р. ЕОВТН, РКОТОС), где процедуры -
блоки кода программ, имеющие одну точку входа и одну точку выхода и возвра-
щающие управление на следующую команду после команды передачи управле-
ния процедуре. Ассемблер одинаково легко можно использовать как процедурный
язык и как `непроцедурный, и в большинстве примеров программ до сих пор мы
успешно нарушали рамки и того, и другого подхода. В настоящей главе реализа-
ция процедурного подхода рассмотрена в качестве наиболее популярной.
Ов регистрах;
Ов глобальных переменных;
Ов стеке; `
О в потоке кода;
Ов блоке параметров. р
Следовательно, всего в ассемблере возможно 30 различных способов передачи
параметров для процедур. Рассмотрим их по порядку. |
Передача параметров по значению
Процедуре передается собственно значение параметра. При этом фактически
значение параметра копируется, и процедура использует его копию, так что мо-
дификация исходного параметра оказывается невозможной. Этот механизм при-
меняется для передачи небольших параметров, таких как байты или слова, к при-
меру, если параметры передаются в регистрах: | г:
тоу ах, мог рфг уа1ие ; Сделать копию значения. ..
са11 ргоседиге ; Вызвать процедуру.
Передача параметров по ссылке ,
Процедуре передается не значение переменной, а ее адрес, по которому проце-
дура сама прочитает значение параметра. Этот механизм удобен для передачи
1
Процедуры и функции МЕХ
больших массивов данных и втех случаях, когда процедура должна модифициро-
вать параметры (хотя он и медленнее из-за того, что процедура ‘будет выполнять
дополнительные действия для: получения значений параметров).
° оу ах, оРзет уа1ие | о .
.са11 ‚„ргоседиге- :
разз_бу_пате уа1ие
са11 ргоседиге.. о
Примерно так же поступают языки программирования высокого уровня, под-
держивающие этот механизм: процедура получает адрес специальной функции-
заглушки, которая вычисляет адрес. передаваемого по.имени параметра.
‚ РЕЗИВШШИИИНИИИ | — Сложные приемы программирования
Передача параметров отложенным вычислением
Как и в предыдущем случае, здесь процедура получает адрес функции, вычис:
ляющей значение параметра. Такой механизм удобен, если вычисление значения
параметра требует много ресурсов или времени, например, если функция. должн:
’ выбрать один из нескольких ходов при игре в шахматы, вычисление каждого пара-
‚ метра может занимать несколько минут. Во время передачи параметров отложен:
ным вычислением функция получает адрес заглушки, которая при первом обраще:
нии к нейвычисляет значение параметра и сохраняет его во внутренней локальной
переменной, а при дальнейших вызовах возвращает ранее вычисленное значение.
Если процедуре вообще не потребуются значения части параметров (например,
если первый же ход приводит к мату), то использование отложенных вычислений
способствует выигрышу с большей скоростью. Этот механизм чаще всего приме-
няется в системах искусственного интеллекта и операционных системах.
Рассказав об основных механизмах передачи параметров процедуре, рассмот-
рим теперь варианты, где их передавать.
”Передача параметров в регистрах ,
Если процедура получает небольшое число параметров, идеальным местом для
их передачи оказываются регистры. Примерами служат практически все вызовы
прерываний РОЗ и ВТО. Языки высокого уровня обычно используют регистр
АХ (ЕАХ) для того, чтобы возвращать результат работы функции.
Передача параметров в глобальных переменных
Когда не хватает регистров, один из способов обойти это ограничение — запи:
сать параметр в переменную, к которой затем следует обращаться из процедуры.
Этот метод считается неэффективным, и его использование может привести к тому,
что рекурсия и повторная входимость станут невозможными.
Передача параметров в. стеке
_ Параметры помещаются в стек сразу перед вызовом процедуры. Именно этот
метод используют языки высокого уровня, такие как С и Разса]. Для чтения пара-
метров из стека обычно применяют не команду РОР а регистр ВР, в который по-
мещают адрес вершины стека после входа в процедуру:
ризв рагатетег1* | ; Поместить ‘параметр’ в. стек.
рузн рагатетег2 .
са11 ргоседиге
а9д зр, 4 2. ; Освободить’
стек от параметров:
[...} |
ргоседиге ргос пеаг
‚ рызН.. ..,.Бр, |
пом Бр, р :
(команды, которые могут использовать стек)
тому ах, [6р+4] ; Считать параметр 2.
‚; ЕГо адрес в сегменте стека ВР + 4,’потому что при выполнении команды САН.
; в стек поместили адрес возврата -`2 байта для процедуры
‚ типа МЕАН (или 4 - для РАВ), а’ потом еще и`ВР - 2 байта.
‘Процеду
и функции
ры о МЕТ
том Ьх, [6р+6] ‚ ‹; Считать. параметр 1.
(остальные команды) _
рор ор .
—_ ге*
ргоседиге епдр
‚рузП Х
. ризп У
ризп 2
са11 ху22у
[...}.
ху22у — ргос пеаг`
Ху27у_7 еди [5р+8
хуггу-у еду —^ [6^+6]
ху2ту_х. ди ‚[6р+4]
риузй Ыр
оу Бр, 5р. `
. (команды, которые могут использовать стек)
моу ах, ху2?у_х ‚Считать параметр. Х.
(остальные команды) | :.
рор Бр
гет 6
ху27у епар
„Внутри процедуры ГооЪаг стек будетзаполнен ‘так, как показано на рис. 16.
Последовательности команд, используемые в начале и в конце названных проце-
дур, оказались настолько часто применяемыми, что в процессоре 80186 были введе-
НЫ специальные команды ЕМТЕК и ГЕАХУЕ, выполняющие эти же самые действия:
Рообаг - ргос пеаг : ;
Областьв стеке, отводимая для локальных перемен- © Рис. 16. Стек при
ныхэместе сактивизационной записью, называется сте- вызове процедуры
ковым кадром. о. юоБаг ..
№"
ыы — ссылка
ОИ
Рис. 17. Стек процедуры со статическими ссылками
Здесь считается, что в сегменте данных определен массив слов 41зр1ау, имею-
щий адреса последних использованных активизационных записей для каждого
уровня вложенности: 41зр!ау[0] содержит адрес активизационной записи нулево-
го уровня, 41зр]ау{2] - первого уровня и так далее (для близких адресов)..
Команды ЕМТЕВ и ГЕАУЕ можно использовать для организации вложеннос-
ти с дисплеями, но в такой реализации дисплей располагается не в сегменте дан-
ных, а в стеке, и при вызове каждой процедуры создается его локальная копия.
; ещег №,4 (уровень вложенности 4, М байтов на стековый кадр) эквивалентно набору команд
ризй © Бр _; Адрес записи третьего. уровня.
рызв [Ьр-2] у
ризй - [6р-4] . А
ризн [6р-6]
ризй [6р-8] ‚ Скопировать дисплей.
пом Ор, эр ;
а94 Бр, 8 ; ВР = адрес начала дисплея текущей записи.
$и6 зр, № ; Выделить кадр для локальных переменных.
моу еах
‘Змога рег 610%а1_3[8], о
5.4.2. Сравнение | | `
Поскольку команда сравнения эквивалентна команде вычитания (кроме того,
что она не изменяет значение приемника), можно было бы просто выполнять вы-
читание. чисел повышенной точности и отбрасывать результат, но сравнение вы-
полняется и более эффективным образом. В большинстве случаев для определе-.
ния результата сравнения достаточно сопоставить самые старшие слова (байты
или двойные слова), и только если они в точности равньь потребуется сравнение
следующих слов.
8 Зак. 459
|! — Сложные приемы программирования
; Сравнение 96-битных -чисел -519\а1_1 и Ь109\а1_2. в `,
МОУ | вах, @ыога руг 619\а1_1[8], .
стр. еах, Чиог4 руг 619%а1_2[8]; Сравнить старшие слова.
и огеатег `
1 ]е55 у
пом еах, Чиогд рфг 619%а1_1[4}
стр вах, Чмог@ ртг` 619%а1_2[4}; Сравнить средние :слова,
19.’ `. дгеатег: ” в
31 1е5$ .
поУ вах,дмога рег 619уа1_1 . | ‘
стр „вах, диога руг. 619%а1_2 ; Сравнить младшие слова.
79 дгеатег .
д 1е5$
едиа]:
огеатег:
]езз:
5.4.3. Умножение
Чиобы умножить числа повышенной точности, придется вспомнить правила
умножения десятичных чисел в столбик: множимое.умножают на каждую цифру
множителя, сдвигают влево на соответствующее число разрядов и затем склады-
вают полученные результаты. В нашем случае роль цифр будут играть байты, сло-
ва или двойные слова, а сложение должно выполняться по правилам сложения
чисел повышенной точности. Алгоритм умножения оказывается заметно сложнее,
поэтому умножим для примера только 64-битные числа:
; Беззнаковое умножение двух 64-битных чисел (Хи У) и сохранение
; результата в 128-битное число 7.
му еах, @мог4 ртг Х
ту =® еБбх,еах |
ми] 9мога рег У ; Перемножить младшие двойные слова. '
Де Чмога рфг 2, еах ; Сохранить младшее слово произведения.
оу есх,едх ^’ ’ ; Сохранить старшее двойное слово.
поу еах, ебх ; Младшее слово “Х” вах. :.
‚ МиТ Фиот9 рег \[4] ; Умножить младщее слово на старшее.
ада. ‚ еах,есх.
адс `е9х,0 ‚ Добавить перенос. .
оу еБх, еах ; Сохранить частичное произведение.
МОУ есх, еах |
том вах, Зиога ртг Х[4] .
ми диога рег У ; Умножить старшее ‘слово ‘на младшее.
’ а99 ‚вах, ебх . ; Сложить с частичным произведением,
мо\ Ч9иога рфг 2[4},еах |
аЧс есх, едх
том еах, Чиога рег ХЁ4]
ми Чиога рег \[4] ‚ Умножить старшие слова,
а49 = вах, есх ; Сложить с’ частичным `произведением
адс едх, 0 ; и добавить перенос. |
оу мога рег 2[8],еах °
том мог рфг’ 7[12], едх
Арифметика повышенной точности 8
Для выполнения умножения со знаком потребуется сначала определить знаки
множителей, изменить знаки отрицательных множителей, выполнить обычное
умножение и изменить знак результата, если знаки множителей были разными.
5.4.4. Деление
Общий алгоритм деления числа любого размера на число любого размера
нельзя построить с использованием команды ПТУ- такие операции выполняют-
ся при помощи сдвигов и вычитаний и оказываются весьма сложными. Рассмот-
рим сначала менее общую операцию (деление любого числа на слово или двойное
слово), которую можно легко осуществить с помощью команд ОТУ:
Деление 64-битного числа: 91\у14епт на’ 16-битное число 91\150г.
; Частное помещается в 64-битную переменную диотепт,
; а остаток - в 16-битную переменную моди1о.
МОУ ах, могд рёг 91\14еп1[6]
хог 9х, ах
_ 91% 91%1$0г у
- ОУ мог@ ртг диофепт[6}], ах:
; МОУ ах, мога ртг. 91\14епт[4}
91% ` 9113 0г-
моу мога рег. диотей([4], ах.
_ МОУ ах;могв руг оулдете2]
Чу 91\150г | ,
оу мог рег отв [2] ах -
по ах,мога руг 91м14етт _- |
91у 91\1$0г
мо мог ртг дуотепт,ах
моу моди1о,9х
5.5.2. Умножение
р При выполнении этого действия следует просто помнить, что умножение 16-бит-
ных чисел дает 32-битный результат, а умножение 32-битных чисел — 64-битный ре-
зультат. Например, пусть ЕАХ и ЕВХ содержат числа с фиксированной запятой
в формате 16:16; ^ | |
ЕО |
ной запятой
‚ Вычисления с фиксирован
хог едх, едх
— м1 ебх | ; Теперь ЕОХ:ЕАХ содержит 64-битный результат
всю целую часть, а ЕАХ - всю дробную). .
; (ЕОХ содержит
$Аг@ еах ‚едх, 16 ; Теперь ЕАХ содержит ответ, если не
; произошло переполнение (то. есть если результат не превысил 65 535).
_ 5.5.3. Деление
Число, записанное с фиксированной запятой в формате 16:16, можно предста-
вить как число, умноженное на 216. Если разделить такие числа друг на друга сразу —
мы получим результат деления целых чисел: (А х216) /(ВХ 216) = А/В. Чтобы ре-
зультат имел нужный нам вид (А/В) Х 205, надо заранее умножить делимое на 216;
хотя часто используют таблицу синусов на все 360 градусов, устраняя дополни-
тельные проверки и изменения знаков в критических. участках программы.
‚ РЕРМШИИИИИНИИИ | — Сложные приемы программирования
Таблицы синусов (или косинусов), используемые в программе, можно создать
заранее с помощью простой программы на языке высокого уровня в виде тексто-
вого файла с псевдокомандами О\У/ и включить в текст- программы директивой
псаде. Другой способ, занимающий меньше места в тексте, но чуть больше вре-
мени при запуске программы, — однократное вычисление всей таблицы. Таблицу
можно вычислять как с помощью команды ЕР\) 51 и потом преобразовывать к же-
лаемому формату, так и сразу в формате с фиксированной запятой. Существует
довольно популярный алгоритм, позволяющий вычислить таблицу косинусов
(или синусов, с небольшой модификацией), используя рекуррентное выражение
соз(х,) = 2603(э1ер)соз(х,,) - соз(х,,)
где $ер — шаг, с которым вычисляются косинусы, например 0,1 градуса.
; 938.азт
‚ Строит фигуры Лиссажу, используя арифметику с ‘фиксированной запятой
и генерацию таблицы косинусов.
‚ Фигуры Лиссажу - семейство кривых, задаваемых параметрическими выражениями
; х(Е) = соз($САЕЕМ х т) .
; У(Е) = з1т(3САЦЕ Нх $)
та1п`10ор:
са11 — а1зрфау_растиге ; Изобразить точку со следом.
Вычисления с фиксированной запятой
ТОМ 9х, 5000
гхог сх, сх
ОМ ав, 861 |
Пауза “на СХ:0Х микросекунд.
; Процедура 41зр1ау_р1стиге.
; Изображает точку со следом.
91$р]ау_р1сфиге ргос пеаг
са11 томе_ро1 пт ' . Переместить точку.
; Процедура 9гам_ро1пт.
; Вход: ВР - цвет
, ВХ - сколько шагов назад выводилась точка .
,
гам _ро1ит ргос пеаг
моу7х сх, Буте рёг ро1т_х[Ьх] ; Х-координата.
мо\У7х 9х, буте рег ро1пт_У[Ьх] ; У-координата.
са11 рутр1хе1_ 131 ; Вывод точки на экран.
гет
Фгам_ро1пт епар
‚ Процедура тоуе_ро1пт. . : `
; Вычисляет «координаты для следующей точки.
; Изменяет координаты точек, выведенных раныше.
у = у + 1(м(1-х?)у - х)
х = х + Пу
.тове] 11пу
. 286 ; Для команд ризпа и рора.
.287 ; Для Команд ЕРУ.
. соде
_ ог9 1001 _ _; СОМ-программа.
Тат ргос пеаг
с14
рузН 0А0ООв
рор е5 . ; Адрес видеопамяти в ЕЗ.
Ни ; Инициализировать ЕР.
; Процедура 41зр]ау_.
; Пока не нажата клавиша, выводит решение на экран, делая паузу после каждой из
; 640 точек.
^
; Процедура пехт_х.
; Проводит вычисления по формулам:
‚; у=у+ п(м(1-х^2)у-х)
р х=х + Ву
; Вход: $1 = у, $1(1) =х, $1(2) = м, $1(3) = |.
; Выход: 51 = у, 8%(1) =х, $1(2) = м, 31(3) = В, Х * 100 записывается в 1х[51].
Вычисления с плавающей запятой
пехЕ_х ргос пеаг
#191 ; Ту х, м п
19 $1(2) ух, 1, у, х, №, п
ти] эт, 81(3) ; х2, 1, у, х, м, В
156 ; (1-х2), у, х, м, п и
#14 $1(3) ом, (1-х2): у, х, м, Н
ти] М, у, х, №, Ш (М = м(1-х2))
119 $1(1) уу, М, у, Хх, №, п |
тЫ с Му у хм, В,
#19 $1(2) ох, Му, у, х, м, В
тЗиБ ; Му-х, у, х, м, В
+19 31(4) о И, Му-х, у, х, м, В
_ Пы ‚ ; И(Му-х), у, х, м, 1
#9 51(1) - ; у, П(Му-х), у, х, м, В
тада у у, у х, № В (У =у + п(М-х))
Рхс Бу, у, х, м |
я $1(4) д: у, У, Хх, м п
ти] уп, \, Хх, м И,
. Радар $1(2), 1 гу Х; м; В : „ {ХФ=х + Пу)
119 $1(1) :хухювп
1119 мога ртг с 100 ;.190, Х, У,.Х, м, В. 2
Ти _; 100%, У, Х, м, В -
Нар мог@ раг 1%[81] ; \, Х, п, 1
гет |
пех Хх, . епар ы
рор едх
ге
Тетсп_зеед;
ризп 9$
ризп 00401
рр 93 :
моу еах, диог@ ртг 93:006Сй. : Считать двойное. слов о.
из. ‘области
:. рор 95 : данных 8105 по адресу
‚ 0040:006б - текущее число
тр ПОГ гапдот12е : тактов таймера.
гапд_а 94 . 69621
гапд_м да 7ЕЕЕРЕРЕЙ
зеед `. 99 -1
гапд епдр
можно
Если период этого генератора (порядка 10°) окажется слишком мал,
ора с разными а и т, не имеющи ми общих делител ей,
скомбинировать два генерат
т, = 2 147 483 563 иа, - 40 692 сш, = 2 147 483 399.
например: а, = 400 014 с
Генератор, работающий по уравнению
". Ти = (а,1, +‘а,Г,) №0 м,
_; Разогреть генератор.
мо ох, 216
до_1: ризв Ьх°
40_2: тоу $1, 6х
ада $1, 120
стр “ $1, 216
Бе ЗКр
$6 $1, 216
$К1р: (ед вах, Чмог9 руг ТаБ1ех[ох]
$и6 вах, мог рфг таБ1ех[з1]
тому Чмог@ рЕг таб1ех[ьх], еах
зи 5х,4
39е 90_2 | у =
рор Ьх
5и6 ох,4
99е 90_1
; Инициализировать индексы.
зи6 ах, ах
моу мог рфг 1пдехо,ах \
оу ах, 124
поу 1пдех1,ах
_ рор еах
рор $1
рор ох
гет |
эзгала_1п11 епдр
; Процедура згапа,
; Возвращает случайное 32-битное число в ЕАХ (от 0 до 23-1).
|
; Перед первым вызовом этой процедуры должна быть один раз вызвана процедура згапё 11.
згапа ргосе пеаг
ризй 5х |
ризй $1
Популярные алгоритмы о -
оу = Бх, мог ртг 1пдехо
моу $1, мог рфг 1п4дех1 ; Считать индексы.
оу еах, Чмог@ рфг ТаБех[Ьх]
5% —` вах, диогд руг таб]ех[$1] : Создать новое случайное число.
МОУ Фиог@ ртг та ]ех[31],
еах ; Сохранить его в кольцевом
буфере.
зи6 51,4 Уменьшить индексы,
2. Е1х..31 перенося их на конец буфера,
Р1хед_ $1: оу мог рфг 1пдех1,$1 если они выходят за начало.
зи Ьх,4
д Нх_Ьх
{1хед_вх: оу 1пдехб„Бх
рор $1
рор ох
гет
згапа епар
ТтабБ1ех ва 55 @ир (?) Кольцевой буфер случайных чисел,
1пдехо [А ? Индексы для кольцевого буфера. _
1пдех1 Ом ?
Часто необходимо получить всего один или несколько случайных битов, а ге-
нераторы, работающие с 32-битными числами, оказываются неэффективными.
В таком случае удобно применять алгоритмы, основанные на сдвигах:
; гапа8 * \
; Возвращает случайное 8-битное число в А,
; Переменная зееф должна быть инициализирована заранее,
; например из области‘ данных ВТ05, каков примере для конгруэнтного генератора.
гапа8 ргос пеаг., |
После того как обработчик написан, следующий шаг — привязка его к ВЫбран-
‚ ному номеру прерывания. Это можно сделать, прямо записав его адрес в таблицу
векторов прерываний, например так:
ризв 0 ; Сегментный адрес таблицы векторов прерываний -
рор е5 : в Е. |
рузВР ; Поместить регистр флагов в стек.
с]1 ; Запретить прерывания (чтобы не произошло
‚ аппаратного прерывания между следующими командами,
;’ обработчик которого теоретически может вызвать Т№Т 87Н в тот момент,
‚ когда смещение уже будет записано, а сегментный адрес еще
нет,
‚ что приведет к. передаче управления в неопределенную область памяти).
; Поместить дальний адрес обработчика 1п1_пала]ег
; В таблицу векторов ‘прерываний, в элемент номер 871
; (одно из. неиспользуемых прерываний).
мо мог рег. ез:[871*4], оЁРзеф 1пт_папа1ег
оу мога рег ез:[871*4+2], зе9 1пе_Вап ег
рорЕ ; Восстановить исходное значение. флага ТЕ.
Теперь команда ГМТ 87 будет вызывать наш обработчик, то есть приводи
ть
к записи 0 в регистр АХ.
Перед завершением работы программа должна восстанавливать все старые
обработчики прерываний, даже если это были неиспользуемые прерывания типа
87Ь — автор какой-нибудь другой программы мог подумать точно так же.
Для это-
го надо перед предыдущим фрагментом кода сохранить адрес старого обработчи-
ка, так что полный набор действий для программы, перехватывающей прерыва-
ние 87, будет выглядеть следующим образом:
`Перехват прерываний. ^_ 227
пес ризн = :0
ги; рор. . ез `. `.
; копировать адрес предыдущего, т бработчика В переменную. 019_ напалег.
г. Мю —. вах, диога рег. е$:[878*4]
воу @иога руг,.014_Напа1ег,еах
; установить наш обработчик. '
ризВЕ а 5
_ С]11 .
_ поу \огЧ рег ез:[871*4], оЁРзе{ 11%. Напатег
- У . мОГасртг ез:[87Н*4+2], 389 1пе пап ег
" роре — `
‚ Телб’ , программы.
1...
; Восстановить ‘предыдущий обработчик.
‚г:. ризВ 0 : .
рор ез
° ризВТ.
с11
моу еах, могд ртг о19_Папфег
тому могд рфг ез:[871*4], еах
рорР р
Разумеется, вызов исключения при ошибке занимает много времени, но, если
массив достаточно большой и неупорядоченный, значительная часть проверок
будет происходить без ошибок и`быстро.
При помощи собственных обработчиков исключений можно справиться и с дру-
гими особыми ситуациями, например обрабатывать деление на ноль и остальные
исключения, которые возникают в программе. В реальном режиме есть вероят-
ность столкнуться всего с шестью исключениями: ‘
о#0Е (деление на ноль) — ПМТ 0 — ошибка, появляющаяся при переполнении
и делении на ноль. Как для любой ошибки, адрес возврата указывает на оши-
бочную команду;
О #ОВ (прерывание трассировки) —1МЕ 1- — ловушка, возникающая после вы-
полнения каждой команды, если флаг ТЕ установлен в 1. Используется от-
ладчиками, действующими в реальном режиме;
О #ОЕ (переполнение)— ПМТ 4 - ловушка, возникающая после выполнения
команды ПМТО, если флаг ОЕ установлен;
© #ВК (переполнение при ВООМО)-— ПМТ 5 - уже рассмотренная нами ошиб-
ка, которая происходит при выполнении команды ВОПМО;
о #00 (недопустимая команда). [МТ 6 - ошибка, возникающая при попытке
выполнить команду, отсутствующую на данном процессоре;
о #ММ (сопроцессор отсутствует) — ПМТ7 — ошибка, появляющаяся при по-
пытке выполнить команду ЕРО, если ЕРО отсутствует.
.тоде] 11пу
. соде ' :
‚ 186 : ` р Аля ‘разпа/рора и сдвигов.
0гд 1008
ЗТагт. . ргос - пеаг
; Сохранить адрес предыдущего ,обработчика прерывания Сп. |
ЮУ ах, 351С8 ; = 351, АЁ = номер прерывания.
1щ 218 ; ия 005: определить’ адрес обработчика
‘оу мог рег 019 Ти 1СВ,5х ; прерывания’
тоу мога руг 014_1п14С1+2,ез ; (возвращается в ЕЗ:ВХ).
‚ Установить наш обработчик. , вв
А ах, 251С8 ‚; АН = 251, АЁ = номер прерывания.
оу Чх, оРРвет. 1пЕ1Сп. Наполег ; 05:0Х - адрес’ обработчика.
111 2 .- ; Установить обработчик прерывания 1СН.
; АЁ = час в- ВСЬ-формате.
са]1 Ьсагазс , ‚; Преобразовать в АЗСТТ.
поу руте рфг оитрие, 11пе[2], ай ; Поместить их в
тому Буте руг’ оифри*_11пе[4],а1 ; строку оитрит_11те.
“< моу а], с1 ; СЁ = минута в ВСО-формате.
са11 5с92азс ”
оу Буте рЕг оытрит_11пе[10],ав
тмоу бусе рёг оифриф_14пе[
12], а1
пу . а, бп у ; ОН = секунда в ВСО-формате.
са11 Ьс42азс о . `
моу Буте руг оифрие_11те[
16], ай
моу Буте руг оиррит_11пеЁ18],а1
пом. _ сх, оцери*_Чпе_1 | ; Число байтов
в строке.-.в СХ.
ризН 088005 | .
рор е5 ; Адрес в видеопамяти
оу 91, мог ртг зТаге_роз11оп ; В Е5:0Г:.: .
по\ $1, ОРРзет оифрит.11пе ; Адрес строки в 05:51.
с19 | р
гер моузЬ ° ; Скопировать строку.
ех1т_Папа]ег: . | | ОВ
рор 95 (о | ; Восстановить все регистры.
рор ез
рора
.:
Эир 6$5:014_1п 108 ; Передать управление’ предыдущему обработчику.
‚ Процедура 6са2азс. р х
; Преобразует старшую цифру упакованного ВСО-числаиз АЁ в АЗСТТ-Символ,
во НН м и
Перехват прерываний
; который будет помещен в АН, а младшую цифру - в АВС символ в АГ.
Ьс92азс ргос пеаг
_ пом ав, а1
апа а}, ОРВ | - ° ; Оставить младшие 4 бита в А.
ЭГ ап, 4 ` | \% Сдвинуть старшие 4 бита в АН.
ог ах, 30301. . ; Преобразовать в АЗС1Т-символы.
гет |
осаразс епбр |
; Строка “ 00В 00:00” с атрибутом 1Ей (белый на: синем) после каждого символа.
оцфрие_11пе 96 *” *УТЕА, '0’, ЛР, '0’, ЛЕВ, " В’, ЛЕВ
. 95 ЛЕВ, 0’, ЛР, 0’, ЛЕВ, *:', ЕВ
[9 '0’, ТР, *0’, 12,’ ',1ЕВ
“
оифри*_11пе_1 еди $-оцфрит_11пе
1пЕ1СН_папа1ег епдр -
епа ` ЗТаге
9 Зак. 459
_ ИИ Сложные приемы программирован:
_ МОУ. ах, 5. а ; Возвратить код ошибки “доступ:; запреще,
„‚ 1гет Вернуться в. программу.
111211 _Вапа]ег.. епар
111 1а117е ргос пеаг
| стр Бубе ртг смд_1еп,3 ; Проверить’ размер командной строки
пе пот _1п51а11 ; (должно быть 3 - пробел, диск, двоеточие
`: стр Буте руг ста_11пе[2],':’; Проверить третий
символ |
Зпе поТ_1п$1а11 | ; командной строки (должно быть двоеточие
МОУ а1, усе руг ста_11пе[1]
апа а1, 110111115 ; Преобразовать второй
символ к заглавной букве.
стр `а1, ‘А’ 7’ : Проверить, что это не
76 по 1п$1а11 Г. м меньше “А” и не больше
стр . ат, '7' ;
"7"...
.]а. .. по{_1п31а11 о Если хоть одно ‘из этих условий
не выполняется - выдать информацию
© программе и выйти. И:
Иначе .- начать процедуру инициализации.
ах, З521Н | ; АН = 351, АЁ = номер прерывания.
218 ° у ; Получить адрес обработчика ТТ: 211
мог рег 0191121,6х `; и поместить его`в 014 11218.
мога ртг 014 _1п121Н+2,ез
.тоде} —11пу
.соде _
ог ° Св |
@епузед дм ? . ; Сегментный адрес копии окружения 00$.
0г9 вов
стд_]еп [5 ? ‚; Длина командной строки.
стд_11пе [61°] ? ; Начало командной строки.
ог9 - 1008 - ; СОМ-программа,
Сложные приемы программировани
зТтагт:
019 111211:
Зтр ВогЕ 1101{1а117е : Переход на инициализирующую часть.
1121 _Папа]ег ргос о. Фаг , Обработчик прерывания 211.
ризВЕ Сохранить флаги.
стр ‚ ав, 411. Если вызвали функцию -418
(удалить файл)
Ро41В
ах, 71411 или 71418 (удалить файл
С длинным именем),
Ра4А начать наш `обработчик.
ЭПогЕ пос _Рп41И Иначе - передать
управление предыдущему обработчику.
Ро4лн:
ах Сохранить модифицируемые
Ьх регистры. | |
6х,ах Можно было бы использовать
адресацию [е9х+1], но.в старшем
„, слове ЕБХ совсем необязательно 0.
Вузе рег [5х+1],’: ; Если второй символ АЗСТ7-строки,
переданной ТМТ 218, двоеточие, первый
символ должен быть именем диска.
_ Ри зрес
- ав, 198 Иначе: :
211 функция 00$ 191 - определить
текущий: Диск.
ада а1,*А’ Преобразовать номер диска
к заглавной букве.
Зир ЗПогЕ сотраге Перейти к сравнению.
71] зрес;
поу а1, буфе рёг [6х]; , АЁ = имя диска из АЗСТ7-строки.
апа а1, 11011111. В Преобразовать к заглавной букве.
‘сотраге:
6 ЗСВ Начало кода команды СМР А,. число.
9г1ме_Теттег: 95 '7’ Сюда процедура инициализации
впишет нужную букву.
рор Бх Эти регистры больше не
рор ах понадобятся. Если диски совпадают -
]е ассезз_деп1еа запретить доступ.
пот_Тп41В:
рорР Восстановить флаги и передать
управление предыдущему
обработчику ТМТ 21п:..
а ОЕав Начало кода команды
УМР, число РАВ.
014_111218 Сюда процедура. инициализации
запишет адрес’ предыдущего
обработчика’
ТМТ 211.
\
Резидентные программы: |
ассезз_депед: х
. рорЁ
„ризй Ьр .
тоу Бр, зр . : ; Чтобы адресоваться в стек
; в реальном режиме,
ог могд рег [6р+6],1 р — ; установить флаг
‚ переноса (бит 0) в регистре А
; флагов, который поместила команда ТМТ
. ‚ в стек перед адресом возврата.
‚ рор Бр
моу ах, 5 ; Возвратить код ошибки “доступ запрещен”.
1гет р Вернутьея в программу.
114211_Папд]ег епдр
.тоде] 1пу
‚ соде . . а | | р
-.186 | . ; Для сдвигов и команд ризпа/рора.
ог9 2сп ` о |
епузед м 2? О: Сегментный адрес окружения 00$.
` огд °° 1001 о; Начало‘ б0м-программы. `
этагт: |
"р 11а 7е ; Переход на инициализирующую часть.
Ни_гезе{9: - , ,
гесг | о” ; ТР: минимальный
пм’ гезет.
рор е5 `
рор 9$ | . : Восстановить ‘регистры
` рора |
1гет - ; и вернуться в прерванную программу.
: Процедура зауе_зсгееп. .
; Сохраняет в буфере зсгееп_риРег содержимое области экрана, которую
; закроет наше окно.
Сложные приемы программирован,
зауе_всгееп ргос . о пеаг
[8 $1, ЗТААТ_РОЗТТТОМ
ризН 08800Н. ; 05:51’- начало этой области
; В видеопамяти..
рор 9$
ризй е5
` ризв с3
рор е$
том 91, оРРзет $сгееп_Би!Тег ; ЕЗ:0Т - начало буфера в программе.
мо\ 9х, 18 ; ОХ = счетчик строк.
зауе_зсгееп_1оор:
оу сх,33 ; СХ = счетчик символов в строк
гер том е.
; Скопировать строку с экрана в
а94 $1;(80-33)»2 буфер.
; Увеличить ЭТ до начала следующей
дес 9х строк!
; Уменьшить счетчик строк.
м2 зауе_зсгееп_1оор ; Если он не ноль - продолжить
_
ро
Ге
` е3 цикл,
заме_зсГееп епар
‚; Процедура гезтоге_зсгееп.
‚ Восстанавливает содержимое област
и экрана, которую закрывало наше
‚ всплывающее окно данными из буфера зсгееп_БиЕЁег.
гезтоге_зсгееп ргос пеаг |
моу 81, ЗТАВТ_РОЗТТТОМ ; Е8:0Т - начало: области
моу 31, ОРРзет зсгееп_риРТег в видеопамяти,
; 03:51 - начало буфера.
моу Хх, 18 ; Счетчик строк,
гезтоге_зсгееп_1оор:
оу сх, 33 ; Счетчик символов в строке.
гер МОУЗм ; Скопировать строку. |
ааа 91, (80-33}=2 ; Увеличить ОТ до начала следующей
дес 9х строки.
; Уменьшить счетчик строк.
12 гезТоге_зсгееп_1оор ; Если он не ноль - продолжить.
ге. .
гезТоге_эсгееп епар
; Процедура 41$р1ау_а1].
; Выводит на экран текущее состо
ян ие всплывающего окна нашей программы.
91$р]ау_а1] ргос пеаг
‚ Шаг 1: вписать значение текущего выдел
енного байта в нижнюю строку
тоу окна.
а], буте рег сиггепт_спаг ; АЁ
= выбранный байт.
ризН ах
ЗВг а1,4 ; Старшие: четыре байта.
стр а1,10 ; Три команды,`
59) а1, б9н ; Преобразующие цифру в А.
аз
; В её АБС1Т-код (0-9, А-Р).
тоу Буте рёг Нех_вуте1,а1 Записать символ на его
:
‚ место в нижней строке.
`рор ах
Резидентные программы. `.^
апа а1, ОИ ; Младшие четыре бита.
стр а1, 10 ; То же преобразование.
$6 ^ а1, 691 .
да$ у дот
моу Буте руг пех_ву{е2,а1 ‘; Записать младшую цифру.
; Шаг 2: вывод на экран окна. было бы проще хранить его как массив И выводить
‚ командой тоузм, как и буфер в процедуре гезтоге_зсгееп, но такой массив займет еще
: 1190 байт в резидентной части. Код этой части процедуры_Ч4зр1ау_а11 - всего 69 байт.
‚; Шаг 2.1; вывод первой строки. | |
том ан, ЕВ ; Атрибут белый на синем. .
тоу = = 91, ЭТАВТ_ РОЗТТТОМ __`; Е8;0Т - адрес в видеопамяти.
- моу ЗЕ, ОРРЗет 41зр]ау_14пе1 ; 05:51 - адрес строки.
| моу сх, 33 , ; Счетчик символов в строке.
91зр]ау_1о0р1: - о
тоу а], Буте ртг [$1] .. ; Прочитать символ в АЁ-
3105м . | ; и вывести его с атрибутом из АН.
пс $1 - ; Увеличить адрес символа в строке’.
10ор 913р]ау_100р1 '
; Шаг 2.2: вывод собственно таблицы
оу дх, 16 .. ; Счетчик строк.
| мо\ а], -1 : ; Выводимый символ.
941зрТау_1оор4; : Цикл по. строкам.
ада 91, (80-33) *2 ; Увеличить ОТ до начала
ризп ах | ; следующей строки.
тоу, — а1,0ВЗВ , |
З10$м | ‚ Вывести первый’ символ (0ВЗП).
рор ах .
ОУ сх, 16 ; Счетчик символов в строке.
91$р]ау_100р3: ``; Цикл по символам в строке.
{пс 81 ’.; Следующий АЗСТТ-символ.
$то5м ‚ Вывести его на экран.
ризв ах . у °
мом а1, 201 ; Вывести. пробел.
$103
рор ах .
1оор 91зр1ау_100р3 ; И так. 16 раз;
ризй ах |
36° ‘91,2 . ; Вернуться назад на 1 символ
`_ по а], ОВЗВ | ; и вывести ОВЗИ на месте
5105\ В ; последнего пробела.
рор ах .
дес 9х . | ; Уменьшить счетчик строк.
912 91зр3ау_1оор4
оу ав, 9
ОУ вх, ответ улзта 14_ 050 ; Вывод строки` об успешной
1 21 ; инсталляции.
‚ НГ: = - . : ,
; Нажатие А1т- 6 создает файл зсгдгь „Бяр в текущей директории с изображением,
‚; находившимся на экране в момент нажатия клавиши.
‚ Запуск с командной строкой ГА выгружает программу из памяти.
; АР:
; Программа занимает первую свободную. функцию прерывания 208. (кроме нуля)
; в соответствии со спецификацией АМТ 3.6.
; Поддерживаемые подфункции АМТЗ: бОЛ, .02н, озн, 048, 051.
: Все обработчики прерываний построены в соответствии с ТВ ТР.
.тоде] т1пу
.с0де : `
. 186 . ; для слвигов и команд ризла/рора.
0г9 2св ол
епузед би 7... ; Сегментный адрес окружения.
ог9 801 ая .
стб_1еп 46 ‚3. с: блина командной строки.
стд`141пе 4 °_ : Командная. строка.
год. 1000 у `СОМ-программа.
таг: | й " Во Го
дир 11 1а112е° в Переход на ‚ инициализирующую часть.
; Процедура ‘до_дгаь.
; Помещает в буфер палитру и содержимое видеопамяти, формируя ВМР-файл.
; Считает, что текущий видеорежим - 131.
Ч0_дгаб ргос `пеаг
ризН 6$
рор 9$ |
; Процедура 9о_10. на .
; Создает файл и записывает в него: содержимое буфера.
са1] етз_гезе{
ге -
до_10 епар
ех11_м1{Н_теззаде”
‚ МОУ ав, 9 - | ; Функция вывода строки на экран.
т 238. |
гех ° ; Выход из программы.
Резидемтные программы: `. аа
оу ах,Бр
Этр ЗПогЕ етз_изед
етз_Га11е9: .
по_емз: | ; Если ЕМб нет или он не работает,
моу ав, ЗЕВ ` -. ‘ °
17 218 . -; Закрыть файл/устройство ЕММХХХХО.
по_еттх: °
; Занять общую память.
моу ав, 9 | :
тоу ° ах, оРРзет сопи_мзд ; Вывод сообщения об этом.›
1% 218
етз_изед:
моу могд руг БиРГег_зед,ах ; Сохранить адрес буфера для резидента.
.поде] 11пу
.соде
. 386 ; Для команды 15$.
0г9 1008 ; СОМ-программа.
эТагт:
:; Освободить память после конца программы (+ стек).
моу зр, 1епа1И_оР_ргодгам ; Перенести стек,
Мом ай, 4АВ ; Функция 00$ 4АВ.
° МОУ Ьх, раг_1епдти ; Размер в параграфах.
11% 21п . ; Изменить размер ‘выделенной памяти.
ргодгат_ 1оадед:
; Процедура проверки пароля не находится непосредственно в исполняемом файле
; 1е.ехе, 6м1пд.ехе или хи1пд.ехе, а, подгружается позже из оверлея гопт. 0\1,
. БЕгоп®.о\1 или Ргоптепа, оу] соответственно. Найти команды, выполняющие чтение
; из этого оверлея, и установить на них наш обработчик #1п4_раз$м4. ,
с19
ризй 65 \
рор ах
а69 ах, раг_1епотп
МОУ 4$,ах
ВУЗЕ ИИ! — Сложные приемы программирования
хог $1, $1 ; 05:51 - первый параграф после конца нашей программы
; (то есть начало области, в котор
ую была загружена
. ‚ модифицируемая программа).
моу .
91, оЕРзет геаЧ_111е_соде : ЕЗ:ОТ
- код для сравнения.
оу сх, г соде_1 ; СХ - его длина.
са11 119317119 ‚ ; Поиск кода.
с еггог_ех1{2 ; Если он не найден - выйти
. ; С сообщением об ошибке.
‚ Заменить 6 байт из найденного кода
командами са11 1119 разм и пор.
тоу Бубе руг [51], ЗАВ’ ; САЦЕ (дальний).
пом мога ртг [31+1], оРРсет 1119 _раззм
а
Ве могд ртг [31+3], с$ _^
тоу Буте руг [$1+5], 90, ; МР.
; Запустить загруженную программу.
; Надо записать правильные начальные
значения в регистры для ЕХЕ-программы
; и заполнить некоторые поля ее РУР.
_ МОУ ай, 518 ‚ Функция 00$ 51Н.
11 218 ; ВХ = Р9УР-сегмент загруженной прогр
моу 9$, 6х аммы.
; Поместить его в 05
моу ез, 6х ги ЕЗ. Заполнить также поля Р$Р:
оу мог рег 03: [ОАН], оРРзет ех11_мА По 30 `
му \ога ‘рег 93: [ОСН],с5 ; “адрес: возврата"
том. мог рег 93:[161],сз ‚И "адрес РЗР предка”.
]38 эр, Чмога рег с$:ЕРВ_$55Р ; Загрузить $$:5Р
тр @мог4 ртг. сз: ЕРВ_С$ТР ‚ И передать управление на
; Точку входа программы.
ХиТЮ6 9 0 ‚ 1/0: тип защиты Х-и1пд/Т1е-Е1оптег
ЕРВ дм 0. ; Запускаемый файл получает среду 00$ от
; Не]оад. сом,
[в] 00801,27. : и командную строку,
Чи 005С1,? ; и первый ЕСВ,
[А 006С1,? ; и второй ЕСВ.
ЕРВ_$$5Р .
94 7? -.;: Начальный 5$:5р - заполняется:
ЕРВ_С$ТР 00$.
: 99 ? °; Начальный С$:1Р - заполняется 00$.
11епате1 . ЧБ "Е1е.ехе", 0 ; Сначала пробуем запустить этот
РП епате2. файл,
9’ "Би1по.ехе”, 0 ; потом этот, :
71 1епате3 6 "хи1лд. ехе",0 —; а затем этот,
-; Сообщения об ошибках. |
еггог_тз9 [о “Ошибка: не найден ни один из ‘файло
в ТТЕ. ЕХЕ,
96 “ВИТАС. ЕХЁ, ХИТМ ЕХЕ", С.
ООН, ОАН, ' $’
еггог 1592 [6] “Ошибка: участок кода не найден
об",
“,ОАН, '$’
‚ Команды, выполняющие чтение оверлейного файла в {1е.ехе/Би1пд. ехе/хи1пд. ехе:
геад_111е_соде:
|
ЧБ ЗЗН, 0021 ‚ Хог. ах,9х
6 ` 0841, ЗВ ‚ Моу ап, ЗЕ!
96 осов, 218 ; 10 218
Резидентные программы _ 1:(| | 295 69%
5 728 ; 2
. ; (на разный адрес в Хм119 и {1е)
ГЕсоде_1 = $-геад_111е_соде
Команды, вызывающие процедуру проверки пароля. ,
набор команд встречается и в других местах, поэтому {1пд_раз3м9
; Аналогичный
; будет выполнять дополнительные проверки.
раззм9_соде:
96 891, 461, ОРСВ ; моу [6р-4],ах
95 891, 561, ОРЕЙ $ тому [6р-2], 4х
95 521 ; ризй ах
95 _ 50 | . ризН ах
|] ЭАП °_; са] Фаг
раззи4_1 = $-разема_соде
еггог_ех1*: .
тому ах, отГзет еггог_ 159 ; Вывод сообщения об ошибке 1.
Этр ЗВогЕ мАТП_
ех11 _м59
еггог_ех112: ,
том 9х, оРРзет еггог_м92 ; Вывод сообщения об ошибке 2.
ех1{_и1И_м50: |
моу ав, 9 ; Функция 003 091;
111 21 ; вывести строку на экран.
ех11_э1ТВоит_пз9; .. : Сюда также передается управление после
; завершения загруженной программы (этот адрес был
. . вписан в поле РЗР “адрес возврата”)
моу ап, 4Св ; Функция 00$ 4СП:
17 241 ; конец. программы.
рмд. пот_Тоипд:
рора ; Восстановить регистры
рор
рор 45
рорЁ ; и флаги
ге ; и вернуть управление в программу.
{119 _раззма епар
‚ Процедура Г1п4_зтг1п9д.
: Выполняет поиск строки от заданного адреса до конца всей общей памяти.
; Вход: ЕЗ:0Т - адрес эталонной строки.
; СХ - ее длина
; 05:51 - адрес, с которого начинать поиск
; Выход: СЕ = 1 если строка не найдена,
‚ иначе: СЕ = би 1053:531 - адрес, с которого начинается найденная строка.
мо ап, 1
.
17 161" ; Если ни одна из клавиш не была нажата,
ву па1п_1оор ‚ продолжить основной цикл.
МОУ ал, 0 . ; Иначе - прочитать ‘клавишу.
‘1пс - 6 .
1еауе ' ; Освободить стек от локальных переменных.
са11 Пит домп_ТИгеадз ; Выключить многозадачность.
; С этого момента у нас снова только один процесс.
оу ах, 3 ; Видеорежим 3:
п 108 . : . ; 80х24.
1щ 201 : ‚ Конец программы.
; Процедура вывода точки на экран в режиме 13Н.
; СХ = строка, 0Х = столбец, В: = цвет, Еб = 0А000Н
рифр1хе1 ргос пеаг
ризв. 91
]еа есх, [есх»*4+есх] ; СХ = строках 5.
$11 сх, 6 ; СХ = строка х 5х 64 = строках 320.
ада 9х, сх ; и строка х 320 + столбец
=>> =. адрес.
Це 91, 9х |
том а1, 6]
$036 ; Записать байт в видеопамять.
рор 91
гет
ритр1хе] епдр
; Процедура 91зр]ау_11пе.
; Выводит на экран нашу змейку по координатам из кольцевого буфера 11пе_соогаз,
915р1ау_11пе ргос пеаг
тоу 91, мог рег соогдз_+а11 ; Начать вывод с хвоста,
соп1пие_11пе _Ч1зр1ау:
стр 91, мог@ рёг соогаз реад ; Если 01 равен адресу головы,
3е 1пе_91зр1ауед ‚ вывод закончился.
Е
Резидентные программы . .
рор ьх
ге
91р1ау_111е ° епар
- Процедура 91зр1ау_ро1п®.
. Выводит точку из буфера 11пе_соог@з с индексом ОТ.
93 зрТау_ро1пе ргос пеаг
оу сх, мога рег 11пе_с00г93[91} : Строка.
оу вх, мога рАг 11пе_соог4з[91+2] ‚ Столбец.
са] 1 ритр1хе? ; Вывод точки.
гет
941$р1ау_ро1пт епдр
; Процедура 2_гапфот.
‹ Стандартный конгруэнтный генератор случайных чисел (неоптимизированный }
‚ Вход: ЕВХ - максимальное число.
:; Выход: ЕОХ - число от 0` до ЕВХ-1..
2_гапдом: .
ризй ебх
стр Буте рёг 2г_1п1*_11а9,0 Если еще не вызывали,
де гп инициализироваться.
‚; Иначе - умножить предыдущее
поу еах,гг_ргеу_гапа
ГСО:
и] гп _питбег на множитель
и разделить на делитель.
ФУ - гПа путфег2
‚ Остаток от деления - новое число.
оу гг _ргем_гапа,
едх
рор е5х
тому еах, едх
хог едх, едх
ЧУ ебх Разделить его на максимальное
гет и вернуть остаток в ЕДХ.
тг ЗП:
ризй 00401 Инициализация генератора.
рор #5 ;. 00408:006СВ -
мо\ еах, 5: [006С8] счетчик прерываний таймера ВТОЗ,
том 2г_ргем_гапд, еах он и’будет первым случайным числом.
тоу Буте раг 2г_1п_Р1а9,1
. тр 7г_сопт
гпд_питбег 399 16807 ; Множитель.
99 2147483647 ‚ Делитель.
гпд_путбег2
ЕСУЖИИИИИИИ | Сложные приемы программирования
2Г_1111_Е]ад [96] 0 ; Флаг инициализации генератора:
2г_ргеу_гапд 99 0 ; Предыдущее случайное число,
‚ Здесь начинается код диспетчера, обеспечивающего многозадачность.
‚ Структура данных, в которой мы храним регистры для каждой нити.
{Нгеад_з1гис зтгис
_ах 9 ?
6х — Чи ?
_сх Чи ?
_ах ом ?
_81 дм . 7
_91 [в ?
_бр м ?
вр ет ?
Тр Чи ?
_Е1а9$ Чи ?
{Нгеаа_эгис еп43
; Процедура 111 _{Агеадз,
; Инициализирует обработчик прерывания О8Н и заполняет структуры, описывающие
‚ обе нити,
11 _1Нгеадз ргос пеаг
ризНР
ризра
ризН е$ :
моу ах, 35081 . ; АН = 351, АЁ = номер прерывания.
11 211 ; Определить адрес обработчика.
оу мога рег 014_1п108В,6х ‚ Сохранить его.
то могЧ рег 014_1п11081+2,ез
оу ах, 2508 В ‚ АН = 251, АЁ = номер прерывания.
тоу 9х, оРРзеЕ 1пт08н_вапа1ег ‚ Установить наш.
111 ` 211 .
рор ез
рора ; Теперь регистры те же, что и при вызове процедуры
рорР
р
мо {Пгеад1.._ах, ах ; Заполнить структуры
тоу {Пгеад2. _ах, ах ‚ ТАгеад1 и ТПгеад2,
моу {Пгеад1. _Бх, Бх ‚ В которых хранится содержимое
оу {пгеад2. _6х, Бх ‚ всех регистров (кроме сегментных -
пом Твгеад1. _сх, сх . ‚ ОНИ в этом примере не изменяются)
оу ТИгеад2.
_сх, сх
моу ’ Нгеад1.
_ах, дх
по — 1лгеад2.
ах, 9х
моу {Пгеад1._31,$1
моу {Пгеад2. _$1, 31
оу {Нгеад1. _91, 91
моу {Нгеа42, 91,91
моу {Вгеад1. _6р, Бр
моу ЕНгеад2. _Бр, Бр.
й
Резидемтные программы:
пом ^ тпгеад1. _зр, ответ {Нгеад1. заск+512
поу {Пгеа92. -8р ответ +Нгеад2_5таск+512
рор ах . Адрес возврата (теперь стек пуст).
мо 1игеад1. _1р, ах |
моу ^ {Агеа92. _1р, ах
ризпЕ
рор ах ‚ Флаги.
моу 1Нгеад1. _1]а9$, ах
оу 1Нгеад2. _Ё]адз, ах
‘ ОУ зр, "Пгеад1. _$р ; Установить стек нити 1
Этр мог@ руг 1Игеад1. _1р , и передать ей управление.
111{_1Агеад$ епдр
рор ах
моу Фр, зауе_491
5.10. Программирование
на уровне портов ввода-вывода
Как видно из предыдущей главы, использование системных функций РО5
и прерываний В1О$ может быть небезопасным из-за отсутствия в них повторной
входимости. Теперь самое время спуститься на следующий уровень и научиться
работе с устройствами компьютера напрямую, через порты ввода-вывода, как это
и делают системные функции. Кроме того, многие возможности компьютера мо-
гут быть реализованы только программированием на уровне портов.
5.10.1. Клавиатура
Контроллеру клавиатуры соответствуют порты с номерами от 60Ъ до 6ЕЪ, хотя
для всех стандартных операций достаточно портов 60 и 618.
64 для чтения — регистр состояния клавиатуры, возвращает следующий байт:
бит 7: ошибка четности при передаче данных с клавиатуры
бит 6: тайм-аут при приеме
бит 5: тайм-аут при передаче
ЕГТЗНШШИШИ ШИИШИ!! ‹ Сложные приемы программирования
бит 4: клавиатура закрыта ключом
бит 3: данные, записанные в регистр ввода, — команда
бит 2: самотестирование закончено
бит 1: в буфере ввода есть данные (для контроллера клавиатуры)
.
бит 0: в буфере вывода есть данные (для компьютера) |
При записи в этот порт он играет роль дополнительного регистра управл
ения
клавиатурой, но его команды сильно различаются для разных
плат и разных.
ВТО$З, и мы не будем его подробно рассматривать.
61Ё для чтения и записи - регистр управления клавиатурой.
Если в старший бит
этого порта записать значение 1, клавиатура будет заблокирован
а, если 0 —
разблокирована. Другие биты этого порта менять нельзя, так как
они управ-
ляют иными устройствами (в частности динамиком). Чтобы измени
ть состо-
яние клавиатуры, надо считать байт из порта, изменить бит 7 и снова
запи-
сать в порт 61Ь этот байт.
б0й для чтения - порт данных клавиатуры. При чтении из него
можно. получить
скан-код последней нажатой клавиши (см. приложение 1) -
именно так лучше
всего реализовывать резидентные программы, перехватывающие
прерывание
[801], потому что по этому коду можно определять момент нажати
я и отпус-
кания любой клавини, включая такие клавиши, как ЗЫ, СЫ1, А1ё
или даже
Раизе (скан-код отпускания клавиши равен скан-коду нажатия
плюс 801):
1пт09Н. Напа] ег:
1 - а1, 60 ; Прочитать скан-код клавиши.
стр а1, по{_кКеу ‚; Если это наша “горячая” клавиша,
ле ^ поф оиг_кеу `‚.Перейти к нашему обработчику.
. [..] °_; Наши действия здесь.
по{_оиг_Кеу: „7
„тр 014_1п09н ; Вызов старого. обработчика.
Мы пока не можем завершить обработчик просто командой 1ВЕТ,
потому что,
во-первых, обработчик аппаратного прерывания клавиатуры должен
установить
бит 7 порта 61Ъ, а затем вернуть его в исходное состояние, наприм
ер так:
11 а], 61Н
ризв ах.
ог а1, 801
: от 61Н,а1
рор ах
и 611,а1
.Поде1 —11пу
.соде
ога 1008 ` ; СОМ-программа.`
ЕСЕУШИ
ШИ ВИНИШИ! — Сложные приемы программирования
эфаге „ргос пеаг и
МОУ ай, 2 ; Функция 02 прерывания Ап:
Чи ТАН” . ‚; получить текущее время.
моу сп, ЧА‘ ; Сохранить текущую секунду в. СН.
ОУ с1, 01006. ‚ СЁ= состояние светодиодов клавиатуры:
ма] п_1оор: .
` са11 спапде_(Е0$ ; Установить светодиоды в ‘соответствии с С.
$11 с1,1 ; Следующий светодиод.
тет с1, 1000 ‚ Если единица вышла в бит 3,
вр соп1пие | |
мо\ с1, 0001Ь ‚ вернуть ее в бит 0.
сопе1пие: . | | .
пом: ав, 1 ‚ Проверить, не была ли нажата клавиша. `
111 161 , |
912 ех1+_10ор ‚ Если да - выйти из программы.|
рузН сх ` ` :
оу ав, 2 ; Функция 02 прерывания: ЛАП.
11 ТАП ; Получить. текущее. время.
рор сх _ . : .
ср сп, ЧА ; Сравнить текущую секунду в ОН с СН.
пом СН, дп Сы ; Скопировать ее в любом случае.
]е ‚ сопЕ1лие ; Если это была та же самая секунда -
| ; не переключать светодиоды. |
Эр зНог{ та1п_10ор ; Иначе - переключить светодиоды.
ех1{_1оор: |
оу ав, 0 ; Выход из цикла = была нажата клавиша.
114 161 5’ Считать ее
' гет а ; и завершить ‚программу.
ЭТагт | епар
; Процедура спапде_1Е0$.
‚ Устанавливает состояние светодиодов клавиатуры в соответствии с числом в СИ.
спапде_[Е0$ ргос пеаг
. са11 мазт_КВ]п ; Ожидание возможности - посылки ‘команды.
тоу а1, ОЕОВ `
ош 601, а1 ; Команда клавиатуры ЕОН.
са11 ма1{_КВ1п ; Ожидание возможности посылки команды.
оу а1, с1
ощ бов, а] ; Новое состояние ‘светодиодов.
гет
спапде_1Е0$ епдр
‚ Процедура ма11т_КВлп. И:
‚ Ожидание возможности ввода команды для клавиатуйы.-
ма1{_КВ1п „ргос пеаг
1п а1, 641 ; Прочитать слово состояния,
тез1 а1, 00106 ; Бит 1 равен 1?
17 има1{_КВ1п ; Если нет - ждать.
гет ; Если да - выйти:
ма1т_КВ1п епар
епд зфагт
Программирование на’уровне портов |
5.10.2. Последовательный порт
Каждый из последовательных портов обменивается данными с процессором че-
рез набор портов ввода-вывода: СОМ1 - ОЗЕ8В — ОЗЕЕЪ, СОМ2 = 02Е8В - 02ЕЕБ,
СОМЗ = 0ЗЕВЬ -— ОЗЕЕВ и СОМА - 02Е8Ь - 02ЕЕЬ. Имена портов СОМ1 -
СОМА4 на самом деле никак не зафиксированы. ВТО$ просто называет порт
СОМ, адрес которого (ОЗЕВВ по умолчанию) записан в области данных ВТО$ по
адресу 00401:00008. Точно так же порт СОМ2, адрес которого записан по адресу.
0040Ъ:00028, СОМЗ - 00408:00041 и СОМА - 0040Ъ:0006Ъ. Рассмотрим назначе-
ние портов ввода-вывода на примере ОЗЕВЪ - ОЗЕЕЬ.
ОЗЕВЁ для чтения и записи — если старший бит регистра управления линией = 0,
то это регистр передачи данных (ТНВ или ВВК). Передача и прием данных через
последовательный порт соответствуют записии чтению именно в этот порт. |
ОЗЕВВ для чтения и записи - если старший бит регистра управления линией = 1,
` То это младший байт делителя частоты порта. _
ОЗЕЭЁ для чтения и записи - если`старший бит регистра управления линией - 0,
то это регистр разрешения прерываний (ТЕК):-
‚ бит 3: прерывание по изменению состояния модема
бит 2: прерывание:по состоянию ВКЕАК или ошибке
бит 1: прерывание, если буфер передачи пуст
бит 0: прерывание, если пришли новые данные
ОЗЕЭЁ для чтения и записи - если старший бит регистра управления линией = 1,
то это старший байт делителя частоты порта. Значение скорости порта определя-
ется по значению делителя частоты (см. табл. 20).
ОЗЕАЁ для чтения— регистр идентификации прерывания. Содержит информацию
о причине прерывания для обработчика:
биты 7-6: 00 — ЕГЕО отсутствует, 11 - ЕТЕО присутствует
. бит 3: тайм-аут ЕТЕО приемника
биты 2-1: тип произошедшего прерывания:
11Ъ — состояние ВВЕАК или ошибка.
Сбрасывается после чтения из ОЗЕОЬ
10Ъ— пришли данные.
'Сбрасывается после чтения из ОЗЕ8Ь
01Ь— буфер передачи пуст.
Сбрасывается после ‘записи в ОЗЕ8Ь
00Ь — изменилось состояние модема.
Сбрасывается после чтения из ОЗЕЕВ
бит 0: 0, если произошло прерывание; 1, если нет
ОЗЕАР для записи- регистр управления ЕТЕО (ЕСК) .
биты 7-6: порог срабатывания прерывания о приеме данных:
00 - 1 байт _ ‚
01Ь- 4 байта
10Ъ - 8 байт
11Ь -— 14 байт
'ЕТОЗИ ИИ ИИ: ’ Сложные приемы программирования
бит 2: очистить ЕГРОпередатчика
бит 1: очистить ЕГЕО приемника
бит 0: включить режим работы через ЕГЕО
ОЗЕВА для чтения и записи - регистр управления линией (ГСК)
бит 7: если 1 - порты ОЗЕ8В и ОЗЕЭЬ работают, как делитель частоты порта
`бит 6: состояние ВВЕАК - порт непрерывно посылает нули .
биты 5-3; четность:
720 - без четности
001 - контроль на-нечетность
011 - контроль на четность
101 - фиксированная четность 1
111 - фиксированная четность 0
7?1 - программная (не аппаратная) четность
бит 2: число стоп-бит:
0-1 стоп-бит
1-2 стоп-бита для 6-, 7-, 8-битных; 1,5 стоп-бита для 5-битных слов
биты 1 — 0: длина слова:
00-5 бит
01-6 бит
10-7 бит
11-8 бит
ОЗЕСЯ для чтения и записи - регистр управления модемом (МСК)
бит 4: диагностика (выход СОМ-порта замыкается на вход)
бит 3: линия ОПТ2 — должна быть 1, чтобы работали прерывания
бит 2: линия ООТ1 - должна быть 0
бит 1: линия ВТ$
бит 0: линия ОТВ.
ОЗЕБВ для чтения - регистр состояния линии (1.58)
бит 6: регистр сдвига передатчика пуст
бит 5: регистр хранения передатчика пуст — можно писать в ОЗЕ8Ь
бит 4: обнаружено состояние ВВЕАК (строка нулей длиннее, чем старт-бит +
слово + четность. + стоп-бит)
бит 3: ошибка синхронизации (получен нулевой стоп-бит)
бит 2: ошибка четности
бит 1: ошибка переполнения (пришел новый байт, хотя старый не был прочи-
тан из ОЗЕВЬ, при этом.старый байт теряется)
бит 0: данные получены и готовы для чтения из ОЗЕ8Ь
0ЗЕЕЙ для чтения - регистр состояния модема (М$В).
бит 7: линия РСР (несущая)
бит 6; линия ВТ(звонок)
бит 5: линия ОЗВ. (данные готовы)
бит 4: линия СТ$ (разрешение на посылку)
бит 3: изменилось состояние РСО
бит 2: изменилось состояние В]
Программирование на’уровне портов | ММИНЕ
бит 1: изменилось состояние О5К.
бит 0: изменилось состояние СТ$
ОЗЕЕВ для чтения и записи — запасной регистр. Не используется контроллером
последовательного порта, любая программа может им пользоваться.
о эжм м
мр 000св
м
9 600
|
„_ 00101 7 200
00188 4 800
00208 3 600
‚00де1 11пу
. соде
. 186
огд 1008 ; СОМ-программа.
‚ Инициализация линии. 1
| Зак. 459
ЕРШ Сложн ые приемы программировани
жные. ;
с
бит 7: горизонтальный и вертикальный ходы луча отключены.
бит 6: 1/0 - адресация байтами/словами`
бит 4: 1 - контроллер выключен '
бит 3: 1/0 - счетчик адреса регенерации растет на 2 /1 на каждый
символ
бит 2; увеличение в 2 раза разрешения по вертикали
181: регистр сравнения линий без двух старших битов‘
(от начала экрана до линии с номером из этого регистра отображается: нача:
ло видеопамяти, а от этой линии до конца — видеопамять, начиная с адреса
указанного в регистрах ОСВ и ООВ)
221: регистр-защелка (только для чтения) —
231: состояние контроллера атрибутов ро
биты 7-3: текущее значение индекса контроллера атрибутов
бит 2: источник адреса палитры
бит 0: состояние порта контроллера атрибутов: 0/1 = индекс/данные
ВТО$ заполняет регистры этого контроллера соответствующими значени
ями
` при переключении видеорежимов. Поскольку одного контроллера СВТ мало
для
полного переключения в новый видеорежим, мы вернемся к этому чуть
позже,
а пока посмотрим, как внести небольшие изменения в действующий режим,
на-
пример:-как превратить текстовый режим 80х25 в 80х30:
; 80х30.азт
‚у Переводит экран в текстовый режим 80х30 (размер символов
8х16.)
; {Ногтоп Соттапфег 5.0 в отличие от, например, РАВ восстанавливает режим ло
‚ окончании программы, но его можно обмануть, если предвари
тельно нажать А1{-Р9).
„ое Т1пу
.с04е
. 186 . | ; Для команды оитзм.
огд _ 1008 ; СОМ-программа.
$тагт: |
поу ах, 3 ; Установить режим ОЗН (80х25),
1% 10в ; чтобы только внести небольшие изменения.
му 9х, ЗС6п ‚ Порт ЗСС: регистр вывода (МОВ) на чтение.
1п а], 9х . . :,
тоу 91, 0628 | ; Порт 03021: регистр вывода {МОН) на запись.
ог а1, осон ; Установить полярности 1, 1 - для 480 строк.
оц 9х, а] |
. МОУ „ах, 0304в ; 0Х = порт 0304н: индекс СНТ.
` поу $1, оРРзет сгЕ480 ; 05:51 = адрес таблицы данных для СВТ,
оу сх, сг{480_1 _ ; СХ = ее размер. . . .
гер сим . ‚; Послать все устанавливаемые параметры в порты
; 03041 и 03058.
; Нельзя забывать’ сообщать 810$ об-изменениях в видеорежиме.
рызИ 00408 .
рор е5 ‚ Е$ = 00401.
Программирование на уровне. портов_ || |
.тоде] 11ту
.соде - .
. 186 ` | ; Для ризп 084001.
. огд 1008 - ; СОМ-программа.
зтагт:
ризй 088001
рор ез
хог $1, $1 ; Е5:$Т
- начало видеопамяти:
моу 61, 80*25*2 ‚: Е$:0Т
- начало второй страницы видеопамяти.
моу сх, 91 .
гер тоуз ез:апу_1абе1, ез:апу_1абе] ; Скопировать первую страницу во вторую.
А 9х, оз048 . ; Порт 03048: индекс СВТ.
зсгееп_10оор: . ; Цикл по экранам.
тоу сх, 80*12*2 $; СХ = начальный. адрес - адрес середины экрана.
4пе_100р: ; Цикл по строкам,
мо а}, ОСА ; Регистр ОСп - старший байт начального адреса.
. МОМ ай, сн ; Байт данных - СН.
сие 9х, ах ; Вывод в порты 0304, 0305.
116 ах ; Регистр ООВ - младший байт начального адреса.
моу ан, с] ; Байт данных - С.
от дх,;ах . ‚ Вывод в. порты 0304, 0305.
; Процедура ритр1хе1_х.
; Выводит точку с заданным цветом в текущем режиме Х.
; Вход: 0Х.= строка
; СХ = столбец
; ВР = ‘цвет
ЕЗ = 0А000
; 0$ = сегмент, в котором находится переменная х_м1атВ
ри{р1 хе] х ргос пеаг
ризва
оу ах, вх
ми] мога рфг х ман : АХ = строка х число байтов в строке,
оу 91, сх ; ОТ = столбец.
"ЭЙР 91,2 ; ОТ = столбец/4 (номер байта в строке). .
_ ада 91, ах ; 01 = номер байта в видеопамяти.
тому ах, 01028 ; АЁ = 021 (номер регистра).
| ‚ ; АН=01 (битовая маска).
апа с1, ОВ ; СЕ = остаток от деления столбца на 4 =
; Номер цветовой плоскости.
$11 ай,с1 ; Теперь в АН выставлен в 1 бит
| ‚ соответствующий нужной цветовой Плоскости.
моу ах, 03С4н ; Порт 03048 - индекс синхронизатора. —
от Чх, ах ; Разрешить запись только ,
| ; в нужную плоскость.
поу ‘ах,р ; Цвет в А.
Зт03Ь ; Вывод байта в’ видеопамять.
рора
гет | —
ритр1хе] х епар
5.10.5. Таймер
До сих пор о систменом таймере нам было известно лишь то, что он вызывает,
прерывание 1ВО0 приблизительно 18,2 раза в секунду. На самом деле програм-
мируемый интервальный таймер — весьма сложная система, состоящая из трех
частей — трех каналов таймера, каждый из которых можно запрограммировать
для работы в одном из шести режимов. И более того, на многих современных ма-
теринских платах располагаются два таких таймера, следовательно, число кана-
лов оказывается равным шести. Для своих нужд программы могут использовать
_ канал 2 (если им не нужен динамик) и канал 4 (если присутствует второй тай-
_ мер). При необходимости можно перепрограммировать и канал 0, но затем надо
будет вернуть его в исходное состояние, ‘чтобы В105 и РО$ могли продолжать
работу.^
В пространстве портов ввода-вывода для таймера выделена область от 406
до 5ЕБ:
О порт 40} - канал 0 (генерирует 1800);
О порт 41 - канал 1 (поддерживает обновление памяти);
Опорт 42} - канал 2 (управляет динамиком);
О порт 43В— управляющий регистр первого таймера;
О порты 448- 47 - второй таймер компьютеров с шиной Мисгосвавпе!;
О порты 48}— 4ВЬ - второй таймер компьютеров с шиной ЕТЗА.:
Все управление таймером осуществляется путем вывода одного байта в АЗ
(для первого таймера). Рассмотрим: назначение битов в этом байте.
биты 7-6: если не 11 — это номер канала, который будет программироваться
00, 01, 10 = канал
0, 1,2
бит 5—4: 00 — зафиксировать текущее значение счетчика для чтения (в этом
' ` случае биты 3-0 не используются)
01 - чтение/запись только младшего байта
10 — чтение/запись только старшего байта
11 - чтение/запись сначала младшего, а ‘потом старшего байта -
1
Ра -
.тоде] {1пу
. соде у .
.386 „С Для команды $114.:
ого 100н`_ ‚ ; СОМ-программа.
эТаг: И —
ах, 35088 | ; АН = 351, АЁ = номер прерывания.
мо\у
1% 211 | ; Получить адрес. обработчика
мо\ ога рег 019_1п1081,5х ; и ‘записать его в 019111081.
том мого ртг 019_1п081+2,ез
мо ах; 2508 Н ‚ АН = 256, АЁ= номер прерывания.
Сложные приемы программировани;
тому 9х, оТРзет 1пт08и.вапо1ег ; 05:0Х - адрес обработчика.
101 218 . ; Установить обработчик.
; С этого момента в переменной 1атепсу накапливается сумма,
поу . ав,0
1 = 161 . ; Пауза до нажатия любой клавиши.
МОУ ах, мога рфг ]атепсу ; Сумма в АХ.
стр мога рег соиптег, 0 ; Если клавишу нажали немедленно,
2 Чопт_41\14е ; избежать деления на ноль.
хог 9х, ах. ; бХ=0.
. Фу мога ртг соиптег ; Разделить сумму на число накоплений
доп{_91\14е: .
са11 рилтах . ; И вывести на экран.
му ах, 2508 В . ; АН = 251, АЁ = номер прерывания.
19$ вх, биога руг 019 1п108№ : 0$:0Х = адрес обработчика.
17 218 , ; Восстановить старый обработчик.
гет , ; Конец программы.
1атепсу Чи 0 ; Сумма задержек.
соуптег : Чи о. ‚ Число вызовов прерывания.
; Обработчик прерывания 08н (1800).
; Определяет время, прошедшее с момента срабатывания 1800.
1п08Н_папа1ег - ргос Раг .
ризв ах - ; Сохранить используемый регистр.
поу а1,0 . ; Фиксация значения счетчика в канале 0.
оит 431, а} ; Порт 43ЗН: управляющий регистр таймера. ‹
‚; Так как этот канал инициализируется 810 для 16-битного чтения/записи, другие
; команды не требуются. \^ `
1п а], 408 ; Младвий байт счетчика- `
оу ай, а1 ; В АН.
п а1, 401 ; Старший байт счетчика в АГ.
хсН9 ай, а1 ; Поменять их местами.
пед ах ; Изменить его знак, так как счетчик уменьшается.
а99. ° мога рег сз; ]атепсу,ах ; Добавить к сумме.
1пс могЧ` рфг с3: соуптег ; Увеличить счетчик накоплений.
рор ах . °
4 ОЕАН __; Команда тр Таг.
014_1п108В 99 0 ; Адрес старого обработчика,
111081 _Палпа] ег «Ор
; Процедура рг1п_ах. .
; Выводит АХ на. экран в шестнадцатеричном формате.
рг1п{_ах ргос пеаг . `
хСНд Чх, ах ; 0Х = АХ.
. Де сх, 4 ; Число цифр для вывода.
ЗНА _ах: |
.-$119 ах, дх, 4 ; Получить в АЁ очередную цифру.
го] 9х, 4 , ; Удалить: ее из ОХ.
апа а1, Ор ^ ; Оставить в АЁ только эту цифру.
Программирование на уровне портов ШИНИИВИЕЕЕ
||
` ср ’° а, 0. ; Три команды, переводящие
$65 а1, 698 ; шестнадцатеричную цифру в АЁ -
даз - ; в соответствующий АЗСТТ-код.
^ 11%. 291 ; Вывод на экран. . |
1Лоор 111 ах ; Повторить для всех цифр.
гет ``
рг1пЕах епдр .
епб ЗТаго
5.10.6. Динамик
Как сказано в разделе 5.10.5, канал 2 системного таймера управляет динами-
ком компьютера - он генерирует прямоугольные импульсы с частотой, равной
1 193 180/нача льно
значение е.
счетчика. При программировании динамика на-
чальное значение счетчика таймера называется делителем частоты: подразумева-_
ется, что динамик работает с частотой 1 193 180/делитель герц. После програм-
мирования канала 2 таймера надо еще включить сам динамик. Это осуществляется
путем установки битов 0 и 1 порта 61Ь в 1.Бит 0 фактически разрешает реботу
данного канала таймера, а бит 1 включает динамик.
‚. Процедура ъеер. | \.
; Издает звук с частотой 261 Гц (нота “ми” средней октавы)
: длительностью 1/2 секунды на динамике: :
Беер ` ргос леаг . |
' `; МОУ а1, 101101105 ; Канал 2, режим 3.
оц 431, а] . .
а1, 00 - ‚ Младший байт делителя частоты 11008. _
Мом
оц 421, а1 т
тому а], 118 | ‚ Старший байт делителя частоты.
ит 421, а] ° :
п - а], 618 ; Текущее состояние порта б1Н в АЕ.
ог . а1,:0000001165. ; ‘Установить биты би 1. в 1.
оц ‚ 611, а1 ; Теперь динамик включен,
мо сх, 00071 ; Старшее слово числа микросекунд паузы.
моу ах, 041208 ; Младшее слово числа микросекунд паузы.
оу ап, 861 | ; Функция 861: . |
пе ` 15Н | : пауза. °
11 ^ а1, 618 7
апа а], 111111005 ; Обнулить младшие два бита.
оу ба] ; Теперь динамик выключен.
гет
Беер епар
ЕЕЗИИШИШИШИИИИ — Сложные приемы программирования
В связи с повсеместным распространением звуковых плат обычны
й динамик
РС сейчас практически никем не используется или используется
для выдачи со-
общений об ошибках. Вернемся к звуку чуть позже, а пока вспомн
им, что в разде-
ле 4.7.1 рассматривалось еще одно устройство для определения
текущего време-
ни и даты - часы реального времени.
.то9е1 11пу
‚ соде
. 186 ‚ Для эНг а1,4.
ог9 1001 : ; СОМ-программа.
эТаге:
оу а1, ВВ ; С№05.08№ - управляющий регистр. В.
ош . 701, а] ; Порт 70в - индекс СМ0$.._ и
п а,7 ; Порт 71й - данные СМ0$. |
апа а1, 11111011 ; Обнулить бит 2 (форма чисел - ВСБ)
от 71Н, а1 ‚ и записать обратно. :
е `` а1,32' — $ 0№0$ .32н - две старшие цифры. геда. '
са11 ри1п*_стоз ; Вывод на экран. АН:
пом а1,9 .` С№0$. 091 - две младшие цифры. года.
Программирование. на уровне портов | 3
; сай рее спо8
поу а], '-’. 2} Нину.
11 298 ‹ Вывод на экран,
по а1.8 ; СМ0$ 081 - текущий месяц.
‚са11 — рг1пЕ спо | |
МОУ а}, ' -' ; Еще один минус.
17 298 |
мочу а1,7 ; 6м05 07н - день.
са1] ` рг1п_стоз `
ОУ а1,’°°. ; Пробел.
101 291 --
моу а], 4 __; 640$ 04 - час.
` са11 реп _стоз |
| ° оу а]. |’ °; Буква “М”. ^
1 29 ` -
то\ а1;’'. ; Пробел.
ие 291 . : ,
_ МОУ а1,2: су 6М0$ 021. - минута.
са11 реп _стоз т
му 1 а1,':' `_ ; Двоеточие.
м 29 о о
у‘ а,08 . $ СМ05 О0н - секунда.
са11 рг1л*_стоз ` р '
гет
; Процедура рг1пт_стоз.
‚ Выводит на экран содержимое ячейки СМО$ с номером в АЕ.
; Считает, что число, читаемое из СМ0$, находится в формате ВС0.
рг1п*_сто$ ргос пеаг
. о 701, а} ; Послать АС в индексный порт СМ05.
п а], 71И ; Прочитать данные.
‚ РизВ ах
ЭГ - а!, 4 . Выделить старшие четыре бита.
299 21, '0’ ‚ ; Добавить АЗСТТ-код цифры 0.
1% 298 _ .; Вывести на экран.
рор ах |
апб а}, ОП ; Выделить младшие четыре бита.
а99 21, Зов ; Добавить АЗСТТ-код цифры 0.
пт 2 ; Вывести на экран.
` . . . . 1
ге
рг1пе_сто$ епбр ,
епа зтагт
счи-
оо5$Р (Бизна! Зета] Ргосеззог) — устройство, позволяющее выводить и
тывать оцифрованный звук;
О микшер (№!хег) — система регуляторов громкости для всех каналов платы;
ШВ! — Сложные приемы программирования
ОЕМ (Егедиепсу Моданоп) или АЗГЛЬ (по названию первой звуковой пла-
ты) — устройство, позволяющее синтезировать звук из синусоидальных
и треугольных волн. Слова типа ОРТ.2 или ОРЗ в описании платы -— это
и есть номера версии используемого ЕМ-синтезатора;
Я МТ! (Мизес пягатерёа1 Олена! Ницегасе) — стандартный интерфейс пере-
дачи данных в музыкальной аппаратуре. Но в нашем случае рассматривает-
ся СМШГ (обобщенный МТО- более качественная система генерации му-
зыки, в которой используются не искусственные синусоидальные сигналы,
а образцы звучания различных инструментов. К сожалению, качество этих
образцов в большинстве дешевых плат оставляет желать лучшего.
Номера портов ввода-вывода, предоставляющих доступ ко всем этим устрой-
ствам, отчитываются от базового порта, обычно равного 2201, но допускаются.
также конфигурации с 210, 2308,.240}, 2505, 2601 и 2808. Кроме того, интерфейс
‹ СМ!Гиспользует другую серию портов, которая может начинаться как с 3001,
так и с 330. В описаниях портов мы будем считать, что базовыми являются 2208
и 3008. Область портов интерфейса с АЧТЛЬ начинается с 3888.
Существует большое число модификаций плат Зоип@ Вазег, отличающихся,
помимо всего прочего, набором поддерживаемых команд и портов ввода-вывода.
После названия каждой команды или порта мы будем указывать сокращенное
название платы, начиная с которой эта команда или порт поддерживается:
ОЗВ- боиоа ВЙазвет 1.0;
а58В2- боцла ВЁьжег 2.0;
о $ВРго — боипа Вазбег Рго;
о $ВРго2 - $оипа В]а%ег Рто2;
/ 95816 - боипа Еазбет 16;
ОАЗР - Зоип4 Вв&ег 16 А$Р;.
С АМУЕ — Зоцпа ВЙаег АХЕЗ2.
Программирование О$Р
‚ Цифровой процессор — наиболее важная часть звуковой платы. Именно с его
помощью осуществляется вывод обычного оцифрованного звука, так же как и за-
пись звука из внешнего источника в файл. Для своей работы, помимо описывае-
мых в этом разделе портов, О5Р использует прерывания и контроллер прямого
доступа к памяти ОМА. Программирование ОМА с примером программы, ис-
пользующей его для воспроизведения звука, мы рассмотрим в разделе 5.10.9.
ОЗР обслуживается при помощи следующих портов:
226 для записи: сброс О$Р ($5В)`
Запись в этот порт осуществляет полную переинициализацию ОЗР, прерывая
все происходящие процессы. Операцию сброса О5Р необходимо выполнить, по
крайней мере, один раз после перезагрузки системы, чтобы его можно было ис-
пользовать.
Процедура сброса осуществляется следующим образом:
1. В порт 226Ъ записывается число 1 (начало инициализации).
2. Выдерживаётся пауза как минимум 3,3 мкс.
Программирование на уровне портов — |]
3. В порт 2268, записывается число 0 (конец инициализации).
4. Выдерживается пауза максимум 100 мкс. В течение паузы можно выполнять
_ чтение порта 22Е. Когда в считываемом числе будет установлен бит 7 (дан-
ные готовы), можно сразу переходить к нункту 5. В противном случае имеет
смысл повторить ‘процедуру, используя ‘другой базовый порт.
‚ 5, Выполняется чтение из порта 22АЬ. Если считанное число равно (ААВ — ОЗР
был успешно инициализирован. В противном случае допускается/вернуться
к пункту 4, но по истечении 100 мкс после записи в 226} можно будет с уверен-
ностью сказать, что О$Рс базовым адресом 220} не существует!или не работает.
АВ для чтения: чтение данных из РР (5В)
Чтение из этого порта используется для передачи всех возможных данных от
О5Р программам. Процедура чтения состоит из двух шагов:
1. Выполнять цикл чтения порта 22ЕВ, пока бит 7 считываемого байта. Не ока-
жется равным единице.
`2, Выполнить чтение из порта 22АВ.
22СЁ для записи: запись данных и команд ОР (начиная с5В)
Этот единственный порт используется для передачи всего множества команд
ОЗР и для пересылки в него данных (аргументов команд). Процедура.заниси:
1. Выполнять цикл чтения порта 22СЬ, пока бит 7 считываемого байта не ока-
жется равным нулю.
2. Выполнить запись в порт 226.
22СЁ для чтения: готовность ОЗР для приема команды (5В)
Если при чтении из этого порта бит 7 сброшен в ноль— ОР готов к приему оче-
`редного: байта. в порт 22СЬ на запись. Значение остальных битов не определено.
22ЕЙ для чтения: готовность О$Р для посылки данных (начиная с 5В)
Если при чтении из этого порта.бит 7 установлен в единицу—‚ ОЗР готовх пере-
даче через порт 22АВ очередного байта.
22ЕЙ для чтения (тот'же порт): подтверждение обработки 8битного прерыва-
ния ($58) ,
Обработчик прерывания, ‘сгенерированного звуковой платой по. окончании
8-битной операции, обязательно должен выполнить одно чтение из этого порта
перед завершением (помимо обычной процедуры 1посылки сигнала ЕО] в соответ-
ствующий контроллер прерываний).
22ЕВ для чтения: подтверждение обработки 16- ‘битного прерывания (5816)
Обработчик |прерывания, сгенерированного звуковбй платой по окончании
16-битной операции, обязательно должен выполнить одно чтение из этого пор-
та перед завершением (помимо обычной процедуры ‘посылки сигнала ЕО] в со-
ответствующий контроллер прерываний).
Теперь рассмотрим команды ОЗР. Все они пересылаются В звуковую плату че-
рез порт 22СВ, как описано выше. После команды могут следовать аргументы,
+
158, ГО, НИ: прямое воспроизведение 4-битного АОРСМ через ОМА с новым ну-
левым байтом (5В)
Аналог 17Ъ, но используется 4-битный вариант формата. Стеайуе АБРСМ.
ЕРТИНИИШИИИИИ Сложные приемы программирования
76, ГО, НИ: прямое воспроизведение 2,6-б
итного АОРСМ через ОМА (58)
Аналог 16}, но используется 2,6-битный вариа
нт формата СтеаНуе АБРСМ.
77, ТО, НГ: прямое воспроизведение 2,6-б
итного АОРСМ через ОМА с новым.
нулевым байтом (5В)
Аналог 17, но используется 2,6-битный
вариант формата СтеаНуе АОРСМ.
ПТ: воспроизведение 4-битного А,РСМ
через ОМА с автоинициализацией ($82)
Аналог 1ЕВ, но используется 4-битный вариант формата СгеаНуе АОР
СМ.
7ЕЪ: воспроизведение 2,6-битного АОРСМ через
ОМА с автоинициализацией (582).
Аналог 1Е1, но используется 2,6-битный вариа
нт формата Стеануе АОРСМ. |
808, 10, НТ: заглушить ОЗР (5В)
Вывести указанное число байтов тишины
с текущей частотой оцифровки. \
0В?5/0С?Ь МОРЕ, 10, НТ: обобщенный инте
рфейс к О5Р ($816)
Команды 0В?. используются для 16-битны
х операций, команды ОСЗ — для
8-битных. Младшие четыре бита определя
ют режим:
’ бито: всегда 0
бит 1: используется ЕГЕО о
бит 2: используется автоинициализация ОМА
бит 3: направление передачи (0 -— воспроизве |
дение, 1 — оцифровка)
Аргументы этой команды -— режим, младший
байт длины, стар ший байт дли-
ны (перед указанной командой не требуется
устанавливать размер ОМА-буфера
специально). | | — |
В байте режима определены всего два бита (оста
льные должны быть равны нулю):
бит 4: данные рассматриваются как числа со
знаком
бит 5: режим стерео `
Длина во всех случаях равна числу байтов
минус один для 8-битных операций
и числу слов минус один для 16-битных.
х
0008: остановить 8-битную ОМА-операцию
(5В)
Останавливает простую (без автоинициали
зации) 8-битную ОМА-операцию.
001: включить динамик ($В)
Разрешает работу выхода на динамик (коло
нки и т. д.).
После сброса ОР этот канал выключен.
0131: выключить динамик ({5В)
Отключает выход на динамик (колонки ит.
д.).
ОП4В: продолжить 8-битную ОМА-операцию
(В) — ,
Продолжает ОМА-операцию, остановленную
командой 0О0В. В
0051: остановить 16-битную ОМА-операцию
(5В)` о.
Останавливает простую (без автоинициализаци
и).16-битную РМА-операцию. —.
9061: продолжить 16-битную ОМА-операцию
(58)
Продолжает РМА-операцию, остановленную
командой 005...
Программирование на уровне портов
008}: определить состояние динамика (5В)=
Возвращает О0Ъ, если динамик выключен; ЕВ, если включен.
ООН: завершить 16-битную ОМА-операцию с автоинициализацией ($816)
Эта команда завершает операцию только после окончания воспроизведения теку-
щего блока. Для немедленного прекращения воспроизведения необходимо выпол-
нить последовательно команды ООЗВЬ, 005Ъ, ОТВ и 0058.
ОПАН: завершить 8-битную ОМА-операцию ‹ автоинициализацией (582)
Аналог 009, но для 8-битных операций.
ОЕбЬ, ВУТЕ: проверка наличия ОЗР на этом порту ($В2)^
Любой байт, посланный как аргумент к этой команде, возвращается при чтении из
ОБР в виде своего побитового дополнения (О5Р выполняет над ним операцию МОТ).
ОЕ1В: определение номера версии О5Р (5В)
Возвращает последовательно старший ит младший номера версии Р5Р:
1.? - В
2.0- $82 | | ` | .-
3.0 - ЗВРго : В
3.2? - $ВРго2
4.0? - $816
4.11 - 53В16 $651-2
4.12 - А\ЕЗ2
ОЕЗЬ: чтение СоруцевЕ О5Р (5$ВРго2)
Возвращает АЗСТ7-строку с информацией Сорупё данной платы.
ОБЬ, ВУТЕ: запись в тестовый регистр (5В2)
Помещает байт в специальный неиспользуемый регистр, который сохраняется
даже после переинициализации ОР
ОЕ8В: чтение из тестового регистра ($82)
‚ Возвращает байт, помещенный ранее в тестовый регистр командой ОЕАЬ.
ОЕОН: генерация синусоидального ситила ($В)
Запускает О$Р на воспроизведение синусоидального сигнала с частотой около
2 кГц, который можно прервать только сбросом ОЗР.
0Е21: запрос на прерывание в 8-битном режиме ($8)
Генерирует прерывание от звуковой карты. В качестве подтверждения от обработ-
чика ожидается чтение из порта 22ЕБ.
ОЕЗЬ: запрос на прерывание в 16-битном режиме (СВ) ,
Генерирует прерывание от звуковой карты. В качестве подтверждения от обработ-
чика ожидается чтение из порта 22ЕВ. |
ОЕВЬ: состояние О$Р. (5816).
Возвращает ‘байт состояния текущей О$Р-операции:
бит 0: 8-битное воспроизведение через ОМА
бит 1: 8-битное чтение через ОМА
|
1
ии Сложные приемы. программирования {
Программирование микшера ,
Это устройство предназначено для регулирования громкости на всех каналах,
используемый звуковой платой.
Для управления микшером служат всего два порта ввода-вывода.
224й для записи: выбор регистра микшера (5ВРго)
Запись в этот порт выбирает номер регистра, к которому будет осуществляться
доступ при последующих обращениях к порту 2256.
2258 для чтения и записи: чтениё/запись регистра микшера (5ВРго) |
Чтение и запись в этот порт приводят к чтению и записи в соответствующий ре-
гистр микшера. Рассмотрим их назначение.
Регистр 00 для записи: сброс и инициализация (5ВРго)
Выбор этого регистра в порту 2241 начинает инициализацию. Следует подождать
как минимум 100 мкс, а затем записать в порт 225} число 01} (команда «завер-.
шить инициализацию»). , ‘
|2 Зак. 459
ЕРШ ИИИИИИИ! — Сложные приемы программирования
Регистры 9АОВ - ОАЗВ: нота (младший байт)
биты 7-0: биты 7-0 номера ноты
Регистры ОВОВ- ОВ: октава и нота (старшие биты),
биты 1-0: биты 9-8 номера ноты
биты 4-2: номер октавы
бит 5: включить звук в этом канале
Значение 10-битного номера ноты соответствует следующим реальным нотам
(для четвертой октавы):
016ВВ - С# (277,2 Гц)
01816 —Р (293,7 Гц).
01985— О# (311,1 Гц)
01В0Ь -Е (329,6 Гц)
. 01САВ - Е (349,2 Гц),
О1Е5Ь - Е# (370,0 Гц):
‘02028 - С (392,0 Гн)
02208 - С# (415,3 Гц)
'0241Ъ - А (440,0 Гц)
0263 — А# (466,2 Гц).
0287 - В. (493,9. Гц)
О2АЕЬ - С (523,3 Гц) у:
‚ Процедура 9зр_гезет.
; Сброс и инициализация О5Р.
95$р_гезет ргос пеаг
му 9х, ЗВРОВТ+6 ; Порт 2261 - регистр сброса О$Р.
МОУ а1,1 ; Запись единицы в него начинает инициализацию.
от 9х,а1
моу сх,40 ; Небольвая пауза.
95$р1оор: 7
1п а],дх
1оор 95р1оор
том а],0 . Запись нуля завершает инициализацию.
о дх,а1 ; Теперь 05$Р’ готов к работе.
‚ Проверить, есть ли 0$Р вообще.
а99 9х,8 Порт 22ЕН - состояние буфера. чтения 0$Р.
мо сх, 100
спеск_рогт:
1п а1,9х :; Прочитать состояние буфера.
ап а1, 801 ; Проверить бит 7.
12 рогт ‘пот_геаду ‚ Если ноль - ‘порт еще не готов.
$и0 9х,4 ‚ Иначе: порт 22АН - чтение данных из 0$Р.
11 а1,9х
а99 9х,4. ‚ И снова перт 22Е\.
сир а], ОААМ .; Если прочиталось число ААП - 0$Р присутствует
‚ и действительно готов к работе.
. 4 9009 _гезет
рогЕ_по*_геаду: |
]оор спеск_рогт Если нет “повторить проверку 100. раз
Бад_гезет:
тс и сдаться.
гет Выход с СЕ = 1.
‚ 9009_гезет:
с1с ; Если инициализация прошла успешно,
гет выход с СР = 0.
азр_гезет епар
и
вании Сложные приемы программирования
мг1Те_10о0р: ; Подождать готовности буфера записи ОЗР.
11 а1, 4х ; Прочитать порт 22Сп
айда а1, 80П ; и проверить бит 7,
917 иг Те_1оор ‚ ; Если он не ноль - подождать еще.
оу а1, 51 ; Иначе: !
ощ ах, а1 ; послать данные.
ге
9зр_мг1{е епдр
‚ Процедура’ гергодгат_р1т.
; Перепрограммирует канал 0`системного таймера на новую частоту.
; Вход: ВХ = делитель частоты.
гергодгат_р1т ргос пеаг.
с11 ; Запретить прерывания.
МОУ а1, 001101106 ; Канал 0, запись младшего и старшего байтов
‚ режим работы 3, формат счетчика - двоичный.
оц 431, а1 ; Послать это в регистр команд первого таймера.
оу а1,61 ; Младший байт делителя -
от 401 ‚а? ‚ в регистр данных канала 0.
мо а}, БИ ; И старший байт -
сит 401, а1 ‚ Туда же.
$11 : ‚ Теперь ТА@О вызывается с частотой 1 193 180/ВХ Н2.
гет
гергодгат_р1т епар
‚ Процедура поок_1п18. |
; Перехватывает прерывание ТМТ 08н (1800).
поок_1718 ргос ° пеаг
° оу ах, 35081 , ; АН = 358, АС = номер прерывания.
1и 21А ; Получить адрес старого обработчика.
по мога ртг 0149111081,6х ; Сохранить.его. в о14_1п08Н.
[7 мога руг о14_1п1081+2‚ез
МОУ ах; 2508 < АН = 251, АЁ = номер прерывания.
- оу 9х, оЕЕзет 1п108П_папд1ег ; 05:0Х - адрес обработчика.
17. 2. ‚ ; Установить обработчик,
гет
ВооК_1п18 епар о.
‚ Процедура гезтоге_ 1118.
‚ Восстанавливает прерывание ТМТ 088 (1800).
гезфоге_1п18 ргос педг. | .
оу ах, 2508В ' ; АН = 251, АЁ = номер прерывания.
195 Чх, мог ртг о14_111081 ; 05:0Х - адрес обработчика,
1 21н о ; Установить старый ‘обработчик.
тет |
гезтоге_1п18 епдр
‚ Процедура ореп_#11е.
; Открывает файл Ё1]епате и копирует звуковые данные из него, считая его’ файлом
‚ Тада.мау, в буфер БиРРег.
ореп_#11е ргос пеаг
моу ах, 30001 : ‚ АН = ЗО, АЁ = 00.
Программирование на уровне портов |ИНИВИИИИИЕЕЕ
_ му . 4х, о1Мвет ЕАТепате ” ;. 0$:0Х - А$СТ2-имя файла с путем.
9 ам , ; Открыть файл. для. чтения. .
с. еггог_ех1т ; Если не удалось открыть файл -- выйти.
по Хх,ах с ` : идентификатор фанта в ВХ.
пом ах, 42008 : :- ; =- 421, АЁ=
моУ сх, 0 ; ох:
ОХ - новое значение указателя.
мочу ах, 381 | . по этому адресу начинаются данные в`-Тада. мау.
17 211 . у ереместить файловый указатель.
ту ° ай, ЗЕ® ` ; = ЗЕИ.
моу сх, 27459 ‚ Это - р звуковых данных 'в файле тада. мам.
_ МОУ 6х, оРзет БиГРег ; 0$:0Х - адрес буфера.
1% 214 ; Чтение файла.
гет - |
еггог_ех1т: “ ° р ; Если не удалось. открыть файл.
оу ап, 9: - _^; АН = 091.
мо ах,
ОТ зех .поторепяз9 ; 05:0Х = сообщение об ошибке.
о 2 | ; Открыть файл для чтения.
Не 208 . -; Конец программы.
поторептз 9 95 “Ошибка при открытии файла”, ООН, ОА, ' $’
ореп_111е епдр |
: Процедура @зр_мг1те
; Посылает байт из ВЕ в 05Р
Чзр-ми1те‘ ргос пеаг
поу — 9х, ЗВРОАТ+0С °; Порт 22Сп - ввод данных/команд О$Р.
игЦе_1оор: ; Подождать до готовности буфера записи ОЗР,
1п а}, 9х ; прочитать порт. 2208
апа а1, 808 - ; и проверить бит 7.
312 мг1Те_1оор ; Если он не ноль - подождать еще.
тоу а], 61 ; Иначе: `
- о вх, а1 ; послать данные.
геф
9зр_мга Те’ епар
; Процедура Поок_зЬ1га.
; Перехватывает прерывание звуковой карты и разрешает его.
ВоОК_$51г4 ргос пеаг
| ах, 3508+58 140 —; АН = З5в, АЁ = номер прерывания.ика =
1 211 ; Полу чить адрес старого. обработч
ЕТУИИШИВИШИИИ ! — Сложные приемы программирования
МОУ. могд рфг о19_з61га,Бх ; и сохранить его.
тоу мог4 рфг 019_$51г4+2,ез
`по\ ах, 2508 1+$ВТНО АН = 251, АЁ = номер прерывания.
моу ах, оРРзет 361га_Папа]ег Установить новый обработчик
101 211
оу с1,1
$0] с1, ЗВТВО
лот с1 Построить битовую маску.
1й ай, 21н Прочитать ОСИЗ.
апа а1, с1 Разрешить прерывание.
ит 218,а1 Записать ОСМ1.
гет
поок_$61га епар
`; Процедура гезтоге_$61г4.
и
‚ Восстанавливает обработчик и запрещает прерывание.
гезтоге_$51г4 гос пеаг
ЮУ ах,3508й+5ВТАО АН = 251, АЁ = номер прерывания.
193 Чх, Чиог@ рег о19_$51га
11 211 “Восстановить обработчик.
оу с1,1
$11 с1, ЗВТАЙ Построить битовую маску.
11 а], 21н Прочитать СЧ.
ог а1, с] Запретить прерывание
о 211,а1 Записать ЦСМ1.
гет
гезТоге_$51га ‚ епар
‚ Процедура. ореп_111е.
; Открывает файл Р11епате и копирует звуковые данные из него, считая, что
; это Тада. мам, в буфер: Би! Рег.
ореп_111е ргос пеаг
оу ах, 30008 АН.= ЗОВ, АЁ = 00.
поу 9х, оРРзет Г1]епате ; 05:0Х - А$СТ2-строка с именем файла.
1% 218. Открыть файл для чтения,
37° еггог_ех1т Если не удалось открыть файл - выйти.
том Ьх, ах Идентификатор файла в ВХ.
оу ах, 42001 АН = 421, АГ = 0. '
тоу сх,0 СХ:0Х - новое значение указателя.
оу дх, 388 По этому адресу начинаются данные
в Тада. мам.
171 21ы Переместить файловый указатель.
моу ап, ЗЕИ АН = ЗЕА.
оу СХ, 27459 Это - длина данных в файле тада. мау.
|
рузН 9$ : `
оу ах,43
апа 9х, ОЕ000Н ; Выравнять буфер на границу 4-килобайтной страницы
ада 9х, 10004 ; для’ ОМА.
оу 0$,4х
тоу дх,0 ‚ 05:0Х - адрес буфера.
17 21н ; Чтение файла.
Программирование на уровне портов |НИИВИИИВИИИИИИ,
рор 9$
гет р (_ .
еггог_ехзт: : с; Если не удалось открыть файл.
оу › ан,9 | ; АН = 091. |
оу Чх, оРЕзег поторепт$9 ; 0$:0Х = адрес сообщения об ошибке..
1 21и ‘; Вывод ‘строки на экран..
те 200 : ; Конец программы.
‚ сообщение об ошибке
поторептз9 ЗЬ “Ошибка при’ открытии файла" , Об, ОАВ, '$’.
; Процедура ргодгат_дта.
; Настраивает канал 1 ОМА:
ргодгам_дта ргос` пеаг
`. оу ^ 21,5 ` ° ; Замаскировать канал 1.
от ^ ОА, а] :
хог а], а] ; Обнулить счетчик.
ои* ОСН, а1 :
ПУ а1, 49Н ; Установить режим передачи. ‘-
, .. : (используйте 591 для автоинициализации).
ит. ОВП, а1 . -
ризй |
рор ° ах
апа. 90, ОРОН
299 ап, 101 ; Вычислить адрес буфера.
хог ах, ах . :
ом 021,21 ; Записать младшие 8 ‘бит.
ом 028, а1 ; Записать следующие 8 бит.
оу а], Ч |
Пг а1,4
сит 831, а] о Записать старшие 4 бита.
; ри.ат .
прерываний _
‚ Выполняет полную инициализацию обоих. контроллеров
нием‘ прерыва ний 1800 - 1807 на векторы ТМТ 501 - 571.
; с отображе
коротки й звук после каждого ТВО1.
; Программа остается резидентной и издает.
; Восстановление старых обработчиков прерываний и переинициализация
‚ контроллера в прежнее состояние опущены. |
.тюде1 . 11пу
. сое ` : ь
ог9 1001 _ . ; СОМ-программа.
этагт: (о |
; Переход на начало инсталляционной части,
Этр еп4_о{_гез14етт
; Процедура 1п1{_р1с*
; Выполняет инициализацию обоих контроллеров прерываний,
‚ отображая 1800 -.ТВО7 на РТС1_ВАЗЕ - РТС1_ВАЗЕ+7,
‚; а 1808 - 18015 на РТС2 ВАЗЕ - РТС2_ВАЗЕ+Т.
; Для возврата в стандартное состояние вызвать
; РТС1_ ВАЗЕ =. 088,
; РТС2_ВАЗЕ = 708.
ПИ _р1с ргос пеаг
5.10.11. Джойстик -
И напоследок - о программировании ‘джойстика. Он подключается кеще одно-
му, помимо последовательного и параллельного, внешнему порту компьютера —
к игровому. Для игрового порта зарезервировано пространство портов ввода-вы-
вода от 200 до 20ЕЬ, но при общении с джойстиком используется всего один
порт - 201Ъ, чтение из которого возвращает состояние джойстика:
порт 201 для чтения:
биты 7, 6: состояние кнопок 2, 1 джойстика В
биты 5, 4: состояние кнопок 2, 1 джойстика А
ЕЕ: “ и!! Сложные
й
приемы программирования:
; Процедура геад_}оуз1ск.
; Определяет текущие координаты джойстика А.
; Выход: ВР - \-координата, ВХ - Х-координата (-1, если джойстик
; не отвечает), регистры не сохраняются.
меу а1,0
ие 431, а1 ` ‚; Зафиксировать счетчик канала 0. таймера.
1п а1, 408
Программирование на уровне портов
том ап, а? ах
11 - 21,408 _ : ВА
хсв9 ай, а] ; АХ = значение счетчика.
моу 91,ах _ ; Записать его в ОТ.
`ех1{_геаа):
тезт бх, 6х.’ ; Проверить, равен ли ВХ -1.
3$ Бх_Баа | .
ЗВг -6х,4 .; Если. нет - разделить на 16.
Ьх_Бад: Тез* фр, Бр ; Проверить,. равен ли ВР -1.
33 „бр.вад . , .
Аг Бр, 4 ; Если. нет - ‘разделить на 16.
Ьр_Баа: :
рорЁ ^
геф
геад_)оузт1ск епар_
‚ Процедура прерывания,
1птеггирт ргос фаг
ризй 9$ . — ; Сохранить регистры:
°‘ризй 5х - : 1 т.
ризй ах я . ; . 2.
198 5х, дога рег св:гедиез®: . ;..0$:ВХ
.-. адрес. запроса.
тои °' ап,Буе рег [6х+2]. в Прочитать номер команды.
ог. ал, ай ; Если команда ОбН (инициализация)
37. ви ИИ |
са11 ии о’. ‚ обслужить ее.
; Иначе:
ех1т: поу ах, 1001 ; установить бит 8 (команда обслужена)
оу < мог рег [5х+3],
ах `; В слове состояния драйвера
рор ах ‚; и восстановить: регистры.
`
; Процедура инициализации.
; Вызывается только раз при загрузке драйвера.
ТП ‚ргос пеаг
ризй сх
ризН 9х
ризИ 00408
‚ рор 3.
МОУ 5х, ЛАВ - 0$:8Х = 00401:001АВ .- адрес головы..
тоу мога рег [6х],сх Записать новый адрес головы буфера.
поу могб рег [6х+2],сх Он же новый адрес хвоста.
тому 3, 808 05:8Х = 00401:0080Н -
адрес начала буфера.
оу мога ртг [5х],
сх Записать новый адрес начала.
а94 сх, ВИЕ_$17Е*2 Добавить размер
оу мога рег [6х+2),сх и записать новый адрес конца.
‚ Сюда передается управление, если мы’ загружены слишком низко ‘в` памяти,
100.-510:
поу ан,9 Функция 00$ 091. ВЫ '
тому 9х, оЕЁз6т Та11_п$9 ; 05:0Х - адрес строки’
ризв с$ с сообщением о неуспешной
рор 38 установке.
111 211 Вывод строки на экран.
,
193. Ьх, лога рфг с$: гедиезт у 05:8Х - адрес запроса.
Драйверы устройств в 00$
моу ° могд р&г [6х+0ЕВ],0 ; Записать адрес начала драйвера.
оу мог рег [Ъ5х+108],с5 ; в поле "адрес первого {
; освобождаемого байта”.
Чопе: ° рор _ ах
рор сх °
ге! .
ПИ - епар : . .
Сообщение об успешной установке (на английском, потому что в этот момент
; русские шрифты еще не загружены).
3и6С_ $0 Ге “Кеубоагф ехтепдег. Зюадед" ‚ б0в, бАл, '$'
; Сообщение о неуспешной ‘установке.
2а1]_п$9 [29] "Лоо тапу Чг1мегз 1п тетогу - “_
96 “риЁ КЫдех*.зуз РАгзт “
(+) “]п с0п{19.зуз“,ООВ, ОАВ, '$'
епа’ эта
Теперь более подробно рассмотрим функции, которые должен поддерживать
ВОТ13— драйвер символьного устройства. КОТ13- это метод простой модифи- ‘
приведет к тому, что текст из епсгуре.хЕ будет выведен на экран, зашифрованный или
расшифрованный КОТ1З, в зависимости от того, был ли он зашифрован до этого.
Рассмотрим все команды, которые может поддерживать символьное устрой-
ство, и буфера запросов, которые им передаются.
`00Ъ: инициализация (уже рассмотрена)
0ЗЬ: ТОСТТ--чтение (если установлен бит 14 атрибута)
+0ЕЪ: 4 байта — адрес буфера —
+12Ъ: 2 байта — на входе — запрашиваемое число байтов
на выходе — реально записанное в буфер число байтов
04Ь: чтение из устройства
структура буфера для символьных устройств совпадает с ОЗЬ
05Ь: чтение без удаления символа из буфера |
+00Ъ: на выходе — прочитанный символ, 5.
если символа нет- установить бит 9 слова состояния
06Ъ: определить состояние буфера чтения,
если в буфере нет символов для чтения— установить бит 9 слова состояния
07Ь: сбросить буфер ввода. = а
08Ъ: запись в устройство. _ !
+0ЕЬ: 4 байта - адрес буфера
+125: 2 байта — на входе — число байтов для записи
на выходе — число байтов, которые были. записаны
ШЕ!! — Сложные приемы программирования
09Ъ: запись в устройство с проверкой
аналогично 08Б
ОАБ: определить состояние буфера записи,
‘если в устройство нельзя писать — установить бит 9 слова состояния
ОВЬ: сбросить буфер записи
— 0СЬ: ТОСТГ-запись (если установлен бит 14 атрибута),
аналогично 08В |
ООЬ: открыть устройство (если установлен бит 11 атрибута)
ОЕБ: закрыть устройство (если установлен бит 11 атрибута)
118: вывод, нока не занято (если установлен бит 13 атрибута),
аналогично 08 |
в отличие от функций записи здесь не считается ошибкой записать не все
байты
13В: обобщенный 1ОСТГ. (если установлен бит 6 атрибута)
+0ТБ: байт - категория устройства (01, 03, 05 = СОМ, СОМ, ТРТ)
| 00№ — неизвестная категория
+0ЕБ: байт — код подфункции: |
451: установить число повторных попыток
65}: определить число повторных попыток
4АЪ: выбрать кодовую страницу
6АБ`определить активную кодовую страницу
4СЬ: начало подготовки кодовой страницы
АОВ: конец подготовки кодовой страницы
6ВВ: получить список готовых кодовых страниц
5ЕВ: установить информацию о дисплее
7ЕВ: получить информацию о дисплее -
+0ЕЪ: 4 байта — не используются `-
+135: 4 байта— адрес структуры данных ТОСТ. - соответствует структуре, пе-
редающейся в О$:ОХ для ИМТ 21%, АХ- 440СВ
195: поддержка функций ГОСТИ, (если установлены биты 6 и 7 атрибута)
+005: байт - категория устройства |
+0ЕЪ: байт - код подфункции . |
Если эта комбинация подфункции и категории устройства не поддерживается
драйвером - надо вернуть ошибку 0ЗЬ в слове’состояния.
Итак, теперь мы можем создать полноценный драйвер символьного устрой-
ства. Упрощая задачу, реализуем только функции чтения из устройства и будем
возвращать соответствующие ошибки для других функций.
Еще одно отличие этого примера - в нем показано, как совместить в одной
программе исполняемый файл типа ЕХЕ и драйвер устройства. Если такую про-
грамму запустить обычным образом, она будет выполняться, начиная со своей
точки входа (метка 5баг в нашем примере), а если ее загрузить из СОМЕТС.$У5,
РО$5 будет считать драйвером участок программы, начинающийся со смещения 0.
Драйверы устройств. в 205.
; го13. авт
; Драйвер символьного устройства, выводящий посылаемые ему символы на экран
‚ после выполнения над ними преобразования В0Т13
: (каждая буква английского алфавита смещается .на 13 позиций).
‚ Реализованы только функции зачиси в устройство.
; Пример использования:
‚ сору епсгуртед.тхЕ $гот13
; Загрузка - из СОМЕТб. 95
; ОЕМТСЕ=С:\го{13.ехе, .
‚; если гот13.ехе находится в директории С:\.- в
зтгафеду епар
; Процедура прерывания.
1птеггир\ ргос Раг
изв
ризНа ` ; Сохранить регистры
шо Сложные приемы программирования _ 3
ризй 9$ ‚ и, На всякий случай, флаги.
ризй ез
ризй 6$
рор 95 — ; 0$ = наш сегментный ‘адрес.
1е5. $1, 0м0гд ‘рфг гедиезт ; 5:51 = адрес буфера запроса.
хог Ьх, 5х .
том Ь1, Буфе рег ез:[$1+2] ; ВХ = номер функции.
стр 61, 191 . ; Проверить, что команда
; в пределах 00 - 191.
, ]ъе сотмапа ок .
` са11 1пуа119 ‚ Если нет - выйти. с ошибкой.
тр ЗВогф 1птеггире_
ета
сомтапа_- ок: | , ; Если команда находится в пределах 00 - 198,
$81 _бх,1 ; Умножить ее на 2, чтобы получить
; смещение в таблице слов соттапа_ Табе,
са11 могд ртг сомталд_ТаБ1е[Ьх]; и вызвать обработчик.
1птеггурт_епд: .
стр а1,0 ; АЁ = 0, если не было ошибок.
3е по_еггог |
ог ав, 808 ; Если была ошибка - установить бит 15 в.АХ,
по_еггог:
ог “ав, о1п' > ; В любом случае установить бит 8
пом мог руг ез:[$1+3],ах ; и записать слово состояния.
рор ез
рор ` 9$
`рора р
рорт . у ый
гет -
1птеггирт епдр °
мг е_Р1п131ед:
хог ах, ах ` ‚ Сообщить, что ошибок не было.
рор $1
гет
иг Те епар
п 9пар
. ЗТаск ‘
епа ЭТагт
{3 Зак. 459
#1! Сложные приемы программирования
01: проверка носителя ,
+00: байт — на входе — описатель носителя
на выходе — ОРЕВ, если диск был сменен
01Ь, если диск не был сменен
00Б, если это нельзя определить
+0ТЕЪ: 4 байта — адрес АЗС 7-строки с меткой диска (если установлен бит 11
в атрибуте)
028: построить ВРВ
+0ПБ: описатель носителя
+0ЕЪ: 4 байта — на входе — дальний адрес копии первого сектора РАТ
на выходе - дальний адрес ВРВ
03В: ОСТГ--чтение (если установлен бит 14 атрибута)
04В: чтение из устройства |
+005: байт — описатель носителя
+128: 2 байта — на входе - число секторов, которые надо прочитать
на выходе — число прочитанных секторов .
+161: 2 байта — первый сектор (если больше 65 535'— здесь ОЕЕЕЕВ)
+185: 4 байта — на выходе — адрес метки диска, если произошла ошибка ОРЬ
+1СЪ: 4 байта- первый сектор |
`08Ъ: запись в.устройство.
структура буфера аналогична 04} с точностью до замены чтения на запись
09Ь: запись в устройство с проверкой |
аналогично 08
©СЬ: ТОСТЕ-запись (если установлен бит 14 атрибута)
ОБ: открыть устройство (если установлен бит 11 атрибута)
ОЕВ:. закрыть устройство (если установлен бит 11 атрибута)
ОЕВ: проверка наличия сменного диска (если установлен бит 11 атрибута):-
драйвер должен установить бит 9 слова состояния, если диск сменный,
и сбросить, если нет
135: обобщенный ТОСТТ, (если установлен бит 6 атрибута)
+0ПЬ: байт - категория устройства:
08Ъ: дисковое устройство
48В: дисковое устройство с ЕАТЗ2
+0ЕЪ: код — подфункции:
401: установить параметры
60}: прочитать параметры
41Ъ: записать дорожку
425: отформатировать и проверить дорожку
621: проверить дорожку
46Ъ: установить номер. тома
66Ъ: считать номер тома
47: установить флаг доступа
671: прочитать флаг доступа
68Ъ: определить тип носителя (2О$ 5.0+)
Драйверы устройств в 005$ — _ Минин
4АВ: заблокировать логический диск (АИпдо\з 95),
бАВ: разблокировать логический диск (УЛп4о\з 95)
4ВВ: заблокировать физический диск (УЯпао\$ 95)
‚ 6ВЬ: разблокировать физический диск (МЛп4о\з 95)
_ 6СЬ: определить флаг блокировки (УЙЯп4о\$ 95)
6): перечислить открытые файлы (УЙпдо\з 95).
`бЕН: найти файл подкачки (УЙп4о\з 95)
6ЕЬ: получить соотношение логических и физических дисков (\/т4о\з 95).
70Ъ: получить текущее состояние блокировки (УЙпдо\з 95)
71: получить адрес первого кластера (УЛп4о\з 95)
+131: адрес структуры (аналогично ПМТ 21 АХ= 4400)
17: определить логический диск (если установлен бит. 6 атрибута)
+018: байт — на входе — номер устройства
на выходе — его номер диска (1-А, 2-В) ,
18: установить логический диск (если установлен бит: 6 атрибута)
_ +018: байт - номер устройства
(команды 17В и 18 позволяют РО$ обращаться к одному и тому же
` дисководу как к устройству А: и как к устройству В)
196: поддержка функций ТОСТЕ, (если установлены биты 6 и 7. атрибута)
Для написания своего драйвера блочного устройства можно пользоваться схе-
мой, аналогичной символьному драйверу из предыдущей главы. ‚Единственное |
важное отличие - процедура инициализации должна будет подготовить и запол-
нить ВРВ, а также сообщить 2О$ число устройств, для г которых действует этот.
драйвер.
Глава 6. Программирование
в защищенном режиме
Все, о чем рассказано до этой главы, рассчитано
на работу под управлением РО$
в реальном режиме процессора (или в режиме \86), унаследованном еще с семи-
десятых годов. В этом режиме процессор неспособен адресоваться к памяти выше
границы первого мегабайта. Более того, так как для адресации используются
16-битные смещения (РМ), невозможно работать с массивами больше 65 536
байт. Защищенный режим лишен этих недостатков, в нем можно адресоваться
к участку памяти размером 4 Гб как к одному непрерывному массиву и вообще
забыть о сегментах и смещениях. Этот режим намного сложнее реального, поэто-
‚му, чтобы переключить в него процессор и поддерживать работу, надо написать
небольшую операционную систему. Кроме того, если процессор уже находится
под управлением какой-то операционной системы, которая перевела его в защи-
щенный режим, например УЛп4о\ 95, она, скорее всего, не разрешит программе
устранить себя от управления компьютером. С этой целью были разработаны спе-
циальные интерфейсы, позволяющие программам, запущенным в режиме У86
В 005$, переключаться в защищенный режим простым вызовом соответствующе-
го прерывания- УСРТ и ОРМЕ
о
Адресация в защищенном режиме НАИИВЕЕЯ
СОТ и ГОТ - таблицы глобальных и локальных дескрипторов соответствен-
но. Это таблицы. 8-байтных структур, называемых дескрипторами сегментов, где
и находится начальный адрес сегмента вместе с. другой важной информацией:
слово 3 (старшее):
биты 15-8: биты 31—24 базы
бит 7: бит гранулярности (0- лимит в байтах, 1 - лимит в 4-килобайтных еди-
ницах)
бит 6: бит разрядности (0/1
1 - 16-битный/3?2- битный сегмент)
бит 5: 0 :
бит 4: зарезервировано для операционной системы
биты 3-0: биты 19-16 лимита
слово 2:
бит 15: бит присутствия сегмента
биты 14-13: уровень привилегий дескриптора (ОРГ.)
бит 12: тип дескриптора (0 — системный, 1 - обычный)
‚ ‘биты 11-8: тип сегмента
биты 7-0: биты 23-16 базы
слово 1: биты 15-0 базы'
слово 0 (младшее): биты 15-0 лимита
Два основных поля структуры, которые нам интересны, — это база и лимит сег-
мента: База представляет линейный 32-битный адрес начала сегмента, а лимит —
20-битное число, которое ‘равно размеру сегмента в байтах (от 1 байта до 1 мега-
байта), если бит гранулярности сброшен в ноль, или в единицах по 4096 байт (от
4 Кб до 4 Гб), если он установлен в 1. Числа отсчитываются от нуля, так что ли-
мит 0 соответствует сегменту длиной 1 байт, точно так же, как база 0 соответству-
ет первому байту памяти,
Остальные элементы ‚дескриптора выполняют следующие функции:
1. Бит разрядности: для сегмента кода этот бит указывает. на разрядность опе-
рандов и адресов по умолчанию. То есть в сегменте с этим битом, установ-
ленным в 1, все команды будут интерпретироваться как 32-битные, а. пре-
фиксы изменения разрядности адреса или операнда будут превращать их
в 16-битные, и набборот. Для сегментов данных бит разрядности управляет
тем, какой регистр (5Р или Е$Р) используют команды, работающие с этим
сегментом данных как со стеком.
2. Поле ОР!. определяет уровень привилегий сегмента.
3. Бит присутствия указывает, что сегмент реально есть в памяти. Опера-
ционная система может выгрузить содержимое сегмента из памяти на диск
и сбросить бит присутствия, а когда программа попытается к нему обратить-
° ся, произойдет исключение, обработчик которого снова загрузит содержи-
мое данного сегмента в память. |
4. Бит типа дескриптора — если он равен 1, сегмент является обычным сегмен-
° том кода или данных. Если этот бит - 0, дескриптор является одним из 16
возможных видов, определяемых полем типа сегмента.
Программирование вРМ .
5. Тип сегмента: для системных регистров в этом поле находится число от 0 до
15, определяющее тип сегментов (Т.ОТ, Т$$, различные шлюзы), которые
рассмотрены в главе 9. Для обычных сегментов кода и данных эти четыре
бита выполняют следующие функции:
бит 11:0 — сегмент данных, 1 — сегмент кода
бит 10: для данных -— бит направления роста сегмента
для кода — бит подчинения
бит 9: для данных — бит разрешения записи
для кода - бит разрешения чтения
бит 8: бит обращения |
6. Бит обращения устанавливается в 1 при загрузке селектора этого сегмента.
в регистр.
7. Бит разрешения чтения/записи выбирает разрешаемые операции с сегмен-
том — для сегмента кода это могут быть выполнение или выполнение/чте-
ние, а для сегмента данных — чтение или чтение/запись.
‚ 8. Бит подчинения указывает, что данный сегмент кода является подчинен-
ным. Это значит, что программа с низким уровнем привилегий может пе-
редать управление в сегмент г кода и текущий уровень привилегий не из-
менится.
9. Бит направления роста сегмента бращает смысл лимита сегмента. В сег-
ментах с этим битом, сброшенным В НОЛЬ, разрешены абсолютно все смеще-
ния от 0 до лимита, а если этот бит 1, то допустимы все смещения, кроме от
0 до лимита. Про такой сегмент говорят, что он растет сверху вниз, так как
если лимит, например, равен—100, допустимы смещения от —100 до 0, аесли
лимит увеличить, станут допустимыми еще меньшие смещения.
Для обычных задач программирования нам не потребуется все многообразие
возможностей адресации. Единственное, что нам нужно, — это удобный неогра-
ниченный доступ кпамяти. Поэтому мы будем рассматривать простую модель па-
мяти — так называемую модель Йа, где базы всех регистров установлены в ноль,
а. лимиты - в 4 Гб. Именно в такой ситуации окажется, что можно забыть о сег-
‘ментации и пользоваться только 32-битными смещениями.
Чтобы. создать Йа(-память, нам потребуются два дескриптора.с нулевой базой аак
бе
а
аа
д,
и максимальным лимитом — один для кода и один для данных.
Дескриптор кода: лак
а
лимит ОЕЕЕЕЕВ |
база 00000000 а | ' а
Дескриптор данных:
лимит ОЕЕРЕЕЬ
база 000000008
бит присутствия = 1
уровень привилегий= 3 (минимальный)
бит типа дескриптора = 1
тип сегмента: 0010Ъ (сегмент данных, растет вверх, для | чтения/записи)
бит гранулярности = 1
бит разрядности = 1
96 ОРЕл, ОРРА, ОН, ОВ, ОН, ОЕ2А, ОСЕНИ, Он
Для того чтобы процессор знал, где искать дескрипторы, операционная систе-
ма собирает их в таблицы, которые называются СОТ (таблица глобальных деск-
рипторов - может быть только одна) и Г.ОТ (таблица локальных дескрипторов —
по одной на каждую задачу), и загружает их при помощи привилегированных
команд процессора. Так как мы пока не собираемся создавать операционные сис-
темы, нам нужно только подготовить дескриптор и вызвать соответствующую
функцию УСР! или ОРМ!.
Заметим также, что адрес, который получается при суммировании базы сег-_
мента и смещения, называется линейным адресом и может не совпадать с физи-
ческим, если дело происходит в операционной системе, реализующей виртуаль-
ную память с помощью специально предусмотренного в процессорах Пе!
страничного механизма виртуализации памяти.
ТУТ ЗЛА, АХ = 03048: Освободить точку входа для вызова из реального режима
Вход: АХ = 03046
СХ:ОХ = сегментсмещение точки входа
Выход; СЕ = 0, если точка входа удалена
управление
обработчик - стандартный ОРМГ - переходит в режим \86, а затем
прерыва ния в реально м режиме (обрабо тчи-
проходит по цепочке обработчиков
ки прерываний и исключений в реально м режиме совпада ют).
ризН 9$ ни и
рор ез ; Еб’вообще был сегментом РЗР.с. лимитом. 1001.
моу е31; оЕР5ет бОТ ; ЕбГ - адрес таблицы: 60Т.
; Цикл по всем дескрипторам в навей СОТ,
0: У едх, 1 5: ‚ которых всего два (0, 1).
зе] 1оор: , |
хог ‚ах. ах. | ; Функция ОРМТ 00:
_ ОУ сх, 1 о
17 З1В | : Создать локальный дескриптор.
оу мог4 ртг зе]естог[евх»2],ах °”, Сохранить селектор
му Ьх, ах. ; в таблице зе1естогз.
поу ах, 000СИ ; Функция ОРМТ ОСН.
116. З1В | ° `` Установить селектор.`
209 91,8 ; ЕБТ -.следующий дескриптор.
дес 9х | .
913 5е1 1оор
| -* и
'; Сюда передается управление, если произошла ошибка при’ инициализации ОРМТ
‚ (обычно, если ОРМТ просто 'нет).
ОРМТ_еггог:
ризп с3 О
рор 95° |
мо 9х,
о зе порт! -т$9 ВИ
моу ав,ЭП 2... : Вывод строки на экран.
м 2 ' ..
мо ` ай, 4СА : „; Конец ЕХЕ-программы.
1 Ра :
побрт1 _тз9 96 &— “Ошибка ОРМТ$”
ВМ_5е9 еп |
‚ Таблица дескрипторов. - -*
вот ]аъе1 Буте
; Дескриптор для 65. |
бОТ_11атС$ 5 _ ОЕЕи, ОРЕВ, ОН;ОН, О, ОЕАВ, ОСЕН, ОН
; Дескриптор для 0$.:_ г.
ОТ_#1а10$ [°]9) ОРЕВ, ОРЕА ‚ОН, ОВ, Он, ОЕ2И, ОСРА, ОВ
; Значения селекторов.
зе1естогз:
5е1_#1а{05 Чи ? -
53е1_Е1а16$ _ Чи’. ? : ,
И
Расширители 05.
Несмотря на то что ОРМЕ разрешает пользоваться многими прерываниями
напрямую и всеми через функцию 0300}, он все равно требует некоторой подго-
товки для переключения режимов. Кроме того; программа, работающая с ОРМ1
для переключения режимов, должна сочетать. в себе 16- и 32-битный сегменты,
что неудобно с точки зрения практического программирования. На самом деле
для написания приложений, идущих в защищенном режиме под РО$, никто не
применяет переключение режимов вообще- это делают специальные программы,
называющиеся расширителями ОО$.
И так далее,
К сожалению, формат исполняемых файлов 2О$ (так называемый формат
М2), вкотором по умолчанию создают программы другие компиляторы, очень не-
удобен для объединения с расширителями, ‘хотя универсальный расширитель
У/РО$Х способен обработать и такой файл, и даже просто файл с`32-битным
кодом без всяких заголовков (какой можно получить, создав СОМ-файл с дирек-
тивой оге 0), и файл в формате РЕ (см. главу 7), правда, не во всех случаях такие
1
программы будут работать успешно.
И наконец, третий подход к объединению расширителя и программы можно
видеть на примере 20532, ‚ куда входит программа ЧЙпК.ехе, являющаяся компо-
новщиком, который вполне подойдет вместо ок, (Чаю или ИК, чтобы получить
исполняемый файл, работающий с этим расширителем. |
Тем не менее популярность подхода; используемого в. \’а ош, настолько вы-
‘сока, что подавляющее большинство программ, применяющий идею расширите-
лей 205, написано именно на \/а(сот1 С или на ассемблере для \МА$М.
Прежде чем мы сможем написать обещанный в разделе 4.5.2 пример програм-
мы, работающей с линейным кадровым буфером ЗУСА, познакомимся еще с дву-
мя группами функций ОРМЕ которые нам потребуются. “1 .
Расширители 20$.
- 6.4.2. Управление памятью‘ в: ОРМИ
МТ З1В, АХ= 01001: Выделить память ниже- аницыРМб- и
Вход: ` АХ= 01008 ` к"
ВХ- требуемый размер в 16- байтних параграфах
-Выход: если СЕ= 0,
”. АХ сегментный адрес выделенного. блока для использования в реаль-
ном режиме;
ОХ- селектор выделенного блока для применения в защищенном ре-
‚ жиме
Обработчик этой функции выходит в 86 и вызывает функцию 2О$ 48. для
выделения области памяти, которую потом можно использовать. для передачи
данных между нашей программой и обработчиками прерываний, возвращающи-
ми структуры данных в памяти.
ТМТ З1В, АХ = ОЧОЧВ: Освободить память ниже границы 1 Мб
Вход: АХ= 01026
ОХ= селектор свобождаемого блока
Выход: СЕ= 0, если не было ошибок
Т№Т З1Е, АХ = 01025: Изменить размер блока, выделенного функцией 01008
Вход: АХ= 01026
ВХ - новый размер блока в 16-байтных параграфах
ОХ - селектор модифицируемого блока _
Выход: СЕ= 0, если не было ошибок
МТ З1В, АХ = 0500: Получить информацию -о свободной памяти
Вход: АХ= 0500.
ЕЗ:ЕБ- адрес 48-байтного буфера
Выход: СЁ= 0 всегда, буфер заполняётся следующей структурой данных:
+00Ъ: 4 байта — максимальный доступный блок в байтах |
+041: 4 байта- число доступных нефиксированных страниц ;
+08Ъ: 4 байта— число доступных фиксированных страниц
+0СЪ: 4 байта—- линейный размер адресного пространства в страницах. |
+10Ъ: 4 байта— общее число нефиксированных страниц .
+14Ъ: 4 байта — общее число свободных страниц
+18}: 4 байта — общее число физических страниц
+1СЬ: 4 байта— свободное место в линейном адресном пространбтве
+20Ъ: 4 байта — - размер зуар- файла или раздела в страницах
+24В: ОСЬ байт- все байты равны ЕЕЬ
ТМТ З1Ё, АХ- 05018: Выделить блок памяти
Вход: АХ= 05016
ВХ:СХ= размер блока в байтах, больше > нуля
. Выход: если СЕ= 0,
ВХ:СХ = линейный адрес блока; .
Е Пт = идентификатор блока для функций 0502 и 0503
406 1111] Программирование в РМ
“ИМТ 31, АХ = 05028: Освободить блок памяти
Вход: АХ = 05026
51:01 = идентификатор блока
Выход: СЕ = 0, если не было ошибки
Т№Т З1Ё, АХ - 05038; Изменить размер блока памяти
Вход: АХ = 0503
ВХ:СХ = новый размерв байтах
ЗЕОГ = идентификатор блока
Выход: если СЕ = 0, |
ВХ:СХ = новый линейный адрес блока;
ГОТ = новый идентификатор |
Нам потребуются еще две функции ОРМГ для работы с устройством, которое
отображает свою память в физическое пространство адресов. |
ТМТ З1Ь, АХ= 0800}: Отобразить физический адрес выше границы 1 Мб на ли-
нейный
Вход: ВХ:СХ = физический адрес
ЗЕОТ = размер области в.байтах
Выход: если-СЕЁ= 0, ВХ:СХ`= линейный адрес, который можно использовать
ба
ба
о
ав
для доступа к этой памяти
ГУТ 31}, АХ= 0801#: Отменить отображение; выполненное функцией 08005
Вход: АХ= 08016
ВХ:СХ= линейный адрес, возвращенный функцией 0800ь
Выход: СЕ= 0, если не было ошибок с’ок
ашьы
ва
льад
; Построение дескриптора
-сегмента, описывающего ЕЕВ,
; Лимит. -
том еах, евр . ; Видеопамять в килобайтах.
$11 вах,10° | ; Теперь в байтах.
дес еах ; Лимит = размер: - 1.
эАг еах, 12 ; Лимит в 4-килобайтных единицах.
моу мог руг \14е09$с+0,ах ‚ Записать биты 15-0 лимита
$ИАГ еах, 8. :
апд ай, ОЕН. -
"ЕН Программирование ® РМ
ог Буте ртг у19е043с+6,ав ; и биты 19-16 лимита. |
оу еах, евр ; Видеопамять ‘в килобайтах,
$11 еах, 10 . , ‚ В байтах. И
моу едх, амога рфг 1$:[40] ; Физический адрес (ЕВ.
моу сх,ах
$114 ебх, едх, 16 ‚; Поместить его в СХ:0Х,
МОУ 91, ах
$114 е31, еах, 16 ‚ а размер -- в 5Т:0Т
оу ах, 8008 ‚ И вызвать функцию ОРМТ 08008:. ,
11 ЗАВ | ; Отобразить физический. адрес в линейный.
с ОРМТ _еггог ,
эВга еах, еБх, 16 ; Перенести полученный линейный адрес
оу Чх, сх ‚ из В5:СХ в ЕБХ
оу мог рег \19е04$с+2,дх ; и записать биты 15-0 базы, }
Аг едх, 16 | т.
МОУ уфе рег у19е04$с+4,41 —; биты 23-16
по\ °Буте рАг у19е04$6+7,9 ;ои биты 31-24.
; Права. .1
’ оу ох, сз
]аг сх, 6х ; Прочитать права нашего сегмента
апд сх, 60008 ; и перенести биты ОР |
ог Буте ртг у19е09$с+5,сп ; в строящийся дескриптор.
; Генерация палитры.
для ‘пламени. ` ‚.. . ,
ь хог е41, ед} ; Начать написание палитры с адреса Е$:0000.
хог есх, есх о, а | -`
ра1е{Те_деп:
хог ах, еах. : Цвета’ начинаются с. 0, 0, .0.
оу с1, 63 ; Число значений для одного компонента.
ра1етте 11“ у
ЗТозЬ ; Записать байт,
°фйс еах | ‚ увеличить компонент,
стрзи ; пропустить два байта,
1оор ра1ет{е_11 ‚ и так 64 раза.. ,
ризп = е91 |
то с1, 192`
ра1ете_12:
$т0$м . ; Записать два байта
1йс 91 ; и пропустить один,
1оор ра1е{Те_12 ; и так 192 раза (до конца палитры).
рор — ©е01 ; Восстановить ЕТ.
1пс 91 |
)п5 ра1етТе_деп
дес ах
а]1геаду_2его:
$036 Записать новый цвет в буфер.
ад9 еах, едх
$Вг еах,1
поу руе р&г [е91+е$1-1],а1
1оор “ апзмахе_Р]аме
оу есх, ез1
а4 е91, есх
дес. ебх
912 ап1тафе_Г]ате
ех11_а]1:
Мом ах, ОЗВ Восстановить текстовый режим.
Расширители 205...
101
‚ах; 40008 ; =.40А —
218 ; од ИЗ - программы под расвирителем 00$.
‚дата
‚ Различные сообщения об ошибках. _
УВЕ_еггог_т59 „@6 “Ошибка УВЕ 2.0“, 001, ‚ (АВ
|] “Будет использоваться режим \УбА 320200", ОО, ОАН, ' $’
ОРМТ_еггог_м$0 Ге]. “Ошибка ОРМТ$"
ЕЕВ_еггог_ 39 95 “ЕЕВ недоступен”, о0н, бАВ"
96 “Будет использоваться режим УбА 320х200“, ООВ, ОАВ, '$'
; Параметры видеорежима.
5сг_м19ЕА [9 640
эсг_Ве19ве 94 480
3сг_$17е 39 640*480/4
; Структура, используемая.
функцией ОРМТ 03001.
у86_гедз 1абе] Буфе
у86_е91 94
\86_е$1 [ее
У86_ебр 99
у86_гез 99
у86_ебх 94 ррозФеос
ВЫ ей
|...
Программирование в РМ :
у86_едх 39 0
\у86_есх 94 0
\86_еах . 94 0
У86_Р]а95 м 0 р
\86_е5 Ом 0
№86_05 - бы 0.
\86_Р5 9м 0
\86_0$ - @м 0
у86_1р м 0
\86_с$, Фи 0.
\86_5р ^ Чи 0
\86_$5 ом 0
; Дескриптор сегмента, соответствующего иг.
\1де0дс би 0 в Биты 15-0 лимита.
ре | 0. ‚Биты 15-0’ базы. .`
. |) .0 ‚ Биты 16-23 базы. баа
а
лав
ль
ащ
олл
асеа
„о |] 460100106. ‹ Доступ. ^^
. _ 96 10000000 ° ; Биты 16-19 лимита и другие биты.
6 .0 ; Биты 24-31 базы. , |
; Селектор сегмента, описывающего РВ.
\19е03е1 ди 0 Г :
„Чата?“
; Буфер для экрана: .
‚ БуРег [е]°) 640*483. 9ир{?)
: стек. С
‚ЗТаско 10008
епа _зтаге. ^
11с1и4е зпе1132.1пс
11с1и4е Кегле132. 1пс
№! Программирование для МИп4о\ми$ 95/МТ. |
.386
.тоде] ^ Е]а*
сопзт
ЦВЕ [@6) "Пер: /Иммм, П1опК1п9. огд/^сиЬЬ
И", 0
соде |
_зтаге: ; Метка точки входа должна начинаться с подчеркивания.
хог ерх, ебх .
ризп ебх ; Для исполняемых файлов- способ показа.
ризй ебх ; Рабочая директория.
рузв ебх ; Командная строка.
ризв оРзет ИА. ; Имя файла с путем.
ризй е5х ; Операция ореп или рг1п{ (если МУЦ - ореп)
ризв ебх ; Идентификатор окна, которое получит сообщения:
са]11 Эпе11Ехесите ; злейЕхесифе (МАЕ, м, уг, ми, МОЕ, МУ}
“`` ризН ебх ”_^” Код’ выхода,
са] Ех Ргосе$$ ; Е Ргосезз(0)
епд _з\агт К та
Итак, в этой программе выполняется вызов двух системных функций 32 -
ЗВеПЕхесше (открыть файл) и ЕхРгосезз (завершить процесс). Чтобы активизи-
ровать системную функцию Уллдое, программа должна поместить в стек все пара-
метры от последнего к первому и передать управление дальней САТТ.. Данные функ-. 1
ции сами освобождают стек (завершаясь ВЕТ №) и возвращают результат работы
в регистре ЕАХ. Такая договоренность о передаче параметров называется ЭТОСАТГ.
С одной стороны, это позволяет вызывать функции с нефиксированным числом
параметров, а с другой — вызывающая сторона не должна заботиться об освобож-
дении стека. Кроме того, функции УИп4до\$ сохраняют значение регистров ЕВР,
ЕЗТ, ЕРГ и ЕВХ, этим мы пользовались в нашем примере - хранили 0 в регистре.
ЕВХ и применяли 1-байтную команду РОЗН ЕВХ вместо 2-байтной РОЗН 0.
Прежде чем мы сможем скомпилировать уЧпи!.азт, нужно создать файлы
Кегпе!32пс и $Ве32.4пс, куда поместим директивы, описывающие вызываемые
‚ системные функции.
>
; Кегпе132. 1пс | : : ‹
; Включаемый файл с: определениями фуный из , Кегпе132. 911.
1ЕдеЁ _ТАЗМ_
1пс144е135. 1прогё32. 116
; Имена используемых функций.
ехтгп Ех {Ргосе$$ :пеаг
е1зе
116119116 Кегпе132.116
; Истинные имена. используемых функций. _
ехегп __ир.._ЕхРгосе$@4 ; дмога - с
; Присваивания для облегчения читаемости кода.
Ех1{Ргосез$ еци __зтр__Ех1{Ргосез$@4
ета
‚ $1е1132. 1пс
Включаемый файл с определениями функций из 31е1132. 611.
Первая программа. :-
174ег _ТАЗМ_
зистиве11Ь 1трог\ 32.116
\ ; Имена используемых ‘функций.
ехфгп пе] }Ехеситед: пеаг
; Присваивания. для облегчения читаемости кода.
. Зле11Ехесите еди Зпе11Ехеси{еА
е1зе о.
—_ нешвень 51е1132. 316
; Истинные имена используемых функций.-
ег — __1пр_`ЭлеЕхеситеАе24:
дога
’; Присваивания дяя облегчения читаемости кода.
`’ Зве}1Ехесите` еди _ __Жр__бнеЕхеситеА@24
еп 1 Е | ВВ ` .
Имена всех системных функций \1132 модифицируются так, что перед име-
нем функции ставится подчеркивание, а после - знак @ и число байтов, кото-
рое занимают параметры, передаваемые ей в стеке: так ЕхиРгосез$ превращается
в _ЕхИРгосез@4. Компиляторы с языков высокого уровня часто останавливают-
ся на этом и вызывают функции по имени _ЕхиРгосез@4, но реально появляется
небольшая процедура-заглушка, которая ничего неделает, алишь передает управ-
ление на такую же метку, но с добавленным_ _нар_- _ _пар_ _ЕхИРгосез$@4..
Во всех наших примерах мы будем обращаться ннапрямую к _ _Нпр__ ЕхИРгосе5$
94.
К сожалению, ТАЗМ (а точнее ТТ МКЗ2) использует собственный способ вызова
системных функций, который нельзя обойти подобным образом, и программы,
скомпилированные с его помощью, оказываются ‘немного больше и в некоторых
случаях работают медленнее. Мы отделили описания функций для ТАЗМ во
включаемых файлах при помощи директив условного ассемблирования, которые
будут использовать их, если в'командной строке ассемблера указать /О_`ТАЗМ_.
Кроме того, все функции, работающие со строками (как, например, ЗвеЙЕхесие),
существуют в двух вариантах. Если строка рассматривается в обычном смысле,
как набор символов АЗСИ, к имени функции добавляется А (ЗВеПЕхесщеА). Дру-
гой вариант функции, использующий строки в формате ОМСОРЕ (два байта на
символ), заканчивается буквой О. Во всех наших примерах будут использоваться
обычные А5СП-функции, но, если вам потребуется перекомпилировать програм-
мы на ОМСОТЬЕ, достаточно поменять А на 1 во включаемых файлах.
Итак, теперь, когда у нас есть все необходимые файлы, можно скомпилировать
первую программу для УЛпдо\5.
Компиляция МАЗМ:
т] /с /со{Е /бСр м1пиг1. азт
Пок м4пиг1. 05} /зибзузсет:и1пд0м8
(здесь и далее используется 32-битная версия НпК.ехе)
Компиляция ТАЗМ:
тазт /м /т1 /0_ТАЗМ_ им1пиг].азт
{11пК32 /Тре /аа /с /х м1пиг1. 06}
а
У\А$М:
мазт и1пиг]. аз
м Чик Р11е м1пиг1.06} Рогт ип фоме пт тип те сопзо1е ор с
„386
‚воде Гат
. сопзт
дгее{_теззаде Ге 'Ехатр1е м1п32 сопзо]е ргодгам’
, ООН ‚ОА, ООН, АН, 0
еггог1_теззаде 96 Оп, ОА, 'С0и19 пот дет сиггеп{ изег папе’,
оО, ОАВ,0
еггог2_тмеззаде 45 ООН,
ОАВ, 'Соу19 пот епимегате”
, 90; ОАВ, 0
0004_ех11_ 159 (2) ‚ ООН, ОАВ, ООВ, ОДА, '№гма} Чегилпат1от” , ООВ, АВ, 0
епит_т501 6 00,
ОАВ, °[оса1 ',0
епит_ 1302 - 4 ’ гемоте- ',0
‚ Фата . .
узег_пате 96 "[1$т 0Г соппестед гезоигсез Фог ибег”
узег_БитР 6 64 дир (?) ; Буфер для. ИМетбетузег.
изег_ риЕЁР_1 99` $-изег. Буй? - ; Размер буфера для ММетбетузег.
епит_Ъие_1 99 1056 ; Длина епит_БиР в байтах.
епит_еп{г1ез . 44 1 | ; Число ресурсов, которые в нем помещаются.
„дата? | у
епит_Би МТВЕЗОЦВСЕ <?,?;?,?,?,?,7,3> ; Буфер для ММетЕпитВезоигсе.
49 256 Чир (2) ; 1024 байта для строк
меззаде_1 94 ? ° р Переменная для Иг1ТеСопзо]е,
епит_Папа]е ва ? . . ; Идентификатор для ИМетЕлитвезоигсе..
. 604е
_зтаге:
‚ Получить от системы идентификатор буфера вывода $190.
ризв $Т0_ОУТРУТ_НАМОЕЕ .
са11 бет5{4Напа1е : Возвращает идентификатор ЗТОО0УТ в еах,
том еБх, еах ` ; а мы будем хранить его в ЕВХ.
‚ Вывести строку дгеет_теззаде на экран.
по\ е$1, оРРзет дгее{_меззаде
са11 оитрит_$1г1п9
14 Зак. 459
ч
[8] _зтаге
; Из м1пбазе.в.
$ТО_ОИТРОТ_НАКОЕЕ ед {#-11
; Из м1пеггог.п:
М№_ЕВАОВ ечи 0
ЕНРОН_М№0_МОВЕ_ТТЕМ$ еду 259
; Из маппетик.п.
НЕЗОЦНСЕУЗАСЕ _СОММЕСТАВЕЕ еди 1- 2 .
ВЕЗОУНСЕТУРЕ_АМУ - еаи 0
ВЕЗОЦВСЕ_СОММЕСТЕВ _е9в 1
МТНЕЗОУВСЕ этгис
дибсоре, 99 2
аиТуре ва 7. й
901 зр1ауТуре 94 2
9\/за9е 949 -?, й
1рЁоса1Мате 99 ?
]1рАетотеМамте 99 2.
1рСоттепт 99 ?
1рРгоу1аег 09 ? >
МТВЕЗОЦВСЕ епа$ : | '
=.
=
Графические приложения
С/оЪа!АПос (в мп32 это одно и то же), а потом, прочитав информацию обо всех
ресурсах, хранящихся в нем, пришлось бы следить за тем, кончились они или нет,
и вызывать \/МеЕпитВезоигсе еще раз.
1пс1и9е дег32.1пс
1п61и4е Кегпе132.
1пс
Зпс1ибе изег32. 115:
.386 Е
.Воде1 Е1ат+
. сопзт
; Заголовок окна. .
ве] }о_1141е 96 “Е1гзт
ом1п32 ИТ ргодгат”,0
; Сообщение. | `
ле] 1о_теззаде 96 ”Не]110 мог19!”,0
‚ соде , -
_втагт: р ` - ,
рызй МВ_ТСОМТНЕОНМАТТОМ ‚ Силь окна;
ризН оРРзет Ве]10.1111е ; Адрес строки с заголовком.
ризп отЕ5ет пе110_теззаде ; Адрес строки. с. сообщением. ..
ризВ 0 . | ; Идентификатор предка.
са11 МеззадеВох
114еЕ _ТАЗМ_ |
1п6с104е115 1трог{ 32. 116
; Имена используемых функций.
| ех{гя МеззадеВохА: пеаг
; Присваивания. ^
МеззадеВох еду МеззадевВохА
е15е
11с1и9е116 узегЗ2. 115
; Истинные имена используемых функций.
ехфгп __1тр__МеззадеВохА@16 :днога
‚; Присваивания для облегчения читаемости ‚кода. ь
МеззадеВох еды ар Неъзадовохлел6 7
епт! | :
7.3.2. Окна .
Теперь, когда мы знаем, как просто выводится окно с предопределенным клас-
сом, возьмемся за создание собственного окна — процедуры, на которой будут
базироваться все последующие примеры, и познакомимся с понятием сообщения.
‚В РО$ основным средством передачи управления программам в различных ситу-
ациях служат прерывания. В \УЯп4о\из прерывания используются для системных
нужд, а для приложений существует аналогичный механизм-—механизм событий.
Так, нажатие клавиши на клавиатуре, если эта клавиша не используется УЯп4о\уз,
генерирует сообщение \/М _КЕУРОУ/М или \/М_КЕУОТР которое можно пере-
хватить, добавив в цепь обработчиков события собственное при помощи ак
ал
1пс]и4де де!32.1пс
1пс1и4е Кегпе132.
1пс $
1пс1иде изегЗ2. 1пс
.386._ л
щ
.1оде]. #1а{
. дата
т
Зе
Графические приложения
с}а3з_паме [#18 "уЧпдом с1азз 1”;0 |
м1 пдом_пате Г "и1132 азземЛу ехатр1е”,0
; Структура, описывающая класс’ окна.
ис ММОСЬАЗЗЕХ <4»12, С5$_НАЕОВАМ ог ©$_УВЕОВАИ, оРРзет м1п_ргос,0,0,7,?,?, \
СОЕ08_МТМООМ+1, 0, отРзет с1аз5_пате,0>
; Здесь находятся следующие’ поля:
; №. 65$126е = 4*12 - размер этой структуры
; мс. зтУ1е - стиль окна (перерисовывать при изменении
размера)
ис. 1рЕиМпаРгос - обработчик событий окна (м1п_ргос)
; мс. сЬС1зЕхига - число ‘дополнительных байтов после структуры (0)
; мс. сСЫМАЕХЕГа - число дополнительных байтов после окна (0)
; мс.|Тлзтапсе‘- идентификатор нашего процесса (?)
; мс.АТсоп - идентификатор иконки -(?)
; ме.ВСигвог - идентификатор курббра (7)
; мс. ПЬгВаскогоипд - идентификатор кисти или цвет фона + 1 (СОЕОВ| итнрои+1)
; мс.1р32МепиМате - ресурс с основным меню (в этом примере - 0)`
; мс. 1ре2С1аззМате - имя класса (строка с1аз$_паме} :
; м. НГсоп$т - идентификатор маленькой ‘иконки (только в 4 пдонв 95,
; для МТ должен быть 0).
. Вата?
50 и5б <?,2,2,?,?,?> ЗА это - структура, в которую возвращается
| , , сообщение после бе{Меззаде.
. соде . ‚
_зтагт: : -_.
хог ебх, е5х . ; В ЕВХ будет 0 для команд ризй 0.
; Определить идентификатор нашей программы
ризй ебх . .
са11 бетМоди]еНала1е
тоу е31, вах ; и сохранить его в ЕЗТ.
; Заполнить и зарегистрировать класс. . ‚
му - диог@ руг мс. НТлзтапсе,
еах ; Идентификатор предка,
; Выбрать иконку.
рузП ТОТ АРРЕТСАТТОМ ; Стандартная’ иконка приложения. -
ризв ебх -; Идентификатор ‘модуля с иконкой.
са} 1 ЕоадТсоп
` МОУ мс. ИТсоп, еах ; Идентификатор’ иконки для нашего класса.
; Выбрать форму курсора. ,
ризи — ТОС АВАОМ о; Стандартная стрелка. °
ризй ех . ; Идентификатор модуля с курсором.
са11 фоадСигзог 7 `
моу мс. ПСигзог,еах ; Идентификатор курсора для нащего класса.
ризН оТЕзет ис
са11 Ве91$тегС1аззЕх ; Зарегистрировать класс.
; Создать окно.
МОУ есх, Си_УЗЕВЕРАШТ; ризп есх короче ризН № в. пять ‘раз.
ризп ебх ; Адрес структуры СНЕАТЕЗТВУСТ (здесь №1).
ризв е51 , ; Идентификатор процесса, который будет получать.
„ ; сообщения от окна (то есть наш).
° риэй ‚ебх ; Идентификатор меню или окна-потомка.
1
'ЕЕЗИВНШИИШИИ! Программирование для МИпдо\миз 95/МТ 1
ризв ‚ ебх ; Идентификатор окна-предка.
ризп есх ; Высета (Си ИЗЕБЕРАЦСТ - по умолчанию).
ризВ есх ; Ширина (по умолчанию).
ризй есх ‚; У-координата (по умолчанию).
ризй есх ; Х-координата (по умолчанию).
ризй и — ОЕВЕАРРЕОАТНООИ ; Стиль окна.
ризй оЁРзет м1пдом_пате: . ‚ Заголовок
окна.
ризН ОРЕ5еф с1аз$_паме; Любой зарегистрированный класс.
ризй ебх ; Дополнительный Стиль. -
са11 Сгеате\1ивомЕх <; Создать окно (еах - идентификатор окна).
‘ ризй еах ; Идентификатор для Урдатемтдом.
рун ЗИ_ЗНОММОНМАТ. ; Тип показа для для ЗНом\1пдом..
ризй еах ‘_; Идентификатор для Звом\1паом.
; Больше идентификатор окна нам не потребуется.
са] Зои пом ‚; Показать окно
са11 Урдатем1пдом ‚ И послать ему сообщение. \М_РАТАТ;
‚ Процедура мап_огос. .
; Вызывается окном каждый раз, когда оно получает какое-нибудь сообщение. р
; Именно здесь будет происходить вся работа программы. у
м1п_ргос ргос
‚ Так как. мы получаем параметры. в стеке, построить стековый кадр.
риузВ ебр
пу ебр, езр
; Процедура типа \1п4домРгос вызывается со следующими параметрами:
пр: |
Графические приложения
мр_П\па еду’ @мога рфг [ебр+08#]; идентификатор окна,
мр_иМ59 еди Чмога рег [ебр+0Сн]; номер сообщения,
- ир_мРагат еди @мог@ рег [еБр+101]; первый параметр,
. мр_1Рагам еди мог руг [ебр+141}; второй параметр.
‚ Если мы получили сообщение ММ ОЕЗТВОУ (оно означает, что окно уже удалили
; С экрана, нажав АМ-Е4 или кнопку в верхнем правом углу),
‘ То отправим основной программе сообщение ММ_О\Т.
Стр мр_иМзд, ИМ_ОЕЗТВОУ
те поф_мт_дезтгоу
ризп 0 ; Код выхода.
са11 Роз10ч1{Меззаде . ; Послать ММ ОТ
тр эпогЕ епд_имт_спеск 5 и выйти из процедуры.
пот ми_дезтгоу:
; Если мы получили другое сообщение -. вызвать его обработчик по умолчанию.
]еауе ; Восстановить ебр
Зтр бе иНпвомРгос ; и вызвать БеРи1пдомРгос с нашими параметрами.
‹
; и адресом возврата в стеке.
еп4_мт_свеск:
]еауе ; Восстановить ебр ”
гет 16 ‚ и вернуться самим, очистив стек от параметров.
м1п_ргос епар р
- епа _$Тагт
и между е[5е и еп
у ехтгп __Чр__О1зратсНМеззадеА@4 :днога
ехфгп __1тр__Тгапз1а+еМеззаде@4 : ога
ехтгп = __1тр. _бе{Меззадед@16 :дога
ехтгп __утр__1оа9ТсопА@8 : Чиога
ехегп __1тр__Урфатем
1пдом@4 : диога
ехтгп __итр__ помп 90м@8 :Фиогд
`ехп =__1пр__СгеатенупдомЕхА@48 : дмога
ехЕгп __1тр__беР\ пвомРгосА@16 :мог
ехфгп 21тр__Розт0ц4иМеззаде@4 : мог ^
ехфгп __1тр__Ве91$ТегС1аззЕхА@4 : @могд
ехтгп __Нтр__Коа@СигзогА@8 : диога
О1зратсНМеззаде еды ._1тр__О1зрассАМеззадеА@4 :
Тгапз} атеМеззаде еди __4тр__Тгапз1а<еМеззацев4 .
бе{Меззаде. еди __1тр__ве*Меззадеде16 у
ГоааТсоп еди __1пр__Коа9ТсопА@8 . 3
Урдатей1пдон еду __1тр__урватемапдоне4 :
Эпоми1 дом, еди __1тр__ЭВом 19088 В:
Сгеате\1пдомЕх еди __1тр__Сгеатем\1пдомЕхА@48 --
Веги 1 пдомРгос еди __1тр__ бег пдомРгосА@16 |
РозтОи11Меззаде еди _. 1тр__Розт0и{Меззаде@4 р
Вед1зТегС1аззЕх. еди ._1тр__Ве91зтегС1аз$ЕхА@4 : |
оадбигзог еаи __тр__Коа9бигзогА@8
Н
графические приложения
и в файл Кегле!324пс между И4е!_ТАЗМ_ и е]зе;
, ехфрп бетмоди1еНапа1еА: пеаг
бетМови1еНала1е еди бетМоди]еНапа@1еА
и между е1зе и епИ:
| ехегп `_1тр__бе{Моди1еНапд1еА@4
:дмога
бе{Моди1еНапа1е еди —_Зпр__бемоди1енапазеле4
В начале раздела говорилось, что программировать под \Лп4о\$ просто, а в то
же время текс? обычной программы вывода пустого окна на экран уже занимает
больше места, чем, например, текст программы проигрывания \ау-файла из раз-
дела 5.10.8. Где же обещанная простота? Так вот, оказывается, что, написав
умадо\азт, мы уже создали значительную часть всех последующих программ,
а когда мы дополним этот текст полноценным диалогом, обнаружится, что боль-
ше не нужно писать все эти громоздкие конструкции, достаточно лишь копиро-
вать отдельные участки текста.
7.3.3. Меню
Меню - один из краеугольных камней идеологии УЛпдо\$. Похожие друг на
друга меню разрешают пользоваться абсолютно незнакомыми программами, не чи-
тая инструкций, и узнавать об их возможностях путем просмотра содержания раз-
личных пунктов меню. Попробуем добавить меню и в нашу программу \пдо\азт.
Первое, что нам нужно получить, — это само меню. Его, так же как и иконки,
диалоги и другая информация (вплоть до версии программы), записывают в фай-
лы ресурсов. Файл ресурсов имеет расширение *.В.С для текстового файла или
* ВЕЗ для бинарного файла, созданного специальным компилятором ресурсов
(ВС, ВВССЗ2 или \/КС). И те, и другие файлы ресурсов можно редактировать
особыми программами, входящими в дистрибутивы С/С++, или с помощью, дру-
гих средств разработки для \\Мп4о\, но мы не будем создавать слишком сложное
меню и напишем КС-файл вручную, например так:
// муптепи.гс
// Файл ресурсов для программы м1птепи. азм.
#деЁ1пе 277_ТЕЗТ 1
#4е1те 222_ОРЕН 2
вдеР1те 222_5А\Е 3
#4еЁ1пе 222_ЕХТ 4
777_Мепи МЕМО{ . Виж -
РОРУР “&Е11е” {. - |
МЕМЛТЕМ “&0реп“, 277_ОРЕМ
МЕМИТТЕМ “&бауе”, 727_ЗАУЕ ^. ,
МЕМИТТЕМ ЗЕРАВАТОВ.” |
МЕМИТТЕМ “Е&Ж4т”, 777_ЕХТ
}
МЕМИТТЕМ “&ЕЗ1т”, 272_ТЕЗТ
ТА$М: ,
Тазт /х /м /т1 /0_ТАЗМ_ м1птепи.
азт \ р
6гсс32 м1птели.гез .
1111К32 /Тре /аа /с и1птепи.о6},,,,
‚м1птепи. гез
УУА$М:
мазм м1птепи.азт
гс /г /БТ=ПЕ итатепи.гс
ге Гогт
м11пк 111е и1птепи.о5] гез и1птепи. м1пд0мз пФ ор с \
А теперь сам текст программы. Чтобы показать, как мало требуется внести
изменений в программу \п4о\.азт, комментарии для всех строк, перенесенных
оттуда без поправок, заменены символом *.
; у1имепи, азм
, Графическое м1п32-приложение, демонстрирующее работу с меню.
’ Звездочками отмечены строки, скопированные из файла ч1п4о\м. азт.
*
2272 ТЕЗТ еци 0 ; Сообщения от нашего меню
227 ОРЕМ еду. 1 ; должны совпадать с определениями из \м1птепи. гс.
227 _БАУЕ еци 2 ‹ Кроме того, в нашем примере- их номера важны,
И22_ЕХТ | еди 3 ; потому что они используются как индексы для
` : таблицы переходов к обработчикам.
1пс]1и4е 9е132.1пс о
1п61и4е Кегпе132.
1пс ;*
1пс1иде изег32. 1пс :я `
‚ 386 ‚*
.104е1 Тат ‚*
. дата ;*
с]азз. пате 96 “иЧпаом с1азз 1”,0 :*.
м1 пдом_пате 6 "и1п32 аззетб]у ехатр?е”,0 ;* 1
тмепи_пате ЧБ "227 _Мепи", 0 ; Имя меню в файле ресурсов. |
те$1_тз9 6 "Уои зе1естед мепи 11ет ТЕЗТ”,0 ; Строки для |
ореп_тз9 ЧБ “Усуи зе1есте мепи 1{еш ОРЕМ",0 —; демонстрации работы :
зауе_1$9 [ее] “Уои зе1естед мепи 14ет ЗАУЕ",0 ; меню. |
мс ИМОСЕАЗЗЕХ <4»12,С5$_НВЕОНАМ ог С$_МУВЕОВАИ, оГРзеЕ м1п_ргос,0,0,2,7,7,\
0, оРзет с1азз_пате,0> ;*
СОГОВ_МТМООМ-Т,
„Вата? ‚*
1$9_ мб <7,2,?,?,?,?> ; .
. соде ‚*
_зтагт: у
хог еБх, ебх ;*
ризв еьх ;*
са11 бетмоди1еНапа1е я | .
оу ез1, еах К |
тоу амога р\г мс. АТлзтапсе, еах ;*
з
О
ризй ТОГ_АРРЕТСАТТОМ ‚*
ризв ебх .*
са} 1 тоад1соп ;*
то\ мс. Тсоп, еах о:
ризй ° ТОС_АВАОМ ;* `
ризп е5х у .*
са11 | оаабитзог я
оу мс. ПСигзог, вах 1.
рип оРРзее мс соя
са11 Вед1зтегС1аззЕх ;=
ив 4е{324пс: .
_; Из и1пизег.п, . |
ММ_СОММАМО еду 1118
мВ_ОК еду 0
7.3.4. Диалоги
чиваются од-
Графические программы для УЛпдо\з почти никогда`не ограни
ввести реальн ую инфор мацию - только
ним меню, потому что оно не позволяет
. Конечн о, в цикле после СеМез заве
выбрать какой-либо пункт из предложенных
я передв ижения мыши и нажати я
или РееКМеззаре можно обрабатывать событи
ммах, наприм ер в играх, но если
клавиш, и так делают в интерактивных програ
ь файл на диске
требуется ввести текст и в дальнейшем его редактировать, выбрат
мации в програ ммах для УЛиадом ока-
ит. п. то основным средством ввода инфор
зываются диалоги.
но если меню легко
Диалог описывается, также каки меню, в файле ресурсов,
пользоваться каким-
написать вручную, то ради диалогов, скорее всего, придется
любим ым компилятором, при
нибудь редактором, идущим в комплекте с вашим
по каким коорди натам располага-
условии, конечно, что вы не знаете в точности,
ется каждый контрол (активный элемент диалога). _
// м1т919.гс . ь
я в: программе м1п919.а5м.
// Файл ресурсов, описывающий. диалог, который ‘используетс
можно заменить на #1пс1иае` <иализег.в>, если он есть.
// Все следующие определения
`
|| Программирование для МИпдомиз 95/МТ
// стили для диалогов.
#де1те 0$. СЕМТЕВ 0х0800
8де1пе 0$_МОВАГЕВАМЕ Ох80Е
#4е1пе 0$_30400К 0х00041.
// Стили для окон. .
#деР1пе и$_МТАТМТЕЕВОХ 0х000200001.
вде1пе №$_ЗУЗМЕМИ 0х00080000.
ндег1пе и$_УТЗТВЕЕ 0х100000001.
иде1пе №5_ОМЕНЕАРРЕВ 0х00000000Е.
Нае1пе №5 САРТТОМ 0хС00000. '
// Стили для редактора.
#9е71пе ЕЗ_АЦТОНУСАОН. — 0х801.
#9е1пе ЕЗ_ЁЕЕТ 0
#ае1пе 20Е6_МЕМИТ
// Идентификаторы контролов диалога. . йе
#9еЁ1пе ТОС_ЕОТТ 0
#0е71пе ТОС_ВУТТОМ 1
#9еНте 100_ЕХИ 2
Р
И
// Идентификаторы пунктов меню.
#4ее1пе ТОМ_СЕТТЕХТ 10
#9е1пе ТОМ_СЬЕАВ11 | `
#4ет1пе ТОМ_ЕХТ 12
.386
‚моде: Т1ат
„Фата
91а109_паме Г) "777 _01а109",0 ‚ Имя диалога в ресурсах.
‚ Фата? ` .
Биетег 95 ‚ 512 @ир(?) ; Буфер для введенного текста.
.соде |
_$Тагт: : .
хог ебх, е5х — $ В ЕВХ будет 0 для команд ризп` 0
. ; (короче в 2 раза).
; Определить идентификатор. нашей программы.
ризй еБх
са11 бетМоди]еНапа1е
; Запустить диалог.
ризй еБх ; Значение, которое перейдет как параметр ММ_ТМТТОТАЕОС.
ризй оЁЕзет „.91а109_ргос ; Адрес процедуры типа О3а1одРгос.
ризв ебх ; Идентификатор окна-предка. (0 - ничей. диалог).
ризп оЕРзет 91а100_пате ; Адрес имени диалога в ресурсах.
ризв еах :; Идентификатор программы, в ресурсах которой .
; находится диалог (наш идентификатор в ЕАХ)..
са11 01а] 0о9ВохРагам
; Выход из программы.
ризп ебх
са11 Еж {Ргосе$$
пот_деттехт:
стр еах, 1ОМ_СТЕАН ; Если это пункт меню’ б1ваг:
пе пот с1еаг
ризН 0 м. й | | |
ризв ` 1ОС_ЕМТ ‚ Номер контрола. .
ризй есх
са11 $е10191ТемТехе __; Установить новый текст,
т О
пот сТеаг-
сир вах, ТОМ_ЕХТТ ; Если это’ пункт меню Ехо: ..
]пе ‚потехе
ризй 0 ‚ код возврата.
ризв есх. Идентификатор диалога. ^
са11 Еп001а109 Закрыть диалог, | .
1Рагат_по*_0: - ФРагат не ноль’ - сообщение. от контрола.
сир еах, ТОС_ЕХЛТ - Если
4.жеж сообщение`от кнопки ЕхТ.
_ пе пот_ех1т'
зпг ‚ вах, 16 |
сир еах, ВМ_СЕТСКЕВ =; Если ее нажали:
ризй 0. ‚.. + Юд возврата.
ризп есх (о ; Идентификатор диалога.
са} 1 Еп301а309 ; Закрыть диалог.
пот_ех1т: |
хог еах, вах ; "После обработки команды
1пс вах‘ ‚ О1афодРгос должен возвращать ТВУЕ (еах = 1).
]еауе .
гет . 16 ; Конец процедуры.
пот _соттапа: : Сюда передается управление, если мы получили
В .; какое-то незнакомое сообщение,
хог вах, еах : Код возврата ЕАЁЗЕ (еах =.0).,
]еауе ,
гет 16 у : Конец процедуры.
91а100_ргос епар |
епб _зтагт
Между ее и еп
еххгт — _ 1ир__О1а1о9ВохРагамА@20 :дога
ег — _ 1тр__ 6е101911ет@8 : диогд
и ехфгп __фар__ЗетРосиз@4 :дога
ехтгп __1р.-бет019Т<етТехтА@16 :быо га
ехугп __{тр__$е10191<етТех{А@12 :дога
ег = __Змр__Еп901а1096@8 : @ногв
О1а1одВохРагая еди __ир__О+а1одВохРагамА@20
6е1010 тет еди __1тр__661019Пете8
ЗетРоси$ еди ` _1тр__$е1Росиз@4
бет019ТтемТехЕ — еаи __1тр__бет019хемТех{А@16
$е1019{ейТехх еду. __ тр. _Зер19Т{етТехтАв12
Еп901а109 еди __1ер__Е1904а10988
Добавления к файлу Че З24пс:
; Из мтлизег.п.
ИМ ТМГТОТАЦОб о еди 1108.
” | Программирование:
для МИпаомиз 95 ИМТ .
УМ_С10Е еди 10в
ВМ СИТСКЕЮ —- ви 0
7.3.5. Полноценное приложение
Теперь, когда мы знаем, как строятся программы с меню и диалогами, попро-
буем написать настоящее полноценное приложение, включающее в себя все то, что
требуется от программы, - меню, диалоги, комбинации клавиш для быстрого до-
ступа к элементам меню и т. д. В качестве примера создадим простой текстовый
редактор, аналогичный Мо(ерач. В этом примере увидим, как получить параметры
из ‘командной строки, прочитать и записать файл, выделить и освободить память.
// м1праад95.
гс
// Файл ресурсов для программы м1прад95. азт.
// Основное меню.
ТО МЕМУ МЕМУ ОТЗСАВОАВЕЕ {
РОРИР “"8Е11е”. { .
МЕМОТТЕМ “&Мем\&Стг1+№“, : ТОМ_МЕМ
МЕМИТТЕМ “&0реп...\1Схг1+0”", ТОМ_ОРЕМ
МЕМИТТЕМ "вбаме\тСтг1+5", ТОМ. ЗАМЕ
МЕМИТТЕМ “бауе &А$...\1С1г1+$111+5”. ТОМ_ЗАМЕА$ .
` МЕМУТТЕМ ЗЕРАВАТОН
МЕМИТТЕМ “Е&х1Е\4Стг1+0”, ТОМ_ЕХТТ
}.
РОРУР “ЕТ” {
МЕМИТТЕМ "вИпао\{Стг1-2”,. Том_им№00
МЕМИТТЕМ ЗЕРАВАТОВ |
Графические приложения _
МЕМИТТЕМ “Суё\хСтг1-Х", ТОМ_СИТ
МЕМАТЕМ “&Сору\хСтг1-С", ТОМ_СОРУ
МЕМИРТЕМ “&Разте\тСиг1-\М", ТОМ_РАЗТЕ
МЕМОТТЕМ “&0е1ете\\0е1”, ТОМ _СЬЕАЯ
МЕМИТТЕМ ЗЕРАВАТОВ
МЕМЛТЕМ “Зе1ест &А11\1С1г1-А”; ТОМ_ЗЕТЗЕЕ
}
РОРУР “&Не1р“ { |
МЕМИТЕМ “АБоцт”, ТОМ_АВОУТ
}
}
// Комбинации клавин,
ТО_АССЕЕ. АССЕСЕВАТОН$ -ОТЗСАВОАВЕЕ {
^№", ТОМ МЕН, СОМТАОЕ, УТВТКЕУ
, ТОМ ОРЕМ, СОМТАОЕ, УТАТКЕУ
", ТОМ_ЗАМЕ, СОМТВОЕ, УТАТКЕУ
", ТОМ ЗАМЕАЗ, СОМТВОЕ, ЗНТЕТ, УТВТКЕУ
ТОМ_ЕХШТ, СОМТНОЕ, УТВТКЕУ
", 10М №00, СОМТАОЕ, УТАТКЕУ
хчоюфоо
“, ТОМ $ЕТЗЕЕ, СОМТАОЕ, УТАТКЕУ
}
// Все эти определения можно заменить 81пс1иде >.
<и1пузег.
{де 1пе 0$_МООБАЕРВАМЕ 0х801.
вдег+те 05_30400К 4
89ег1те И5_РОРУР 0х800000001
‘заеГ1пе И№$_САРТТОМ 0хС00000%
‚ ваегте №$_ЗУЗМЕМИ _ 0х8. . -
#9е1пе Т100К 1
в4ее1пе Т0С_$ТАТТС -1
зает1пе ТОТ_АРРЕТСАТТОМ 32512
ндеРлпе №$_ВОЯОЕЯ 0х8006001
// Стандартный диалог “Абоцт”.
10_АВОИТ ОТАЕОб ОТЗСАВОАВСЕ 0, 0, 125, 75
ЗТУЫЕ 0$_| МОБАТЕВАМЕ | 0$_30400К | М№$_РОРУР |\$_САРТТОМ | №5 _бУЗНЕМИ
САРТТОМ “АБоцт Азтрад95”
{
тон ТОТ_АРРЕТСАТТОН, ТОС_ЗТАТТС, 12, 15, 21,20
СТЕХТ “Азтра995“, Т0С_ЗТАТТС, 0,30,40,8
“Ргототуре потерад- зту1е ебутог` Тог И1пвомз 95 игИТеп,
СТЕХТ
еп1ге1у 1п аззеть1у 1апдцаде”“, ТОб_ ЗТАТТС, 45,10,70, 45, №5 _ВОЯОЕЯ
БЕРРУЗНВИТТОМ “ОК”, ТО0К, 35,60, 40, 10
} !
.386
.тоде] Тат
‚ СОП5Т ; .
с_м_ пате 46 “Азтрад95”, 0 ; Это и имя класса, и имя основного окна.
©4911 _с1а$$ 5 “е911",0; Предопределенное имя класса.для редактора.
спапдез_п$9 ЧБ "бауе спапдез?”, 0 и
ЕЦег_31г119 65 “А Е11е3",0,'*+.»',0 ; Маски для бетжЕ1еМапе.
* 95 “Техе Е11е3”,0,'*.1х1’,0,0 Ио
.дата
; Структура, испбльзующаяся бет*Р11еМате. о
оп ОРЕМЕТЬЕМАМЕ <517Е о{п,?,?, оРРзер 111тег_$1г1п9д,?,?,2?,
оРРзефх БиЕРег,\
МАХЗТ2Е, 0,?,?,?,?,?,7,0,?,?,?>
; Структура, описывающая наш основной класс.
мс ИМОСЬАЗ$ЕХ <5Т2Е ММОСЬАЗЗЕХ, СЗ-НВЕОВАМ ог С$_УАЕБВАМ, оеТзе м1п_ргос,0, \
0,7,?,?, СОГОВ МТМООи+1, Т_МЕМИ, оРРзет с_м папе, 0>
Р]ад_ипт1 ед 96 `1; = 1, если имя файла не определено’ (новый файл).
. дата? .
п_едТи1пдом 94 ? ‚; Идентификатор окна редактора,
№_ассе1 93 ? ; Идентификатор массива акселераторов.
р_тетогу 04 ? ; Адрес буфера в памяти. <
$12еНеадиг11е 94 ? |
. 199_ №56 <>
гес ЯЕСТ <> :
БиеРег. 96 МАХЗТ2Е 9ир(?) —; Имя файла.
_ м1пдом_111]е 6 МАХОТЕЕ 4ир(?), 12 4ир(?)
‚ соде-
_зтаге: , ,
са11 бетСоттапа
пе —; Получить наву командную строку.
ту е01, еах ее
оу а1,’'
моу есх, МАХЭТ2Е | |
герпе. зсазь _; Найти конец имени нашей программы.
ср — Буе риг [е91],0 а
]е ст911пе_етрту .
тоу е31, 201 < В
МОУ е91., оРЁЕзеф БиЁРег
А
НЕ
м
Графические приложения
гер АЕ)
ЮУ +1а9_ипт11е9,0
ст911пе_етрту:
$ Подготовить и зарегистрировать класс.
хог ебх, ебх
са11 бетМоди1еНапа1е `. ; Определить наш идентификатор
му е51, еах
тоу мс. ПТпзТапсе,еах ^ ; и сохранить его в мс. ВТпзтапсе
пу оЁп. _ИТлзтапсе, еах |
ризв ТОГ АРРЕТСАТТОМ ; или ТОТ_ТСОН, если иконка есть в ресурсах,
о ебх : или ез$1, если иконка есть в ресурсах.
ризй
са11 ТюадТсоп
моу мс. НГсоп, еах.
‘ризи 10С_АВНОМ „: Предопределенный курсор (стрелка).
ризВ ебх
са11 1оадбигзог
тоу ис. ПСигэог, еах
ризв огРзет мс
са] Вео1тегС1аззЕх
; Создать основное окно.
ризи еБх
ризй е31 ` ,
ризН еБх
ризй е5х
рузв 200
ризй 300
ризп . СМ УЗЕБЕРААТ
ризй СМ. ОЗЕБЕРАУЕТ
, разв \З_ОМЕЯГАРРЕОМТМООМ
ризА отРзет с_м пате
ризй отЕзет с_м_паме
ризп ` МЗЕХ_СЕТЕНТЕОВЕ
са11 Сгеате\пдомЕх
рузв еах | ; "Для рор ез1 перед меззаде_1оор.
рузп еах | ‹
рии $М_ЭНОИМОВМАЕ
ризй еах
са] Эпом\ 1пдом
са11 Урдатем1 пом
; Инициализировать акселераторы.
рии 10 АССЕЕ
. ризй 231 ..
са11 |оадАссе1егатог$
моу н_ассе],еах ^
; Цикл ожидания сообщения. .
рор 951 ; ЕЗТ - идентификатор основного окна.
е91, оРРзет т$9_ ; ЕСТ - структура с ‘сообщением от него.
воу
тмеззаде_1оор: . у и
ризй е5х
ризй ебх
| ТИ Программирование для МИп4оми$ 95./МТ
ризп еьх
ризН е91
са11 ‘ бе{Меззаде ; Получить сообщение.
тез+ еах, еах ; Если это ИМ_ОУТТ,
32 ех11_тз9_1оор ; выйти из цикла.°
ризВ е91
ризй н_ассе1
рузв е51 ‚ Мпа
са1]1 — Тгапз1атеАссе]егахог ; Преобразовать акселераторы в ТОМ»
тез1 еах, еах
12 меззаде_1оор
ризй е91 а
ав
аво
орать
са} ] Тгапз]атеМмеззаде ; Преобразовать сообщения от клавиш
ризИ е91
са11 О15рахспМеззаде ; и отправить обратно.
Эр зпогЕ меззаде_Тоор
ех1т_т39_100р:
ризй 159_. мРагат
са11 ЕхИРгосез$ ‚ Конец программы.
; Процедура“ м1п_ргос.
: Обработчик ИМ СГОЗЕ.
‚; Если нужно, спрашивает, сохранить ли. файл;
|_мт_с]05е:
са11 заме_соптеп{$
тр зпог{ деГг_ргос
; Обработчик ММ_СВЕАТЕ.
В_ми_сгеае:
; Здесь также можно создать +0016аг и зфатизВаг.
; Создать окно. редактора’.
ризВ еБх . | | ,
ризи мс.НТазтапсе ; Идентификатор основной программы.
ризй ЕТО
рызй е$1 ‚ П\пд
ризВ еБх ° : 0
‚ ризй ебх ; 0
ризв ебх | | :0
ру$П ебх : 2:0
риузй М5 УТЗТВЕЕ ог №$_СНТЬО ог ЕЗ_ЦЕЕТ ог ЕЗ_МУАСТИТМЕ ог\
ЕЗ_АИТОНУСНОЕ: ог Еб_АЦТОМЗСВОЕН
ризй еБх ;: 0
ризй ОТЕзет е01{_с1аз$ .
рип ебх : ; 0
са11 Сгеатем1 пдомЕх
поу |_е911и1п9дом, еах
‚ Передать ему фокус.
ризп еах
са11 ЗетРосиз
стр ад. ип {1е9, 1
]е соп{1пие_сгеате ,
са]11 зК1р_детореп ; Открыть файл, указанный. в командной строке.
соп1пие_сгеате:
са] зет_11е
тр епд_мт_спеск
; Обработчик ММ_СОММАЮО.
В_мт_соттапа:
том еах, ир_мРагат |
сжде $ Младшее слово содержит: ТОМ_.*.
ЫИ: еах, 1008
| 5 дег_ргос
; Обработать сообщения от пунктов. меню.
са11 Чиог@ руг мепи_папд1егз[еах»4]
Этр епд_мт_спеск
А
|_19т_5е15е1:
ризВ -1 ‚ -1
ризй ебх ; 0
ризй ЕМ_ЗЕТЗЕЕ ‚ Выделить весь текст.
рузп п_е91
{м1 п90м
са11 ЗепдМеззаде
гет
Графические-приложения
; Обработчик ТОМ_АВОМТ: у . И
|_19т_абоц*: .
ризй ебх ;0
ризв — оЁРзеф абоит_ргос ‚
ризв 251. ; Мпа
ризп 10 АВОЦТ
ризй мс. АТпзтапсе
са]1 01а1098охРагат
- те ,
‚ Обработчик ТОМ_ОРЕМ,
й_19_ореп:
са11 зауе_соптепт$
‚ Вызвать стандартный диалог выбора имени файла. ;
ОУ оп.
Е]адз, ОРМ_РТТЕМУЗТЕХТ$Т ог ОЕРМ_РАТНМОЗТЕХТЬТ ог\,
ОЕМ_ЕХРЕОВЕВ
ризв оЁРзет оп
‚ са11 бет0репЕ11еМате
тет еах, еах
1]2 {11 е_ореп_Ра1]е9
$КТр. детореп:
; Открыть выбранный файл.
ризп ебх
ризп . ЕТЬЕ АТТАТВИТЕ_АНСНТУЕ
ри$Н ОРЕМ_ЕХТЗЬТТК@
'риузв ебх .
ризй ЕТЕ ЗНАВЕ_ВЕАО ог ЕТЬЕ _ЗНАЯЕ_МВТТЕ
ризй СЕМЕНТС_ВЕАО ог СЕМЕАТС_МВТТЕ
ризй ОЕЕзее БиРЕег |
са11 Сгеафе[11е _,
поу е91, еах ; Идентификатор для НеадЕ11е.
; Выделить память.
ризп. МЕМЗТЕ `
ризв СМЕМ_МОМЕАВЕЕ ог СМЕМ_2ЕВОТМТТ
с811 6106а1А1106
# . ризп еах ‚ НМетогу для б?оБа1Ёгее.
ризй еах ; ИМетогу для’ б1оБа1Щоск.
Графические приложения ..::
са} 6] оба1Ёоск ; Получить адрес выделенной памяти.
ризв еах ; рМетогу для б1обаТИп1оск.
ризв еах ‚ рМетогу для ЗепаМеззаде.
: Прочитать файл. |
о ризв еъх
ризН от5ет 512ейеадие1те
ризй МЕМЗТ2Е-1 . `
рип вах ; рМетогу для ВеадЕ11е.
ризН ед1
са] ВеадЕ1е Г
; Послать окну редактора сообщение мт_зеех{ о том,
; что нужно забрать текст из буфера. _ у
рузп е5х ; рМетогу уже в стеке.
ризв ИМ_ЗЕТТЕХТ '
ризй В_е94 {ма пом
са11 ЗепаМеззаде
; А теперь можно закрыть файл и освободить память.
са]11 61оБа1/п1оск ; рМетогу уже в стеке.
са] 1 61оБа1Егее ; НМетогу уже в стеке.
ризв е41 ИЕ,
са11 С1озеНап1е В
моу Буте ртг Г1ад_ипт1{1ед,0
са11 зет_1141е
Е е_ореп_Га1]ед:
ризй В_ ©9111 пом
са11 ЗетРосиз ^
гет
; Обработчик ТОМ_ЕЖТ. | `
п_19т_ех{:
са]] заме_соптепт$
ризн е31 ; ВМпа
са1} Безтгоуй1паом ; Уничтожить наше окно.
гет
‚ Обработчик ММ_$12Е.
| мм_$17е:
; Здесь Также надо послать ММ_$1ГЕ окнам Тоо]баг и зтафизБат, изменить размер окна
; редактора так, чтобы оно по-прежнему было максимального размера.
ризп оЁРзет гес
ризй ез1 > Мпа
са11 бетС11ептВесе
ризй 1 ‚ Тгие
ризй гес. Боттом = ; петовт.
ризй ‚гес. г1аНт ‚ м1аВ
ризй ех . ‚У
ризН еБх 5х
ризН Б_е91{1 пдом
са11 › Момемтдом
тр пог епб_мт_сНеск.
Ш! Программирование для МЛидоми 95/МТ
; Обработчик ИМ_АСТТМАТЕ. |
№_мт_аст1уате:
ризй П_е91 {1 п90м
са11 ЗетРосиуз
тр ЗПогф епд_мт_спеск
; Обработчик ММ_БЕЗТВОУ.
А_мт_дезтгоу:
‘рузй ебх
са]1 РозЕ0и1{Меззаде ; Послать ИМ_ОИТТ основной программе.
111 1е9:
по\ Чиога рег [е4911, '1%п0" ; Дописать “Упт1“\,
Графические приложения _ __ ПЬЕСЕ
оу Чиогд рег [е91+41, '9е11' ; Дописать “{1е4". с:
‚294 241,8 г. -
Эр зВогЕ ада. ргодламе_
; Процедура заме_соптепгз,
; ЕВХ. =.0, ЕЗТ = ВИЧ
зауе_соптептз: ..
; Спросить редактор, изменялся-ли текст.
ризй ебх
ризв ебх .
рузв ЕМ_СЕТМООТРУ ба
раз № едиитаом.
‚ са11 . ЗепдбМеззаде
Тез еах, еах к
ру пот_то9111ед
; Спросить пользователя, сохранять ли его.
ризВ МВ УЕЗМО + МВ_ТСОММААМТМС
ризв оТРзет с_м_пате
рип ОЁРзет свапдез_тз9
ризй е31 ` 1
са11 МеззацеВох А -
стр еах, ТОУЕЗ
ле пот п0911е9
‚ Сохранить его.
са11 в_19т_зауе
пос_тпо911е9:
‚ ге
м1п_ргос ‘епдр
епд _$Тагт
ШИ Программирование для МИпдоми$ 95 /МТ Е
Размер этой программы- 6,5 Кб (скомпилированной ш|/НоК), и даже версия, |
в которую добавлено все, что есть в Мобера4 (вывод файла на печать и поиск по }
тексту), получилась меньше поёера4.ехе почти в четыре раза. Чем значительнее .?
\УМпдо\з-приложение создается, тем сильнее сказывается выигрыш в размерах _
при использовании ассемблера, даже несмотря на то, что мы лишь вызываем сис-
темные функции, практически не занимаясь программированием.
Прежде чем можно будет скомпилировать \Лпра@95.азт, следует внести необ-
ходимые дополнения в наши включаемые файлы.
Добавления в файл 4е!32.1щс:
; Из м1лизег.п.
ИМ СВЕАТЕ _ еду `1
ИМ_АСТТУАТЕ' еди. 6’
ММ _ЗЕТТЕХТ еди осв
\М бЕТТЕХТ еди 008
УМ СИТ еди оон
\М_СОРУ еди Зо1н
ММ_РАЗТЕ еди 3028 |
ММ СТЕАН еду 3038
ИМ 0900 еди З04и
ММ ТЕ . еди 5
М$_УТЗТВЕЕ = еди 100000001
М$_СНТЕО еаи 400000008
\$_ЕХ_СЕТЕМТЕОбЕ еди 2001
ЕЁ ТЕРТ | еди 0
ЕЗ_МОЕТТЕТМЕ ` еди 4
ЕЗ_АЦТОНУСВОГ Е еди вон
Е$_АИТОУЬСВОн. еди 401
ЕМ СЕТНАМОТЕ . еди оВОв
ЕМ бЕТМООТРУ еач ОВ8В
ЕМ_ЗЕТМООТРУ еди ОВУВ
ЕМ_0№00 еач ОСН
ЕМ_ЗЕТЗЕЕ еаи ОВлН
МВ_УЕЗМО : еду 4
МВ_ТСОМИАВМТМС еду зол
ток - еду 1
` ТОУЕЗ еди 6
; Из и1ппт.в. -
СЕМЕАЯТС_ВЕАБ ° еб 800000008
СЕМЕНТС_МВТТЕ еду 400000008
ЕТЬЕ_ЗНАВЕ_ВЕАВ еду 1
ЕЛЕ _$НАВЕ_МАТТЕ еду 2
ЕТЬЕ АТТАТВОТЕ_АВСНТУЕ еди 20Н
; Из сотта19.п.
ОЕМ.РАТНМУЗТЕХТЬТ _ га 8001
` ОРМ_ЕТЕЕМУЗТЕХТЬТ еду 10008
ОЕМ_ЕХР\.ОВЕВ еди 800001
Графические приложения — __ _ ИМЕЕТ
ОЕМ_ОМЕВИВТТЕРВОМРТ еду 2
‘ОРЕМЕЦ-ЕМАМЕ згис
${гис{$17е 99 ?
ВипдОмпег | 94 ?
_ВТпзТапсе 99 ?
ТретгЕГ Мег , 94 ?
< Тресгбизфойг
тег 49 ?
пМахСиз Е тег . 04. ?
пЕ1 ]егТпдех . 94 ?
]1регЕПе | 99 ?
. пМахЕ11е ` | 94 2
1рэтгЕ11еТ111е 99 ?
пМахЕ11ет1+]е 04 2
ТрегштинанН1г 94 ?
1р$1гТ1118 43 ?
Е1адз . 34 ?
` пРЗео[Евет ` @м 2
пЕ 1 еЕх{епз1оп м ?
1ретгОеГЕХ+ 99 2
1Сиз{бата . 94 ?
]ТрЕпНоок 94 ?
1рТетр]1афемате 94 ?
ОРЕМЕТЕЕМАМЕ епд$
$ Из итпаег.п,
ВЕСТ ЗТгис .
1е 99 ?
Тор 93 ?
гаи 94 ?
. Боттом 94 ?
ВЕСТ епдз у
‚ Из м1пбазе.В.
СМЕМ_МОМЕАВЕЕ . еди 2
СМЕМ_СЕВОТМТТ еди 408
ОРЕМ_ЕХТЗТТМб еди 3
СВЕАТЕ_А1МАУ$У еду 2
15 Зак. 459.
\\ Программирование для МИпдому$ 95 /МТ ]
и между е1зе и епа!:
ех&гп __Нр__1$1г1еп6@4
:дмога
ехфгп :_1тр__ветСоттапа
Е1пеА@0 :диога
ехтгп __{тр__С10озеНапа1е@4
‚дога
ехтгп __Нтр__6105а1А110с@8
: диогд
ехтгп _.1тр__бТоба11оск@4 ; дмога
ехтгп __4тр__61оба1Егее6@4 : диогд
ехфгп __Нар__Сгеате[11еА@28 : дога
ехф гп __тр__ВеадЕ11е620: дмогд
ехЁгп __1р__ Мг {еЕ11е620 : дмога
151г]еп еду __фтр__151г1еп@4
бетСоттала 1 пе еди - __ир__бетСоттапа 1пеА@0
С1озеНапа1е еди __1тр__С1озеНапа1е64
6106а1А110с еду _ __р__61оба1А110с@8
б1оБа1 0ск еду __1тр__61оБа 1оск@4
6] оба1Егее еда __Нр__61оБа1Егее@4
Сгеате[11е еди __Нир__Сгеате[11е4А@28
ВеадЕ1]е . еду __1р__ВеадЕ11е@20
иг теР1]е еди -_ 4тр_ Мг ее е@20
14ег _ТАЗМ_ . в
11с]и9е116 1трог{32.
116
ехЕгп . бетОрепРЛеМатед:
пеаг
ехфгп бе{Зауе[11еМамед:
пеаг
бетОрепР11еНате е4и бе{ОрепЕ1 1еМатеА
бе{бауе[11еМате еди бе{зауе[1 ]еМатеА
е1зе
. 1пс1иде115 сот 032.116
; Истинные имена используемых функций.
ехтгп __1тр__бетОрепЕ1 1еМатеА@4 : диогв
ехфгп - __ р бе+бауе[! 1еМатед@4 : диога
; Присваивания для удобства. использования.
бе{ОрепЕ1 1еМате еди __Шир__бетОреп[11еМатед@4
бе{Заме[1]еМате ед0’ __1тр__бе{бауеР 11еМатед@4
епаз Е в” о
; 911ги$. азт
; ОЕ для м1п32 - перекодировщик из `'Ко18 в ср1251.
.386
.109е1
Р1ат
; Функции, определяемые в ВЦ-файле.
1Р4еЕ _МАЗМ_ .
риб11с _Ко12и1п_а$т@0 ; Ко12м1п_азт - перекодирует символ в А.
руб11с _Ко12м1164 ; СНАВ МТМАРТ Ко12м1п(СНАВ зутбо1).
ру611с _Ко12м11$_азт@0 ; К012м1пз_азт - перекодирует строку в [ЕАХ].
руб11с _Ко12\1п5@4 ; \ОТО ИТМАРТ Ко1т2м1и(СНАВ* $1Г1п9).
е]зе
руб]11с Ко12\1п_азт ‚ Те же функции для ТАЗМ и МАЗИ.
руб11с Ко12м1п
ру611с Ко12и1пз_аят
ру611с Ко12\1п$
епа1Р
‚ СОПЗТ
Динамические ‘библиотеки
; Таблица для ‘перевода ‘символа из кодировки КОТ8-г (ВЕС1489)
‚ в кодировку \1п90м8 (ср12513; таблица только для символов 800 -.ЕЕВ .
; (то есть надо будет вычесть 801 из символа, преобразовать его командой х1ат
; и снова добавить 801).
Кам {6} ЧБ 16 9ир(0) ; Символы, не существующие в ср1251,
96 16 дир(0) ; Перекодируются в 801.
Ч6 00в, 00, 00, 388, ООН, 008, ООН, ООН
Ге) 00, 00, 00н, 00%, 008, 00%, 00и, ООН
[2] 001, ООН, 001, 28, 001, 00н, ООН, 008
ЧБ. 00и, ООН, 008, ООН, ООН, 008, 00н, 008
[6] ТЕР, 601, 6б1н, 7бн, 648, 651, 74Нн, 638
6 _ 751, 68н, 69№, 6Ан, 68н, 6Сп, 60и, бЕп
96 6Еп, УРА, ТОН, 71И, 721, 731, 661, 628
[е 7СВ, УВВ, тн, 78н, 7ОН, 79В, 77Н, 7АН
Ге) °БЕВ, 408, 41н, 561, 441, 456, 541, 438
[6] 551, 481, 49., 4АВ, 48ВВ, 4С1,. 401, 4ЕВ
6 4Е!, 5ЕВ, 508, 518, 521, 531, 461, 428
96 5Сн, 5ВВ, 47н, 581, 501, 591, 57и, 5АВ.
. соде
; Процедура ОБЕЕптгу. Получает три параметра - ‘идентификатор, причину вызова
‚; И зарезервированный параметр. Нам не нужен ни один из них.
_$8таг{@12:
моу а], 1 ; Надо вернуть ненулевое число в ЕАХ.
гет 12
; Процедура ВУТЕ МТМАРТ `Ко12м1п (ВУТЕ зутьоТ) - точка входа для вызова из С.
114ее _МАЗМ_ .
_Ко1 21184 ргос
е15е ‘
Кот ргос
епо1Е
рор есх. ; Обратный адрес в ЕСХ.
рор еах
; Параметр в ЕСХ (теперь стек очищен
; от параметров!).
ризН есх ; Обратный адрес вернуть`в стек для ВЕТ.
‚; Здесь нет команды ВЕТ - управление передается следующей процедуре.
1Р9ер _МАЗМ_
_Ко12м1п@4 епар
е15е
Ко121п епар
ета
; Процедура Ко12\1п_азт.
; Точка входа для вызова из ассемблерных программ:
‚ ввод: АЁБ - код символа в КОТ,
‚ вывод: АЁ - код этого же символа в ИМ.
1Р4еР _МАЗМ_
_Ко12м1п_а31@0 — ргос
е15е
Ко12м1п_азт ргос
епа1Е
ШИ! Программирование для МИпдоми; 95 /МТ. |
тезт а1, 808 ; ‚Если. символ ‘меньше 80Н (старший бит 0),
32 аопт_десоде ; ‘не перекодировать, |
ризй е5х | ; иначе -
моу ебх, оРЕзет К2м_151 -
зиБ а1, 808 ‚ вычесть 801,
х1а{ ‚ перекодировать
а34 а], 801. ; и прибавить 801.
рор ебх
доп{_Чесоде: .
ге ` , ; Выйти.
1РдеРг _МАЗМ_
_Ко12м1п_азт@0 — епар
е]зе
Ко1 21 п_азт епар
епа1{
; №010 Кко12матз(ВУТЕ»Ко1$1г1п9) - : }
; Точка входа для вызова из С. . Е
11 деЁ. _МАЗМ_
_Ко12м1п3@4 ргос
е15е
Ко12м115 „ргос
епа1те
`рор есх И ; Адрес возврата из стека.
‚ рор еах ; Параметр в ЕАХ.
ризн ° ‘есх ; ‘Адрес возврата в стек.
174еЕ _МАЗМ.-
_Ко1 211564 : епар
е15е |
Ко12м11$ епар
епа1Р
; Точка входа для вызова из ассемблера:
; ввод: ЕАХ - адрес строки, которую надо преобразовать из КОТ в ИТМ.
1Е4ет _МАЗМ_
_Ко12\11$_а$1@0 ргос 3
е1е Е
Ко12\1пз_азм ргос
епотЕ
рузй -е31 ; Сохранить регистры, которые
; нельзя изменять,
ризй е91
рызп ебх
оу е$1, еах ; Приемник строк
ОУ е41 , еах ; и источник совпадают.
оу еъх, оРзет Кк2и_1Ь1
десоде_з1г1пд: .
' 10936 | ; Прочитать байт,
тезт а1, 80И ‚ если старший бит 0,
Динамические‘ библиотеки <.
ру доп{_десоде2 ; не перекодировать, ` ‘.
зиБ а], 801 ; иначе - вычесть 801,
„ хат ; перекодировать
ааа а1, 80В ; и добавить 801.
допт_десоде2:
УТо5Б ; Вернуть байт. на место,
те51 а], а1 ; если байт - не ноль,
12 десоде_51г110 —^; продолжить. -
рор ебх
рор е01
-. рор е$1
ге
1Е4еР _МАЗМ_°
_Ко12м11$_а$т@80 епар
е1зе
Ко12\1пз_азт епдр
епа1Р |
епд _$1аг{@12
Как видно из примера, нам пришлось назвать все процедуры по-разному для
различных ассемблеров. В случае МАЗМ понятно, что все функции должны иметь
имена типа _5аг6@12, а иначе программам, использующим их, придется обращать-
ся кфункциям с именами типа _ _пар_эатв, то есть такой ОГ1.-файл нельзя будет
загружать из программы, написанной на Мтсгозой С. В случае ТАЗМ и \МАЗМ
процедуры могут иметь неискаженные имена (и более того, \/1пК.ехе не позволяет
экспортировать имя переменной, содержащее символ @), так как их компиляторы
берут имена процедур не из библиотечного файла, а прямо из ОТТ. посредством
соответствующей программы -— нарЦЬ или \/ПЪ.
Итак, чтобы воспользоваться полученным ЮЫ.-файлом, напишем простую
программу, которая перекодирует одну строку из КО]-8г в УЛп4о\з ср1251.
; 9119ето. азт
; Графическое приложение для \1п32, демонстрирующее работу с 911гиз. 911,
; выводит строку в КОТ8 и затем в ср1251, перекодированную функцией Ко12м1п5.
‚ Компиляция:
; -МАЗМ
; №] /с /с01Р /Ср /О_МАЗМ_ 911дето. азт
; Илк 9119ето.05] /зибзузтем:
м1пдом$
‚ (должен присутствовать файл 411гиз.116, созданный при компиляции 911гиз. 911)
; ТАЗМ
; Тазт /т /м] /0_ ТАЗМ_ 911дето.
азм
; Шир 911ги$.116 911ги$, 911
; 1111К32 /Тре /аа /х /с 9114ето.
06)
‚ МАЗМ
‚ мазм 9114ето.азт
ЕВВИШШИШИНИИИИИ Программировани
дляМиомиз
е 95/МТ'
; №116 911гуз. МБ 91]ги$. 911
‚ мыпк 11]е 91]дет0.06] Рог м1пд0м$ пе
,
.386
.тоде1 Раф
‚ сопзт
1111е_$1г1191 ЧБ “ко12м1п Чето: $4г1пд 1п КО18”,0
11 1е_$1г1192 6 “Ко12м1п ето: ${г1пд 1п ср1251”,0
‚ Чата а
о
м
Ко1_31г1п9 95 ОЕЗВ, 0041, 002н, ОСЕП, ОСВН, ОСЛН, 201, ОСЕП, ОСЛН
6 20Н, ОЕВИ, ОЕРВ, ОЕЭН, 208, 288, 0
. соде
_зТагт:
риэН МВ_ОК :
ризй. ОЁРзеф 11{1е_3{г1п91 ‚; Заголовок окна МеззадеВох.
ризй ОЕРЁзеф ко1_$1г1п9 ‚ Строка на КОТ.
ризй оо
са]11 МеззадевВох
пом еах, оРРзеф Ко1 317119
рузй еах:
са11 Ко12\1п$
ризп МВ_ОК .
рузй оЁР5ет т1{1е_$1г1п92
ризН оРРзеф Ко1_$1г1п9
рузп 0
са11 МеззадеВох
Драйверы устройство = — т: 557
.
превращается в:
ризй
ризй
ризН
ризй е
ризй Фсзсозсь
са11 зоте_ргос
ве
а н
Передача параметров. р НОО
зоте_ргос ргос
ризй Бр
тои `° Бр, зр ; Создать стековый кадр.
а | еди [6р+12] : Определения для простого. доступа: к параметрам.
ь еду [6р+10] | |
с еди [6р+8]
| еду [6р+6]
е еди (6р+4]
рор р
. гет 10
зоте_ргос _ епдр
8.1.2. Конвенция С |
Данный способ передачи параметров используется в первую очередь в языках
СиС++, а также в РКОГОС и др. Параметры помещаются в стек в обратном по-
рядке, а удаление параметров из стека (в противоположность РАЗСАТ--конвен-
ции) выполняет вызывающая процедура:
запись
зоте_ргос(а,
6,с,4,е)
превращается в:
ризп
ризп
ризй
ризй
рузй:. оософо
о
са11 зоте_ргос.
‚ ада эр, 10 ‚ Освободить стек.
И Ассемблер и языки высокого уровня]
Вызванная процедура может инициализироваться следующим образом:
зоте_ргос ргос
'^ ризв Бр С!
поу Бр, зр ‚ Создать ‘стековый кадр. р
а еду ` [6р+41 }; Определения для простого доступа к параметрам.
Ь : вау [5р+6]
| еду’ [6р+8]
9. ` еач [6р+10]
е еац [6р+12]
рор р
гет |
зоте_ргос епдр
:
эквивалентно
ргос1(рагат1 , рагат2};
ргос2 (рагам1, рагат2);
вот почему компиляторы с языка С создают более компактный и быстрый код не-
жели компиляторы с других языков.
Искажениеимен _ .. ам ия
превращается в
‘ризй а.
са1} _зоте_ргос@4
‚ Цикл от 10 до 0.
МОУ _ 9х, 10. о |
1оор_зтагт: .
[тело цикла] ,
дес ах р Уменьшить
0х, -
313... Дооргвтаге ; если ЭХ не отрицательный - продолжить. цикл.
Используйте короткую форму команды тр, где возможно (пр зВогё метка).
Как можно реже загружайте сегментные регистры.
Как можно меньше переключайте задачи -— это очень медленная процедура. Ча-
сто, если сохранение состояния процесса не требует больших затрат, например для
реализации нитей, переключение быстрее организовать с помощью программы.
Команда {ЕА
ТЕА можно использовать (кроме прямого назначения — вычисления адреса
сложно адресуемой переменной) для следующих двух ситуаций:
О быстрое умножение
]еа вах, [вах»2] .; ЕАХ = ЕАХх 2 (3181 .еах,1 лучше).
]еа вах, [еах+еах*2] _; ЕАХ = ЕАХ х 3.
1еа еах, [еах*4] ; ЕАХ = ЕАХХ 4 (571 вах, 2 лучше).
]еа еах, [еах+еах»4] ; ЕАХ = ЕАХХ 57
1еа вах, [еах+еахя8] ; ЕАХ = ЕАХх 9.
Отрехоперандное сложение о р|
1еа есх, [еах+еьх] °. ; ЕСХ = ВАХ + ЕВХ.
Выполнение команд_
Процессор Репёит содержит два конвейера исполнения целочисленных ко-
манд (ЦЧи\У) и один конвейер для команд ЕРУ. Он может выполнять две цело-
команды одновременно, и поддерживает механизм предсказания пере-
численные
ходов, значительно сокращающий частоту сброса очереди предвыборки из-за.
передачи управления по другому адресу. |
На стадии загрузки команды процессор анализирует сразу две следующие ко-
манды, находящиеся в очереди, и, если возможно, выполняет одну из них в О-кон-
вейере, а другую в У. Если это невозможно, первая команда загружается в О-кон-
вейер, а \У-конвейер пустует.
\У-конвейер имеет определенные ограничения на виды команд, которые. могут
в нем исполняться. Приложение 2 содержит для каждой команды информацию
о том, может ли она выполняться одновременно с другими командами и в каком
конвейере. Кроме того, две команды не будут запущены одновременно, если:
О команды подвержены одной из следующих регистровых зависимостей:
— первая команда пишет в регистр, а вторая читает из него;
— обе команды пишут в один и тот же регистр (кроме записи в ЕРГАС$).
Исключения из этих правил— пары РОЗН/РО$Н, РУЗН/РОР
и РО$Н/САЦ,, осуществляющие запись в регистр ЕЗР;
О одна из команд не находится в кэше команд (кроме случая, если первая ко-
манда — однобайтная);
О одна из команд длиннее семи байт (для РепЧит);
Оодна команда длиннее восьми байт, а другая — семи (для Реинит ММХ).
Помните, что простыми перестановками: команд можно выиграть до.200% ско-
рости в критических ситуациях.
Кэш-память
Процессор Репимт. состоит из двух 8-килобайтных блоков кэш-памяти, один
`° для кода и один для данных с длиной линейки 32 байта. Кэш данных состоит из
_ восьми банков, причем он доступен из ‚обоих конвейеров одновременно, только
‘если обращения происходят к разным банкам. Когда данные или код находятся
‘в не кэше, минимальная дополнительная задержка составляет 4 такта.
Если происходит два кэш-промаха одновременно при записи в память из обо-
`их конвейеров и обе записи попадают в одно учетверенное слово (например, при
записи двух слов в последовательные адреса), процессор затрачивает столько же
времени, сколько и на один кэш-промах. .
[472 ГОТ | ‚ _ Оптимизация
Очередь предвыборки ,
Перед тем как команды распределяются по конвейерам, они загружаются из
памяти в одну из четырех 32-байтных очередей предвыборки. Если загружается
команда перехода и блок предсказания переходов подтверждает, что переход про-
изойдет, начинает работать следующая очередь предвыборки. Это сделано для
того, чтобы, если предсказание было неверным, первая очередь продолжила вы-
борку команд после невыполненной команды перехода. ы
Если условный переход не был предугадан, затрачивается 3 такта, когда коман-
да перехода находилась в О-конвейере, и 4 такта, когда в \.
Если безусловный переход или вызов процедуры не был предугадан, затрачи-
вается 3 такта в любом случае.
Конвейер ЕРИ
Конвейер исполнения команд ЕРО состоит из трех участков, на каждом из\ко-
торых команда тратит по крайней мере один такт. Многие команды, однако, пост-
роены таким образом, что позволяют другим командам выполняться на ранних
участках конвейера, пока данные команды выполняются на более поздних. Кроме
того, параллельно с длинными командами ЕРО, например ЕР, могут выпол-
няться команды в целочисленных конвейерах.
Команда ЕХСН может выполняться одновременно почти с любой командой
ЕРГ. что позволяет использовать ЗТ(в) как неупорядоченный набор регистров
практически без потерь в производительности.
Конвейер ММХ
Команды ММХ, так же как команды ЕРУ, используют дополнительный кон-
вейер, содержащий два блока целочисленной арифметики (и логики), один блок
умножения, блок сдвигов, блок доступа к памяти и блок доступа к целочислен-
ным регистрам. Все блоки, кроме умножителя, выполняют свои стадии команды
за один такт, умножение требует трех тактов, но имеет собственный буфер, поз-
воляющий принимать по одной команде каждый такт. Так как блоков арифмети-
ки два, соответствующие операции могут выполняться одновременно в - или
У-конвейере. Команды, использующие блок сдвигов или умножитель, способны
осуществляться в любом конвейере, но не одновременно с другими командами,
применяющими тот же самый блок. А команды, обращающиеся к памяти или
обычным регистрам, в состоянии выполняться только в О-конвейере и только
одновременно с ММХ-командами.
Если перед командой, копирующей ММХ-регистр в память или в обычный ре-
гистр, происходила запись в ММХ-регистр, затрачивается один лишний такт.
9.3.3. Особенности архитектуры процессоров Репйит Рго
и РепНит ПИ
Процессоры Репиит Рго и Репиит П включают в себя целый набор средств
для ускорения выполнения программ, В них происходит выполнение команд не
по порядку, предсказание команд и переходов, аппаратное переименование ре-
гистров.
Низкоуровнёвая оптимизация М
АИ ОИНИИНЕ Е
Выполнение команд | .
За каждый такт процессора. из очереди предвыборки может быть прочитано
и декодировано на микрооперации до трех команд. В этот момент работают три.
декодера, первый из которых декодирует команды, содержащие до четырех мик-
роопераций, а другие два — только команды из одной микрооперации. Если в ас-
семблерной программе команды упорядочены в соответствии с этим правилом
(4-1-1), то на каждый такт будет происходить декодирование трех команд. Напри-
мер: если в последовательности команд
ад еах, [е5х} - ср 2% - в декодер 0. на ‚первом такте:
моу есх, [еах] ; 2 - пауза 1 такт, пока декодер 0
; не освободится. |
` 299 едх, 8 ; 1м - декодер 1 на втором такте. `
Конвейер 0
Блок целочисленной арифметики
Блок команд ЁЕА
Блок команд сдвига
| ‚ Конвейер. 1
Блок чтения
:
Е.
‚оптимизация МЕН
‚ чтобы наиболее частым исходом было бы отсутствие перехода, и что полезно вы-
равнивать команды на границы слова. Кроме того, желательно располагать редко
используемый код в конце процедуры, чтобы он не считывался в очередь предвы-
борки впустую.
Предсказание переходов '
Процессор поддерживает 512- байтный буфер выполненных переходов и их це-
лей. Система предсказания может обнаруживать последовательность до. четырех
повторяющихся переходов, то есть четыре вложенных цикла будут иметь процент
предсказания близкий к 100. Кроме того, дополнительный буфер адресов возврата
позволяет правильно предсказывать циклы, из которых вызываются подпрограммы.
На неправильно предсказанный переход затрачивается как минимум девять
тактов (в среднем от 10 до 15). На правильно предсказанный невыполняющийся
‚переход не затрачивается никаких дополнительных тактов вообще. На правильно
предсказанный выполняющийся переход затрачивается один дополнительный
такт. Именно поэтому минимальное время исполнения цикла на Репцит Рго или
Репиит П — два такта и, если цикл может выполняться быстрее, он должен быть
развернут.
с
Если команда перехода не находится в буфере, система предсказания делает
следующие предположения: — | |
О безусловный переход предсказывается как происходящий, и на его выполне-
ние затрачивается 5-6 тактов;
О условный переход назад предсказывается как происходящий, и на его выпол-
нение также затрачивается 5—6 тактов; -
О условный переход вперед предсказывается как непроисходящий. При этом.
команды, следующие за ним, предварительно загружаются и начинают ис-.
полняться, вот почему не размещайте данные сразу после команды перехода.
Глава 10. Процессоры ие!
в защищенном режиме
Мы уже неоднократно сталкивались с защищенным режимом и даже програм-
мировали приложения, которые ‘работали в нем (см. главы 6 и 7), при этом
пользовались только средствами, которые предоставляла операционная система,
и до сих пор не рассматривали, как процессор переходит и функционирует в за-
щищенном режиме, то есть как работают современные операционные системы.
Дело вот в чем: управление защищенным режимом в современных процессорах
Табе] — это самый сложный. раздел программирования и самая сложная глава
в этой книге. Но материал можно легко освоить, если рассматривать этот раздел
шаг за шагом — отдельные механизмы работы процессора достаточно мало пере-
крываются друг с другом. „Прежде чем рассматривать собственно программиро-
вание, познакомимся с регистрами и командами процессора, которые пока’ были
от нас скрыты.
10.1. Регистры
Рассматривая регистры процессора в разделе 2.1, мы специально ничего не рас-
сказали-о регистрах, которые не используются в обычном программировании,
в основном'Именно потому; что они управляют защищенным режимом.
16 Зак. 459
ЕТ ШИНИИИ | Процессоры ще! в защищенном режиме |
10.2. Системные и привилегированные команды.
Команда Назначение ' | Процессор
ЕСОТ источник | Загрузить регистр СОТВ 80286
Копирует младшие 16 бит регистра СКО в приемник (16- или 32-битный регистр
или 16-битная переменная). Если приемник 32-битный, значения его старших би-
тов не определены. Команда $М$\У нужна для совместимости. В процессором
80286, и вместо нее удобнее использовать тоу еах,сгО. >
3 УМ Выйти из режима ММ Р5
; Компиляция: °
; ТАМ:
; Тазт /п ртО.азт
; СИшк /х. ИЕ ро. 063
; МАЗ: .
; 1 /с ро. азт
; Илк рт0.05},,МА.,,
‚; @хе2Ь1п рто.ехе рт. сом
; МАЗМ: :
; мазт рт. азт.
; упак Ре ртб.об] Рогт 00$ СОМ
.109е1 пу
„.соде
.386р ; Все наши примеры рассчитаны ‘на 80386.
огд 1001 ; Это СОМ-программа. |
зтагт. *
; Подготовить сегментные регистры.
ризп [е-
рор 93 | ; 0$ - сегмент данных (и кода) нашей программы.
рузА 088008
, рор ез ° °, Е - сегмент видеопамяти.
; Проверить, находимся ли мы уже в’ защищенном ‘режиме:
Мом вах, сго — ; Прочитать регистр СВО.
‚ Тезт а], 1 ; Проверить бит РЕ, ,
32 по_\У86 ‚ если он ноль - мы можем продолжать
‚ Иначе - сообщить об ошибке и ‘выйти.
оу ав, 9 ; Функция 00$ 09н.
Входи выход из защищенного режима ПЕТЯ
моу вх, от Тзет У86_мз9; 05:0Х’- адрес. строки.
1 21 р . 5 Вывод на экран..
гет ; Конец СОМ-программы,
; (поскольку это защищенный режим, в котором работает нава 00$-програма,
‚ То это должен быть \86).
\86_тз0 [6 “Процессор в рехиме \86 - нельзя переключиться в РМ$”
10.4.2. Селектор
Селектор - это 16-битное число следующего формата:
биты 16-3: номер. дескриптора в таблице (от 0 до 8191)
бит 2: 1 - использовать ГОТ, 0 - использовать СОТ
биты 1-0: запрашиваемый уровень привилегий при обращении к сегменту
`’и текущий уровень привилегий для селектора, загруженного в С$
Селектор, содержащий нулевые биты 16-3, называется нулевым и требуется
для загрузки в неиспользуемые сегментные регистры. Любое обращение в сег-
мент; адресуемый нулевым селектором, приводит к исключению #СР(0), в то
время как загрузка в сегментный регистр ошибочного селектора вызывает исклю-
чение #СР(селектор). Попытка загрузки нулевого селектора в 55 или С$ также
вызывает #СР(0), поскольку эти селекторы используются всегда.
10.4.3. Дескрипторы
Дескриптор - это 64-битная (восьмибайтная) структура данных, которая мо-
жет встречаться в таблицах СОТ`и ГОТ. Он способен описывать сегмент кода, сег-
мент данных, сегмент состояния задачи; быть шлюзом вызова, ловушки, прерыва-
ния или задачи. В СОТ также может находиться дескриптор ГОТ.
Дескриптор сегмента данных или кода (подробно рассмотрен в разделе 6.1)
байт 7: биты 31-24 базы сегмента.
байт 6: бит 7: бит гранулярности (0 — лимит в байтах, 1 - лимит в 4-килобайт-
ных единицах)
бит 6: бит разрядности 0 — 16- битный, 1 - 32-битный сегмент)
бит 5: 0
бит 4: зарезервировано для операционной с системы
биты 3-0: биты 19 - 16 лимита
байт 5: (байт доступа)
бит 7: бит присутствия сегмента
биты 6-5: уровень привилегий дескриптора (ОРГ.)
бит 4: 1 (тип дескриптора — несистемный)
бит 3: тип сегмента (0 — данных, 1 — кода)
бит 2: бит подчиненности для кода, бит расширения вниз для данных
бит 1; бит разрешения чтения для кода, бит разрешения записи для данных
бит 0: бит доступа (1 - к сегменту было обращение)
байт 4: биты 23—16 базы сегмента
байты 3-2: биты 15-0 базы
байты 1-0: биты 15-0 лимита
ЕЕУНИИШИИВИИ |Процессоры н\е! в защищенном режиме: |
Таблица 22. Типы системных дескрипторов
; рт. азт
режиме.
‚ Программа, демонстрирующая работу с сегментами в защищенном
возвращается в 00$.
; Переключается в ‘модель Г1а{, выполняет вывод на экран и
‚ Компиляция:
; ТАЗМ:
; Тазт /ш рт!.азм
; Ик Их /3 ре]. 06)
; МАЗМ: | й
; № /с ри. аз *-.
; Ш1К рм1.063,,МИЕ,,,
; МАЗИ;
‚ ‘мазт рт. авт ^
ЯМ_зе9 епд5
а
а
а
дАь
ы
аа
р
р
Сегментная адресация. › осу
[и $Е1...1661%С$: ; Селектор.
РМ_5е9 еп.
и они тоже будут работать. Единственное, что отключает этот режим, — програм-
‘мы, переходящие в защищенный режим и обратно, которые устанавливают гра-
ницы сегментов в 64 Кб, например любые программы, использующие расширите-
ли РОЗ.
ШИ! Процессоры т*е! в защищенном режиме
Нереальный режим -— идеальный вариант для программ, которым необходима
32-битная адресация и свободное обращение ко всем прерываниям В10$ и РО$
(традиционный способ состоял бы в работе в защищенном режиме с переключе-
нием в \У86 для вызова ВО$ или РО5, как это делается в случае с ОРМТ).
‚ Для перехода в этот режим можно воспользоваться, например, такой процедурой:
; Область данных:
бОТ ]аБе} Буе :
[6] 8 9ир(0) ; Нулевой дескриптор.
; 16-битный 4 Гб сегмент: . |
у Ч6 ОРЕВ, ОРРА, 0, 0.0, 1001001Ь, 110011115,0
даег 9м 16 ; Размер 60Т.
99 Базе — 94 ? ; Линейный адрес ОТ.
; Код программы.
; Определить линейный адрес ©0Т.
хог еах, вах
моу ах, сз
ЗВ]. еах,4
а99 ах, оГРзет вот
; Загрузить @0Т из одного дескриптора (не считая нулевого).
йоу 64 Базе, еах
1941 Рмога рег датг
; Перейти в защищенный режим.
с11
. У вах, сго .
ог а1,1
мо\ сго, вах |
тр зтагт_РМ ; Сбросить очередь предвыборки.
; 1п1е1 рекомендует
$ТагЕ_РМ: ; Делать )тр после каждой смены режима.
; Загрузить все сегментные регистры дескриптором с лимитом 4 Гб.
: оу ‚ ‘ах,8 ; 8 - селектор нашего дескриптора.
моу 9$,ах
пу = е$,ах
- том 3,ах
поу 93, ах сх
; Перейти в реальный режим.
моу еах,сго ,
ап а1,ОРЕВ '
оу сгО, еах
Этр ех4{_РМ
ех1т_РМ: |
; Записать что-нибудь в каждый сегментный регистр.
хог ах, ах
оу 33,ах
моу ез, ах
оу 73, ах `
моу 9$, ах
.
‚; Компиляция ТАЗМ;
; Тазш /т /0_ТАЗМ_ рм2.азт
; (или, для версий 3.х, достаточно Тазм /т рм2. аз)
; 1 1тКк Их /З рм2.05]
; Компиляция МАМ:
; мазт /0_рм2.азт
; м11пКкК 111е рт2.06] Рогт 00$
. 386р
ВМ ед зедтепф рага риуб11с "СО0Е" изе16
аззите с$:ВМ_5е9, 93:РМ_5е0, $$; зтаск_зед
эТагт:
; ‘Очистить экран.
ОУ ах,3
111 108
‚ Подготовить сегментные регистры.
ризв РМ_5е9
рор 9$
; Проверить, не находимся ли мы уже в РМ:
` МОУ еах, сг0
тез+ а1,1
37 по_\86
;’ Сообщить и выйти.
моу 4х,30 \86_т59
егг_ех1т:
, поу ай, 9
10 218
оу ап, 4СВ
11 211 |
; Может быть, это И1пд0мз 95 делает вид, что РЕ =
по_\86:
ЮУ ах, 16001
177 2ЕВ
теэ+ а1,а1
32 по_м1100м$
; Сообщить и выйти,
оу 9х,30 и1п_1$0
Этр ЗНогЕ егг_ех1+
\
ВМ_гетигп:
; Перейти в ВМ,
пом еах, сго
апё а], ОРЕЯ
оу сго, еах
; Сбросить очередь и .загрузить 65 реальным числом.
95 ОЕАВ
бм $+4
Чи АМ_зе9
; Установить регистры для работы в реальном режиме.
тому ах, РМ_зе9 |
оу 9$,ах
оу е$, ах
мо ах, зфаск_$е9
моу Ьх, этаск_1
мо $5, ах
оу эр,5х
‚ Загрузить ТОТВ для реального режима.
моу ах, РМ_5е9
тому 9$,ах
1191 Рыога руг 19тг_геа1
; Разрешить ММТ.
п а1, 701
апа а», О7ЕН
ош ТОВ, а1
; Разрешить прерывания
31
5 И выйти.
оу ан, 4СН
171 218
АМ _эе0 епаз
‚ 32-битный сегмент.
РМ_зед’ зедтеп{ ‘рага руБ11с “СО0Е” изез2
аззите с$:РМ_ед
; Таблицы @ОТ и ТОТ должны быть выравнены, так что будем их размещать
‚ в начале сегмента. г
вот Дабе] Буте
ЧЬ 8 9ир(0)
; .32-битный 4-гигабайтный сегмент с базой = 0.
в0Т_+11а{0$ 95 ОЕРВ, ОЕРВ, 0,0,0, 10010010, 110011116,0
‚ 16-битный 64-килобайтный сегмент кода. с’ базой ВМ. зе9.
СОТ. 1651165 96 . ОЕЕВ, ОРЕН, 0,0, 0,10011010,
0,0
Обработка прерыванийи исключений [ММ
; 32-битный 4-гигабайтный сегмент. кода с базой РМ_369.
бОТ_3261160$ 96 ОЕЕВ, ОРЕв,0, 0,0, 100110106, 110011116,0
; 32-битный 4-гигабайтный сегмент данных с базой РМ_эе9.
вОТ_326110$ 96 ОЕ, ОЕЕН, 0, 0,0,100100106, 110011116, 0
:; 32-битный 4-гигабайтный сегмент данных с базой $Таск_5е9.
бОТ_32511$$ ° 95 ОЕЕв;ОРЕВ, 0,0, 0, 100100105, 1100111150
991_512е = $-б0Т
ог м. 941_$12е-1 ; Лимит 60Т.
93 ? ; Линейный адрес 60Т.
; Имена для селекторов.
ЗЕЁ_Е1а{0$ еду 0010006
ЕЁ _166140$ еди 0100005
ЗЕЁ_326146$ еди 0110006 ` -
ЗЕЁ_326410$ еби . . 1000006 `
ЗЕ|_325115$ еди 1010006
: Таблица дескрипторов прерываний ТОТ.
ТОТ ]аБе1 ` Буте
; Все’эти дескрипторы имеют тип ОЕп - 32-битный шлюз прерывания.
; ТМ 00 - 07
[1 8 бир(50 1пт_папаЗег, 5ЕЁ_326146$, ЗЕСОВ, 0)
; МТ 08 (1г90) .
дм з0 1г40_7_папд]ег, $ЕЁ_326116$, 8Е0 ОВ, 0
; М 09 (1191) = |
ди 50 1г41_папд1ег, 5Е1_326116$, 8ЕООП, 0
; Т№Т оАВ - ЕВ (1802 - 1408)
[е\ 6 дир(з0 1г40_7_папа1ег, $Е`_326116$, 8Е0ОВ,.0)
; ЛАТ 10. - 6 .
Чи 97 дир(зо 1п*_ПВапа1ег, ЗЕЁ_32511С$, 8ЕООН, 0)
; ЛАТ 70н - 781 (1408 - 19015)
@и 8 Зир(з0. 1г48_15_ папё1ег, $ЕЁ_32611С$, ВЕ, 0)
‚ ШТ 798 - ЕР
дм 135 дир($0 11 Вапа1 ег, Е _326116$, 8ЕООЛ, 0)
14% 317е = $-ШТ ; Размер ШТ.
г м 191_$12е-1 ; Лимит ТОТ.
94 ? | . Линейный адрес начала 10Т.
; Содержимое регистра ТОТН в реальном режиме.
144 г_геа] Чи ЗЕЕРА, 0,0
577788
ООООО И Процессоры Не! в защищенном режиме
моу 49$, ах
оу е5, ах
МОУ ах, 3Е1._3261155
Мом ебх, зтаск_1
поу $$, ах
поу езр, еБх
; Разрешить прерывания
$11
; и войти в вечный ‘цикл.
тр эНогт $
И
Обработка прерываний и исключений -
МОУ е$:[е5х+0880001] , а1. ‚ ‘послать символ:на экран.
ад Омога руг зсгееп. ад4г,2 ;` Увеличить. адрес позиции на 2.
ар ЗВогт $КГр_Тгапз1ате
Ь$_рге$зед: ; Иначе: _
моу а1,’°’. -. ‚ ; нарисовать пробел
$6 ебх, 2 °^ р; В позиции предыдущего символа
моу е5: [е6х+0880001 ], а] _
ей зсгееп_ад9г, ебх ; и сохранить адрес’ предыдущего символа
зК1р_Егапз1ате: ‚ | . как текущий.
; Разрешить ‘работу клавиатуры. `
1п а1, 611 |
ог а}, 801
оу 611,а]
; Послать ЕОТ контроллеру прерываний. .
оу 21, 208
О 201,а1
‚ Восстановить регистры и выйти..
. рор 45
рор. ез
рор ебх
рор еах
1гетд
`
МТ 08 -— ошибка #П0Е «Двойная ошибка»
Вызывается, если одновременно произошли два исключения, которые не мо-.
гут быть обслужены последовательно. К ним относятся # ПЕ, #Т5, #МР, #55, #СР
и #РЕ
Обработчик этого исключения получает код ошибки, который всегда равен нулю.
Если при вызове обработчика #0Е происходит еще одно исключение, процес-
сор отключается и может быть выведен из этого состояния только сигналом ММ!
или перезагрузкой.
ПМТ 098 — арезервировано
Эта ошибка вызывалась сопроцессором 80387, если происходило исключение
#РЕ или #СР при передаче операнда команды ЕРО.
ТМТ.ОАВ - ошибка #Т$ «Ошибочный Т$$».
Вызывается при попытке переключения на задачу с ошибочным Т$$.
Обработчик этого исключения должен вызываться через шлюз задачи.
Обработчих этого исключения получает код ошибки.
Бит ЕХТ кода ошибки установлен, если переключение пыталось выполнить ап-
паратное прерывание, использующее шлюз задачи. Индекс ошибки равен селектору
Т5$, если Т$5 меньше 671 байт, селектору ГОТ; если ГОТ отсутствует или оши-
бочен, селектору сегмента стека, кода или данных, если ими нельзя пользоваться
(из-за нарушений защиты иди ошибок в селекторе).
ПМТ ОВЬ-— ошибка #МР «Сегмент недоступен»
Вызывается при попытке загрузить в регистр С$, 0$, Е, Е$ или с5 селектор
сегмента, в дескрипторе которого сброшен бит присутствия сегмента (загрузка
в 95 вызывает исключение #55), а также при понытке использовать шлюз, поме-
ченный как отсутствующий, или при загрузке таблицы локальных дескрипторов
командой Т.Л.ЮТ (загрузка при переключении задач приводит к исключению #Т5).
/
ШЕИ! Процессоры те! в защищенном режиме
Если операционная система реализует виртуальную память_на уровне сегмен-
тов, обработчик этого исключения может загрузить отсутствующий сегмент в па-
мять, установить бит присутствия и вернуть управление.
Обработчик этого исключения получает код ошибки.
Бит ЕХТ кода ошибки устанавливается, если причина ошибки - внешнее преры-
вание, бит ОТ устанавливается, если причина ошибки — шлюз из ШТ, помеченный
как отсутствующий. Индекс ошибки равен селектору отсутствующего сегмента.
ГМТ ОСЬ — ошибка #55 «Ошибка стека»
Это исключение вызывается при попытке выхода за пределы сегмента стека.
во время выполнения любой команды, работающей со стеком, — как явно (РОР,
РОЗН, ЕМТЕК, ГЕАУЕ), так и неявно (МОУ АХ, [ВР + 6]), а также при попытке
загрузить в регистр $5 селектор сегмента, помеченного как отсутствующий (не
только во время выполнения команд МОУ, РОР и 155, но и во время переключе-
ния задач, вызова и возврата из процедуры на другом уровне привилегий).
Обработчик этого исключения получает код ошибки.
Код ошибки равен селектору сегмента, вызвавшего ошибку, если она произош-
ла’из-за отсутствия сегмента или при переполнении нового стека в межуровне-
вой команде САМ. Во всех остальных случаях код ошибки- ноль. `
Компиляция:
ТАЗМ:
Тазт /т рт3З.азт
1]31К Их /З риЗ. 06]
О МАЗИ:
м1 /с. рм3. азт
Лик ртЗ.05),,МА,,,
МАЗМ: а
мазт ртЗ.азт
' мИпк Ре рт3З.05) Рогт 600$
.386р
АМ_зе9 зедтепф рага руб11с “С00Е” изе16
аззите сз:ЯМ_5е9, 9 :РМ_е9, 35: $таск_зе9
таг:
Подготовить сегментные регистры.
_ризв РМ_5е9
рор 98
; Проверить, не находимся пи мы уже в РМ.
моу еах, сго
те$т а1,1
37° ло_\86
; Сообщить и выйти,
по\ 9х,
от Рзеф у86_тз9
егг_ех1т; | ;
разв сз :
рор 9$
мо ап,9
111 21н
пом ав, 4Сн |
17 218
7 Зак. 459
ЕЖЕЗИШИШИ
ИИ И Процессоры ие! в защищённом. режимё , |
; Загрузить 65.
96 66н
96 ОЕАН
98 оРРзет РМ_ептгу ,
Чи ЗЕЁ_3251165 .
АМ_гетигп; |
; Переключиться в реальный режим с отключением. страничной адресации.
том еах, сго
апд еах, 7РЕРРЕЕЕВ
оу сгО, еах
; Сбросить очередь и загрузить 6$.
96 ОЕАВ у
дм $+4
Ч АМ_зе9
; Загрузить остальные регистры.
поу ах, РМ_5е9
тоу 9$, ах.
тоу е$, ах
‚ Разрешить ММГ.
п а1, 70Н
ап@ — а1,07ЕН
ош ТОН,а1
‚ Разрешить другие прерывания.
$11
‚ Подождать нажатия клавиши” 1
ту ап, 1 Е
и 218 —
‚ Переключиться в Текстовый режим
поу ах, 3 | о 3
пт 108 | - }
‚ и завершить программу. ь
моу ап, дсп
пе 218
АМ_зед епд$ ``». `
Отекущая задача выполняет дальний ]МР или САМ. на шлюз задачи или пря-
мо на Т$5;
О текущая задача выполняет 1ВЕТ, если флаг МТ равен 1;
О происходит прерывание или исключение, в качестве обработчика которо-
гов ОТ записан шлюз задачи.
рт4. аз
Пример программы, _ выполняющей переключение задач.
Запускает две задачи, передающие управление друг другу 80 раз, задачи выводят
на экран символы АЗСТТ с “небольшой задержкой:
Компиляция : `
ТАЗМ:
Тазт /т рм4.азт
пк Их /3 ри4.06]
МАЗМ:
, мазт рт4.азт
, м11пК 111е рт4.06} Гогт.00$
неее
Процессоры \{е! в защищенном режиме
м] /с ри4. аз
Ик ри4.063,,МИЕ,,,
. 386р
АМ_зед зедтеп{ф рага риб11с “СО0Е” изе16
аззите с5:ВМ_зе9,
45:РМ_3е0, 53: зтаскК_5е0
АМ_гетиги: |
; Переключиться в реальный режим ВМ:
моу еах, сго
{| Процессоры ие! в защищенном режиме
апа а1, ОРЕН р
мо\у сг0, еах
; бросить очередь предвыборки и загрузить 0$.
96 ОЕАВ
9м $+4 *
дм ВМ_зе9
; Настроить сегментные регистры для ‘реального режима.
ей ах, РМ_зе9
оу 9$,ах
тоу ез, ах
поу ах, зтаск_5е9
оу Ьх, зтаск_1 у
тоу . 8$, ах
ту эр,Бх
; Разрешить ММТ.
11 а], 70Н
апд а1, О7ЕН
ош 708, а1
; Разрешить прерывания.
$11 у
; ‘Завершить программу.
оу ав, 4СВ
11% 218
АМ_зе9 епд$
пе ть МЫ Ро
уе жи
об оба
ул боч
и. авпра ров ани й"ранили ый
ЗАДаЧ),
и р
119
Кроме Того, префикс замены сегмента будет включен автоматически, если ис-
пользуется оператор : в контексте операнда:
11.1.3. Адресация
Регистровый операнд всегда начинается с символа %:
Слова:
„мЮГа выражение... или .Пмога выражение... или. ЗПОгт выражение...
Двойные слова:
.1п{ выражение... или .10п9 выражение...
Строки байтов:
.а$с11 строка...
Неинициализированные переменные:
„1сопм символ, длина, выравнивание // Зарезервировать указанное число байтов
// для локального символа в секции .0$$.
.91061 символ или .9106а1 символ // Делает символ видимым для компоновщика,
// а значит, и для других модулей
// программы.
„дата подсекция
Разрешить листинг:
. 1181
Конец страницы:
.е]есе
Директивы ассемблера | БЕЙ
Размер странины (60 строк, 200 столбцов по умолчанию):
„рз17е строки, столбцы
Заголовок листинга
.{1е текст
Подзаголовок:
‚55111 текст
делен символ:
.1Г выражение
.1Рает символ
„1ЕидеЁ символ или .1РпофдеР символ
.е1зе
‚ еп
11.3.9. Макроопределения
Начало макроопределения:
‚.масго имя, аргументы
Конец макроопределения:
. епдт
. дата
теззаде: , О | в >
сэтг1п9 “Не\1о” мог19\0"" В 7 а
Пользуясь этой техникой, можно создавать программы точно так же, как и на С-
но выигрыш за счет того, что на ассемблере допускается соптимизировать програм-
му на несколько процентов лучше, чем это сделает компилятор с С (при максималь
ной оптимизации), окажется небольшим по сравнению с потерей переносимости.
Кроме того, при написании любой сколько-нибудь значительной программы це-
ликом на ассемблере мы столкнемся с тем, что, как и в случае с * 1132, нам при-
дется создавать собственные включаемые файлы с определениями констант
и структур, взятых из включаемых файлов для С. А поскольку эти ассемблеры не
умеют работать со структурами данных, необходимо описывать их средствами нс-
пользуемого препроцессора - срр или 14.
Лучшее применение ассемблера для МХ (кроме собственно разработки ядра
системы) все-таки остается за незначительными процедурами, требующими боль-
шой вычислительной мощности, — кодированием, архивированием, преобразова-
ниями типа Фурье, которые не очень сложны и при необходимости могут быть
легко переписаны заново на ассемблере для другого процессора или на С.
и, :
// Не1106$4.3 110.
“Не110 мог19” на, ЕгееВ$0 без использования
// Программа, выводящая сообщение
//
// Компиляция:
// аз -0 е1106$4.0 ле110539.$
// 19 -8 -о пе110639 ве110634.0
// —.
542 111 Ассемблер в среде ИМХ
‚Техе
.91051 _$Тат
_зтагт:
// Системная функция 4 “мгМе”.
// В ЕгееВЗО номер вызова помещают в %еах, а параметры - в стек
// справа налево плюс одно двойное слово.
ризв1 $теззаде_1
// Параметр 4 - длина буфера.
ризй1 $тез5аде
// Параметр 3 - адрес буфера.
ризй1 $1
// Параметр 2 - идентификатор устройства.
мом1 $4, Хеах
// Параметр 1 - номер функции в еах.
ру$И1 Феах
// В стек надо двойное слово, но мы поместим номер вызова.
поместить любое
// для совместимости с 30}аг1з и другими строгими операционными системами.
// 1са11 $7,$0 - ассемблер для ЕгееВ50 не поддерживает эту команду. .
„Буте 0х9а
. 1019 0
.могГа 7
// Восстановить стек.
а391 $16, %езр
Для всех пунктов этого файла можно написать сценарий с целью автоматичес-
кого конфигурирования, аналогичный СМО ацбосопйеиге, при использовании ко-
торого модификация вручную будет не нужна. Этот сценарий, а также другие про-
стые программы на ассемблере для ОМХ доступны в Ицегпей по адресу: Бер://
уми поп мше. оге/-саБЫ/зегоиз/азпих. ВЕТ.
Теперь, когда все возможные различия между версиями системы предусмотрены,
перейдем непосредственно к программе. Упрощая задачу, не станем обрабатывать со-
общения об ошибках, но код возврата в случае ошибки всегда будет ненулевым.
// Включение файла соп{19.1.
„пс иае “сопЁ19. 1”
// Начало программы.
.01061 _зфаге
_8Тагт:
.1Е РМО_роз1х
// Переносимая (и сложная) стратегия для. рма.
18 Зак. 459
546 | || ||П Ассемблер в среде УМХ
// Она заполняется справа налево - от текущего каталога к ‚корневому.
тоу] $рт_Би{Рег+1024-1,%ебр
// Искомый путь инициализируется символом перевода строки.
то\1 $0хОА, (%ебр)
// В %е$1 будет храниться указатель на путь вида “../../../”,
оу] Фир_Би Рег, %е$1
// инициализированный как ".\0”.
поуи $0х002Е, ир_Би{ Рег
// Выполнить этат(“/”), чтобы определить 1поде и Чем для корневого каталога
// (по ним мы позже установим, когда он `будет достигнут).
„ТЕ ЗУЗСАНЕ
ип х
ризН1 $5Е_зтат
ризй1 $гоот_рати
том] $5У5$САЦС_5ТАТ,
Жеах
ризВ1 Феах
.буте Ох9А
.1019 -0
. мОГа 7
а991 $12, Жезр
. епо1Е
.1Е ЗУЗСАЦ
11пих
оу] $э1_зтат, Жесх
по\1 $гоот_ратн, %ебх
тпо\1 $ЗУ5САН. _5ТАТ, %еах
11 $0х80
‚ епа1Е
{е$11 феах, %еах
)п2 еггог_ех1т
// Сохранить 4еу и 1по4е корневого каталога.
оу] 5{_31а1+5Т_ОЕ\, %еах
тоу1 феах, гоо{_дем
оу] 5{_з{а1+5Т_1М№0,Жеах
по\1 феах, гоо*_1по
// Главный цикл - перемещение по каталогам,
та1п_роз1х_сус1е:
// Вызвать 13та{() для текущего каталога типа “../../../",
// чтобы определить его 1поде и Чем. .
.1Р ЗУЗСАН: _ип1х |
ризй1 $5т_зтаф
ризй1 фир_БиР Рег
оу] $ЗУ5САЬЕ
1 5$ТАТ, Жеах
ризй1 феах
.„Бухе Ох9А
. 1919 0
.МОГа 7
2491 $12, Жезр
. еп91Е
Переносимая программа для ИМХ ПР 1547
‚1 ЗУЗСАНЕ_11пих
по\у1 $51_з{ат, Жесх
поУ1 $ир_виГ Рег, Жебх
оу] $5У5САЕЕ_ЕЗТАТ, %еах
111 $0х80
. епдтЕ
{е311 феах, %еах
72 еггог_ех1т
// Сохранить 1поде и деу каталога, который сейчас будет сканироваться.
то\1 3{_$Та{+5Т_ВЕМ, Феах
оу] Феах, де\
101 3Е_этат+5Т_Т№,Жерх
оу] ферх, 1по
// Проверить, не совпадает ли этот каталог с корневым.
стр] феах, гоот_аеу
пе ро$1х_пот_11п13Пед
стр] Чебх, гоот_1по
]пе ро$1х_пот_11п15йед
// Если совпадает - вписать последний символ “/” на левом конце искомого пути
ес] Февр
моб $0х2Е, (Фебр)
// и вывести его на экран.
тр р9$1х_ мге
// Иначе -
ро$1х_пот_Е1п1зпед:
// добавить “..\0” к ир_БиРРег, чтобы перейти к вышележащему каталогу
ХА ФОХ2ЕРЕ, (%е$1)
1151
%е$1
1151 %е$1
тмоуб $0, (%е$1 )
// Открыть данный каталог только для чтения (0_ВООМУ).
‚1 ЗУЗСАЦ_ип1х
риу$й1 $0
рузВ1 фир_БиРег
по\1 $5У5САЕЕ_ОРЕМ,
%еах
ризН1 феах
„Буте Ох9А
.19п9 0
‚мОГа 7
2931 $12, Жезр
. епт
.1Е ЗУЗСАН: 11пих
то\1 $0, %есх
оу] Фир_БиРРГег, Жерх
поу1 $5У5САН. _ОРЕМ, еах
17 $0х80
‚ епа1 Е
|
// Добавить “/” в создаваемый путь ри (кроме случая, если это был самый первый каталог)
стрь $1, Р1гзе
]е пот 11751
дес] Фебр
тоуб $0Ох2Е, (%ебр)
пот _Е1гэт:
тоуЬ $0, Е1гз+
// Сдвинуть указатель в %ебр на пат1]еп байтов влево.
хог] Фчедх, %едх
.1Е ЗУЗСАЦ: _ВЕАБОТВ
поУм ОТВЕМТ_ГЕМ(%ебх),%9х
‚ е]зе
ризН1 %е$1
хог1 фесх, #есх
е ФеБх, %ез1
а991 $ОТВЕМТ_МАМЕ, %е$1
зееК_тего: .
1151 фесх
момь (%е31 , %есх, 1), ®а1
тезть фа1 ,%а1
12 зееК_2его
ед Фесх, Фейх
рор1 %е51
. епд1ТР
8461 Федх, Жебр
// Скопировать имя найденного каталога в рма, не сдвигая указатель.
хог1 Фесх, Фесх
ри$й1 %е51
ру$В1 фед1
то\1 фебр, %е41
101 феБх, %е$1
а94] ФОТВЕМТ_ МАМЕ, %е$1
.1Е ЗУ5САН: _ВЕАБОТН
оУм ОТВЕМТ_ГЕМ(%еБх)
,%сх
‚ е]зе
по\1 феах, %есх
„епа1Р
| гер
552 РТВ Ассемблер в среде МХ
ПОУ$Ь
рор1 %е61
рор1 %е31
// Закрыть открытый каталог
.1Р ЗУЗСАЦЕип х
ри$Н1 %е01
то\1 $ЗУЗСАН: _С109Е, Жеах
ри$й1 чеах
.буте Ох9А
. 10пд 0
‚ МОГа 7
а99] $8, Жезр
‚ епа1Е
‚1Е ЗУ5САНЕ_11пих
оу] феа1 , Фебх
оу] $ЗУЗСАЕЕ_С10$Е, Жеах
11 $0х80
‚ епа1Р
// Продолжить главный цикл, пока не будет достигнут корневой каталог.
пр ма1п_роз1х_сус1е
поРоипа:
тр еггог_ех1*
ро$1х_мг1Те:
// Вывести на экран найденный путь.
по\у1 $рт_Би{РРег+1024,
%едх
$461 Фебр, %едх
по\1 Фебр, Фесх
хог] фебх, Жерх
111 Фебх
.1Е ЗУЗСАЦ уп1х
ризН1 %едх
ри$П1 фесх
ри$зй1 Фебх
ПО\У1 $ЗУ$САЕС_ИНТТЕ,
%еах
ризй1 чеах
„Бусе Ох9А
. 1019 0
‚ МОГа 7
а991 $16, Жезр
. епа1Е
.1Е ЗУЗСАНЕ_11пих
МОУ] $ЗУЗСАЕЕ_ИВТТЕ,
%еах
Ти $0х80
‚ епатЕ
‚ еп1Р
// Конец стратегии РИО_розах.
// Область данных.
. дата
.1Р РМО_ро$1х
// Текущий каталог для зтат()
риа_ратн:
.а3с11 “.\000”
// Корневой каталог для зтат().
гоот_ратв:
.а3с11 "/\000”
// Флаг, нужный для того, чтобы не ставить “/” перед первым элементом пути.
Е1гэт:
‚.буте 1
. епд1
. 63$
// Буфер для зтат()
‚1 РМ№О_роз1х
.1сотт 3{_зТат, $17Е_5ТАТ
‚ впа1т
Переносимая программа для ЧМХ "В Ал ал-4
„17 РМО_роз1х‘
// Буфер для вывода риа.
„]1совт ру_Би{Рег, 1024
// Буфер для сканируемого каталога (../../..И../)
.1сотт ир_биуРЕег, 1024
. епт Е
// Различные переменные.
.1Р РМО_роз1х
.]1сотм гооф_4ем,4
.]сотм 9е\,4
„]сотт гоот_1п0,4
„]сомт 110,4
.]сопм орт,4
// Буфер для записи из каталога (91геп®).
.]сотт Ч1гепт, эТ7Е_ОТНЕМТ
.1Е ЗУЗСАЦ СЕТОЕМТ$ | ЗУ$ЗСАН-_бЕТОТВЕМТАТЕ$
.]1сотт 91гепх_1111е9,4
. епт
. епатЕ
Заключение
Итак, прочитав эту книгу, вы познакомились с программированием на языке ас-
семблера во всей широте его проявлений- от создания простых программ и про-
цедур, вызываемых из приложений на других языках, до драйверов устройств
и операционных систем. Теперь должно быть очевидно, что ассемблер не только
не сдает свои позиции, но и не может их сдать - он неотъемлемо связан с компь-
ютером, и всюду, как только мы опускаемся с уровня абстракций языков высоко-
го уровня, рано или поздно встречаемся с ним. В то же время и абстракции,
и сложные управляющие структуры, и структуры данных реализуются на языке
ассемблера наиболее эффективно - не зря же Дональд Кнут, автор знаменитой
книги «Искусство программирования», использовал для иллюстрации перечис-
ленных структур и алгоритмов только ассемблер.
Ассемблер настолько многогранен, что нет никакой возможности описать в од-
ной книге все области программирования, в которых он может быть использован.
Методы защиты от копирования и противодействия отладчикам, строение :раз-
личных файловых систем, программирование на уровне портов ввода-вывода та-
ких устройств, как ШЕ- или $С$[-диски, и многое другое осталось в стороне,
и это‘иравильно, потому что мир ассемблера не заканчивается вместе с этой кни-
гой, а только начинается.
Я 8 ПИ О О О О О ООО
02345
6738 ЭАВСЮЕЕ
ера а Г Ге [а 8 [Ги [* |
ЕЕ а кана ЕЯ
7 перер
Рис. 18. Таблица символов АЗСИ
560 | | 11111 Приложение 1
2. Управляющие символы А$СН
Назначение
Пусто (конец строки)
ЗОН ^А Начало заголовка
зТХ ^В Начало текста
^С Конец текста
Конец передачи
Подтверждение
ВЕС ^ Звонок
| в$ ^Н Шаг назад
ю||о
хочю
.|Горизонтальная табуляция
ОА ЕЕ ^ | Перевод строки
ов Гут т ^К | Вертикальная табуляция
0С РЕ | ЩЕ _| Перевод страницы
00 СВ Возврат каретки
^М | Выдвинуть
- ^о _| Сдвинуть
10 ОЕ 1 ^Р | Оставить канал данных
11 Гос /ХОМ ^а | Управление устройством-1
т
Управление устройством-2
| Управление устройством-3
Управление устройством-4
Отрицательное подтверждение
$\УМ ^\ Синхронизация
17 ЕТВ м Конец блока передачи
18 САМ | Хх | Отмена
19 ЕМ | ^у Конец носителя
Замена
“[ Езсаре
Г: —
Разделитель файлов
Разделитель групп
Разделитель записей
1Е и8 ^
т. _
Разделитель полей
Пробел
Удаление
Таблицы символов 551
3. Кодировки второй половины А$СП
Кодировка по умолчанию для первых компьютеров - этот набор символов хра-
` нится в постоянной памяти и используется ВТОЗ `(см. рис. 19)
0 2 АВС Р ЕЕ
Е Е
ВЕ РР ГЕ ТОЬЫ‹ ЫКГУр
ее авары В рэ
“Рис. 23. Кодировка ср1251
564| ТГ 11 Приложение 1
Ген кн он Емег
Кия ея к
т! О
И
025 |Сы Т зо м 38 |оеа 5ЗВ
2@ 03» |А ТЕК |5Р З9в | эузВа 54В
3# 048 $ ТЕРЬ Сарз$ ЗАН Масго 56н
4$ 05 |0 208 |Е1 — ЗВВ |Е11 57Н
5% ов |Е 218 |Р2 зсн |212 58В
6^ отт |6 228 |3 30н |РА1 БАН
78 ов |Н 238 |4 ЗЕВ |ЕАЗАМИИ 5ВН
8* 09 |у 245 | Е5 ЗЕН |Е14/АМИА
9( бАН |К 251 |6 - 401 | Е15/Мепи 50Н
о) овв |1 261 (Е? т мн |216 6зв
-_ осн |;: 271 |Е8 428 |217 Г 64н
-+ Г 00» |." 288 | Е9 Г 438 |218 658
В5 ОЕН |`- 291 |210 448 |219 66н
Таь О АВ [Мот 45н |220 67н
| 10 |\| 2Вн | ото! 46 | Е21 68
М 118 |2 26н |Ноте 47н [222 ии 69п
Е 125 |Х 20 |. 48 — Е23 6АВ
В 1
1 [С ЗЕн | Роцр дон - |Е24 вн
т 141 у 2ЕВ К- ДАП ЕгазеЕОЕ бов
у 155 |В зов || 4вн |Сору/мау 6ЕВ
т _| ен Е 31п | К5 4Снп | Сгзе! 72Н
| 17 |М 321 |©® 408 | Рена т
[ 18 |< 331 |К+ 4ЕВ | ЕхЗе! тв
Р Сеаг
[
] АЭН
|
код _
Ошибка‘самотестирования
ев АВЕ
Ошибка клавиатуры
Приложение 2. Команды ние! 80х86 |
В этом приложении приведены скорости выполнения всех команд процессоров
Гие] от 8086 до Репёит П и машинные коды, которые им соответствуют.
для В - ЕЗР
101 - для [- ЕВР
для В - ЕВР только если МОП= 01 или 10; если„мор - 00 — базынет
110- ЕЗ
111 - ЕО
Поля Моав/М и $1В будут записываться как /т, если поле В/О содержит код
регистра, или /0 — /7, если поле К/О содержит дополнительные три бита кода
команды. В других случаях поля МоаК/М и $1В отсутствуют только у команд без
операндов, поэтому они не будут обозначаться дополнительно.
3. Префиксы
Все префиксы выполняются за 1 такт и имеют размер 1 байт:
ОЕ0Ь: ТОСК
ОЕ25: ВЕРМЕ/ВЕРМ,
ОЕЗЬ: ВЕР/ВЕРЕ/ВЕР7
2ЕВ: С$;:
361: $5:
ЗЕЪ: 0$:
265: ЕЗ:
64в: Е$:
65Ъ: С5:
661: 0$
67,: А$
5721 ОР Приложение 2
Команда Код
ААА 37
ААП 18 05 № 60
ААМ 18 045 7 83
ААЗ ЗЕ 8
АОС асит 14 т 4
АОС гут 80$“ /2 т 4
АОС тит 80$м /21т 23+еа
АБС г,г 104 /г 3
АОС туг 10а\м /г 24+еа
АБС ет 104 г | 13+еа
АОБ асит Од т 4
АБО гит 805м /0 ит. 4
АБО пут 80$ /0 т 23+еа
АБО гг 09мм /г 3
АБО т,г Оба\м /г 24+еа
АБО гп О009\ /г 13+еа
АМО аст 24 ип 4
АМОгт 805м /4 т
АМО т, 805\ /4 т
АМО г,г 20а\ /г
АМО тг
АМО гт 209 /г
АВРЕ г,г 63 /г
АВРЕ тг _
| —бЗ/
ВОЧМО г.п 62 /г
ВЗЕ г16,г16 ОЕ ВС /г
ВЗЕ г32,г32 ОЕ ВС /г
ВЕ г16,т16 | ОРВС/г
ВЗЕ г32,т32 | ОЕВС/г
ВЗВ г16,`16 | ОЕВО/г
ВЗВ г32,г32 | ОРВО/
ВЗВ г16,т16 | ОЕ ВО /г
ВВ г32,т32 | ОЕ ВО /г
ВУ\МАР г32 ОЕ С8г
ВТ гг ОР АЗ /г
ВТт,г ОР АЗ /г
ВТг,8 ОЕ ВА /4 5
ВТ т,‚8 ОЕ ВА /4 5
ВТС г,г | ОР ВВ /г
ВТС т,г ОЕ ВВ №
|ВТС г/8 ОЕ ВА /7Ь
Команды И\е! 80х86 1:| 1573]
ме" | РВ | 9 38 20
САЕтСб | Е/З “ 44 56 35 22 С
САЦ т Сб/п| ЕР /3 3 90 69 44№ | С
САЦ. т Т$ ЕЕ /З | 1$
Т | 37+1$ | 2475 № | С
СААтТЬ | РЗ | тв |37тв 22+Т$ № | С
СВУ 198 2 2 3 Е 3 МР т
с5а 99 2 З 2 МР Чт
сс ЕВ 2 2 2 2 2 2 МР 1
[1] ЕС 2 2 2 2 2 2МР | 4т
си | ЕА 2 2 Е Е 5 7 МР [с
СЕт$ ОЕ 06 2 5 7 10М [С
СМС 5 | 2 2 2 2| 2 | 2 МР 1
СМО\Усс гг ОЕ 4сс /г 2т
СМО\сс г.п | ОЕ 4сс /г Зт
СМР ас т ЗС\ т 4 4 Е] 2] 1 1 ОУ Чт
СМР гит 805 /7 ит 4 4 3 2 1 1 У 1т
СМР пит |805м /7т[__ 14+еа| 10 [6 |6 2 2 [|2
57 ГВ ‚ Приложение 2
Таблица 27. Команды (продолжение)
РЕВЗТР т80 ОР /6
80286 | 80386
ВОТ |90186 |вот |возёт 60486 в
148..154 МР]
_С |
[24.25 [6 1х
Зт
|
ГЕСмоУЕ зо вс [|
ЕСМОУВЕ
[2]о х.
РУМО\МО 50,51 ОА О8г
ЕСМОУМВ
ОВ С0г
Ф о ч.
ЕСМОУМЕ
ОВ С8г
50,51
вв
ЕСМОУМВЕ
м
О О О ПО О НЕ
ГЕсомтз2 | ве | вотонеа | [во | 26 | 4 | аи |2]
ГЕСОМтб4 | 06/2 [65.75% | [6575] м | 4 | 4” |2т|
сом | 0800г | 40.50 | [40.50 а [аи
ое ов оное а Е
ГЕСОМР ба | 5С/3 [65.75% | [65.26 [ м | 4 | 4х
ГЕсомРя | 9808г | 42.52 | [4252 | 26 | 4 [чм [т
Гесомев [Е | 45.55 | [45.5 | 6 |5 | ам [т]
ПЕС Е ОЕ С ООО ООО ООО ООО ООО ООО СС
ПС О ООО ООО ООО ООО ООО ООО ТС
0 [9 || | [188.72[257.384 18.14 МР] ©.
Геос | 59 | 69 | [ее | № [т
[ЕО тз2_ | 08/6 [215.225%8| _ [215.25] № | 18 | 398 |2т|
[РОМ 64 | 06/6 |220..230+еа | [220.230] 94 | 73 | 399 |2
ГЕОз0 | О8РОг | 193.208 | [198.208] 88-91 | 23 | 39 [1]
[ЕСМ 5.50 | ОСИ8г | 193.203 | [193.203] 88-9 | 79 | 3975 [1]
ГЕБМР 3.50 | ОЕРВГ | 197.207 | [197.207 9 | 29 | 399 [т]
[ЕО т32 | 08/7’ |216.226 | [216.226] в | 23 | 39 |2)
сл [221.291 [224.2] 9 | 239 | 39 [2
ов | 194.204 | [194.204 8851 | 29 | 397 [шт]
остог | 194.204 | [194.204] 88.91 | 29 | з9х [|
ГЕОМЯР 9.50| БЕРГ | 198.208 | [198.208] 9 | 28 | з9х [т]
[м |
| О ОО
ГЕРАЕЕЯ | [3 | [|
576 | 11| Приложение 2
Таблица 27. Команды (продолжение)
80386
Команда Код 8087 80387 80486 Р5 рб
ОУ т32 Ебми /7 46 44 46 МР 4т
МАЕ г8 Рб\ /5 80..98 9..14 13..18 11 М 1т
МУЕ г16 би /5 128..154 9..22 13..26 11 МР Зт
МОЕ г32 Рбм /5 9..38 13..42 10 МР Зт
МОЕ т8 Еём /5 86..104+еа 12..17 | 13..18 | 11 МР 2т
МУ т16 |Е6\ /5 134..160+еа 12.25 | 13.26: ИМ 4т
МУ: г32 Рем /5 12.41 | 13.42| 10 МР 4т
МУ г.г,8 бВль 9..14 13..18 10 МР ‚т
+
МУ
г16,г16,116
69 /гт 9..22 13..26 10 МР ‚ тт
——ф-
МОЕ
69 /гит 9..38 13..42 10 МР тм
г32,г32132 —
ТМ г,г18 бвВлЬ 12..17 | 13..18 10 МР 2т
МУ | 69 /гит 12..25 | 13..26 10 МР
г16, т16,116 |
ИМИЕ _ .
69 /гит 12..41 | 13..42 10 МР
г32,т32132
МОЕ г16,
г16
ОЕ АЕ /Г 9..22 13..18 10 МР
МАЕ г32,г32 ОР АР /г 9..38 1 13..42 10 МР
——
МОЕ г16,
ОР АЕ /г 12..25 13..18 10 МР
т16 (
1МУЬ гЗ2,
т32
ОЕ АЕ /г 12..41 13..42 10 МР
№ ас/8
(АМ)
т Е4м | 14 12 14 1 МР
И№ асл8
(СРЕЗЮРЬ) Е4\м 4 МР
1№ аси8
Е4\м 6 21 МР
(СРЕ>ЮРИЕ)
1№ ас/!8
Е4м 6 19 МР
(\86)
№ ас,0Х
ЕС\ 7 №
(АМ)
1№ ас,оХ
ЕС\ 4 МР
(СРЕЗЮРИ}
1№ ас.оХ
ЕС\
(СРЕ>ЮОРЬ)
№ ас,0Х
ЕС\
(\86)
МСт РЕМ /0
1МС г16/32
мт -
1№5* (АМ)
580 | |1 ТПП Приложение 2
Таблица 27. Команды (продолжение)
Команда
| Р5
|
\5*
СРЕЗЮРИ) 6С\м | 9 10 6№ с
1№5* = и
(СРЫЮРЫ | 6С\ | 29 32 24 МР
1\5* (\86) 6С\ 22 | 30 | 22№
ИМТ 8 (АМ) | С0ь 71 47 23 37 30 16 МР
МТ 18 (РМ) Со 40 59 | 44 | 31 С
МТ 18 (РМ/п)| СО 78 99 71 48 МР С
мт 8 (86) | Соь 78 119 82 60 МР С
ИМТ 18 (Тб) соь | 167 | 15 [| 3741$ | 23475 № | С
1МТЗ (АМ) сс 72 45 23 33 | 26 16 МР С
ИТЗ (РМ) сс 40 59 | 44 30 МР [5
МТЗ (РМ/п) | СС | 78 99 71 47 МР С
МТЗ (У86) сс 78 119 82 59 МР |
ИМТЗ (Тб) [976 167 | 15 | 37415 | 22415 № [С
МТО (ОЕ=0) | СЕ 4 4 Е Е Е 4 МР С
МТО (ВМ) СЕ | 73 48 24 35 28 13 МР С
МТО (РМ) | СЕ | 59 | 46 |й 30 МР С
МТО (РМИп) СЕ 99 73 47 МР С
1МТО (№86) СЕ 118 84 59 МР С
МТО (Тб) СЕ 17$ | 29-15 | 22415 МР | С
1\УО ОЕ 08 | 4 15 МР | ©
ММЕРС пп ОЕ 01 /7 | 12 25 МР С
1ВЕТИВЕТО
(ВМ) СЕ 44 28 17 22 15 7№ с
'ВЕТЛВЕТО
(РМ) СЕ 31 | 38 15 10..19 МР | С
1ВЕТЛВЕТО
РМ СЕ | 55 82 36 27 М с
ВЕТЛВЕТО
М/Т) СЕ 169 1$ | 32+1$ | 10+т$ | С
сс 18 70сь. т тт
(не вып.) 4 4 3 3 1 1 РУ
сс 18 (вып.) | 70с№ 16 13 7 7 Е 1 РУ
ес ит ] и |
не вып.) ОЕ 80с № 3 1 1 РУ
сс ит (вып.) | ОЕ 80с № | 3 |1 1 РУ
3СХ218
не вып.) ЕЗЬ | 6 5 4 5 | 5 5М
3СХР 18 (вып.)| ЕЗЬ 8 | 16 8 9 8 6 МР
МР пеаг 8 | ЕВЮ 5 |3 [|7 7 Е 1 РУ
УМР пеаг
6/32 Е9 . 15 | 7 7 3 | ПР
Команды Не! 80х86 1]
| | |581
Таблица 27. Команды (продолжение)
МР пеагг ЕЕ /4 11 11 т |2 2т
УМР пеаг т ЕЕ /4 18+еа 17 11 10 - 5 | 2 МР 2т
|
АМ)
УМР Тагт .
ЕА т 15 13 11 12 17 МР | С
УМР Фаг т
ем“ | ЕА .т 27 19 23 МР с |
а" БАшт | 38 ; 45 32 18 С
УМР таг ип 1 | 175.| | 1$ — | 42+1$ ‚ 1941$ МР
т) аг! ЕА ип
те) тагт ЕА т 180 | 1$ | 4341$ | 20%15 МР |
УМР таг т | 4 МР
АМ) ЕЕ /5 24+еа 26 15 12 13
УМР гт 18 23 МР
РР /5 31
ей @гт
УМР ЕЕ /5 | | 41 49 31 18 МР
Команда Код
1400$8В/
ГОО$М// АС\
100$0
ГООР 18
(не вып.)
Е2Ь
1ООР 18 (вып.) | Е?
|ООРЕ 8
ЕТ Ь
(не вып.) |
1ООРЕ 18 (вып.) ЕЮ
ГООРМЕ В |
(не вып.)
ЕО Ю
1ООРМЕ 18
(вып.)
ЕО Ь
ЗЕ гг ОЕ 03 /г
ЗЕ г.п ОЕ 03 №
Команда Код 3о
МОУ СВЗ,г ОЕ 22 л
МОУ СВА4.г ОЕ 22л
МОУ г.СВх | ОЕ 20
МОУ ОРО-3,г ОЕ 23 /г
МОУ О0В4-5г ОЕ 23 /
МОУ ОНб-7,г ОЕ 23 №
МОУ г‚ОВО-3 ОЕ 21 /
МОУ г.ОН4-5 | 0221 /г
МОУ г.ОНб-7 ОЕ 21 Л ооо
ооо
оо
МОУ ТВб,г ОЕ 26 /6
МОУ ТН7,г ОЕ 26 /7
МОУ ТВЗ,г -
ОЕ 26 /3
МО\ г,ТАб +
ОЕ 24 /6
МО\ г,ТВ7 ОЕ 24/7
МОУ г,ТВЗ ОЕ 24 /3
МОУ
ОР 6Е /г
тит,32
МО\О г32,тт ОЕ 6Е /г
моур
ОР 6Е /г
т32, тит
ее
ОЕ 7Е г
64, тт
моУуа
и, 1164
ОЕ 6Е /г
моУуа
тт, пт
ОЕ *Е/г
МО\5Х гг ОЕ ВЕм /г
МОУ5Х г,т Г
ОЕ ВЕМ /г
МО\7Х гг ОЕ Вбм /Г
МОУ2Х г.п ОЕ Вбм /г
МУ г16 118..133
МЫ. г32
76..83+еа
МИ т16 124..139+еа
МУ т32
Приложение 2
Таблица 27. Команды (продолжение)
8087 80186
80286 | 80386
80287 |80387 80486 | Р5 Рб
Команда Код
РАБОВ ОЕ ЕС /г | и\ Ат
пт,
РАБОВ ‚РУ 2т
тт, 64 ОЕ ЕС /г |
|
и +
РАБО ОЕ ЕО /г :
У 1"
шт”
РАББМ64
т ОЕ ЕО г РИ 2т
РАОООам ОЕ ЕЕ /г ИУ 1
тт,
РАБОБ |
тт, т64 ОЕЕЕ /г | | РУ 2т
- +| |
РАБОЗВ ОЕ ЕС /г | ТУ Чт
шт,
- 1
РАБОЗВ
64 ОЕЕС/г р | РИ 2т
РАБОЗМ ОЕ ЕО | и\ тт
шит | .
РАБОЗ\/ ОЕ ЕБ /г | РИ 2т
64
РАРОИЗВ ЕСИ и\ тт
пп, 707
РАБООЗВ
та ОЕОС Л | РУ 2т
РАБВУЗМ ОРОО /г ЦУ 1т
пт,
РАБОИ$М
тт, 64 ОРОО /
И , РИ 2т
РАМО ОЕ ОВ /г ИУ ат
шит,т
Г
АА по | ООВ РИ 2т
РАМОМ ОЕ ОЕ | У 1т
пит; | _
РАМОМ ОЕ ОЕ /г РИ 2т
тт, 164 |_ ОИ „ —
РСМРЕОВ
пгт ОЕ 74 № Ц\ 1т
РСМРЕЯВ ОЕ 74 /г РИ 2т
РСМ РЕМ | 75 им Ат
таит
5861 ТОРТ Приложение 2
Таблица 27. Команды (продолжение)
та О ОЕ РБ | | _| Рома |2т
РМУЕНМ
тит ОЕ ЕБ /г ИМ МР? | 1т
| _|_ - | |
РМОСНИ
шт, 164 ОЕ ЕБ г. РИ МР? | 2т
| |
РММ
тт Г. ||.
ОЕ 05/1 Г
| | ИМ №2 | 1т
МОИМ
тт ОЕ05 Л - Г
РИ МР? | 2т
РОРГ 1
РОР т 5 6 2М | С
РОР 0$ (АМ) Е 2 8 5 7 |3 МР С
РОР 0$ (РМ) | Е | 20 21 9 3.12 М | С
РОР ЕЗ (АМ) 7 12 8 5 7 3 ЗМ С
РОР Е (РМ) 9 С
З С
РОР 6$ (АМ)
РОР 65 (РМ)
Команды И\е! 80х86 | |587
ИТТ
Таблица 27. Команды (продолжение)
Команда
РОРА/РОРАО
РОРЕ/РОРЕО | ср
(АМ)
РОРЕ/РОРЕБ 96 |
(РМ)
РОВ мт,тт | ОРЕВ /г
ОР ЕВ /г
ОЕРЕ1 М т
ОРЕТ М
|
ОЕ 71 /6 6
ОРЕ2 /г
Р$Н.0
тт, 64 ОЕ Е2
РЗЫО 01,18 | ОЕ 72 /6 Ю |
ОЕ ЕЗ /г
ОЗ ||
РЗЦ.О тт, [Е 73 /6 5
ОЕ.
ОЕЕ1
ОЕ 71 /4 6
ОЕ Е? /г
ОЕ Е? /г |
ОЕ 72 /4 №
1
ОЕ ОТ
ОЕО1 |
ОЕ 71 /2 №
ОЕ 02
БЕТ О ОА И | Приложение 2
Таблица 27. Команды (продолжение)
Команда
РЗВЕО
тв |
ОЕ 72 /2 1 ЦУ МР1 | 2т
РАГа
шт,тт
ОЕ 03 /г ИМ МРТ | 1т
|
| |
ои
РУЛЬ ОЕ 03 /г РИ МРТ | 1т
пт, т64 | |
РУЛЬ
1. т
тт, 18
ОЕ 73 /216 | ИУ МРТ || 2т
РЗУВВ
пт, т7
ОЕ ЕВ /е |
| См 1т
| | |_
РЗИВВ
тт, т64 ОР [8 /г | РИ 2т
РЗИВМ/ - ти
ЕО я я
ти, мт | | р
РЗИВМ/
тт, 64 ОР Е9 /г | РИ 2т
РЗИВО
т ОЕ ЕА /г им т
РЗИВО т 7] т
тип, 164 ОЕ ЕА /г _| РИ 2т
РЗИВ$В РЕВ № т
ПТИ, | | | _| |8
РЗИВЗВ
пт, 1164 ОР Е /г РУ 2т
РЗИВ$\ р ОЕ № и
шт, тт | .]
РЗИВ$М/
пт, п64 ОР Е9 /г | РУ 2т
| | Ч
РЗИВИЗВ 08 | № м
ти, мт | _| | |
РЗИВИ$В Г.
тт, 64 ОЕ 28 /г | | РИ 2т
РЗУВИ$М
пи, ОЕ 09 /г ЦУ 17
РЗИВИЗМ Е 9 | —}
м —т
ри
шт, 064 _| р_
РУМРСКНВМ | Е бз и
- |и - й
И ПИ
шт, тт 1 | [_
РИМРСКНВУ/
пт, тб4 ОР 68 /г РУ МРТ | 2т
РИМРСКНМ/О
т ОЕ 69 /
Команды пе! 80х86 | ПО О И ПИ ЕС
Таблица 27. Команды (продолжение)
80186
80286 [ 80386
80287 | 80387 80486 Р5
Команда Код
РОМРСКНУ О (Е 69 РИ МР1
тит, 64.
РИМРСКЕВУМ
тб ОЕ 60 /г РИ МР1
РУМРСКРЯ | пб У МР1 |
шт,тт
РИМРСКЕОО
т 64 ОЕ 62 /г РИ МР1 | 2т
РИЗНГ 50г 5 | 0 3 2 1 тии | 3т
РИУЗН т ЕЕ /б 24+еа 16 5 5 4 2 МР 4т
РИЗНВ бАЪ Е 2 1 ТМ | Зт
РУЗН 6/32 | 68 т 3 2 1 МР |3
РИЗН С$ ОЕ 14 9 Е 2 3 ТМ 4
РИЗН 0$ ЧЕ 14 9 Е 2 Е МР | 4т
РИЗН ЕЗ 6 14 9 Е 2 Е МР | 4т
РИЗН $5 16 14 9 3 | 2 Е МР |4
РИЗН Е ОЕ АО 2 з ЧМ | 4т
РИЗН 6$ ОЕ АЗ 2 Е ТМ | 4т
РИЗНА/ Г 18 11 5 МР с
РИЗНАО 60 36 17
РИЗНЕ/
р РОЗНЕО (АМ) эс 14 9 3 4 4 9 МР с
РИЗНЕ/
РОЗНЕО (Рм)| С 3 4 3 3 МР с
РХОЯ ОЕ ЕЕ /г У 1т
па, А
РХОВ 64
тт, м ЕЕ /Гг РЦ 2т
ВЕТЕ (АМ)
ВЕТЕ (РМ) | СВ | 25 32 18 | 4.13 МР
ВЕТЕ (РМ/о)| —СВ- Г 55 62 | 33 | 23№
[ВЕИ6 ТЕ
(ЯМ) САМ | 33 25 15 18 14 | 4МР
НЕТ И6(М) САМ | Г 25 | 32 7 4.13№ ||
|
МИ) САМ | | 55 68 | 33 | 23№ [с
ОЕ Оо /0 2 2 |2 Е Е РО |1
23+еа 15 7 7 4 ЗРЫУ
ВОЕ г.СЕ
ы З 3 4 МР
<
28+еа+4п 7 | 4 4 №Р
ВОГ г.в Г | 5+ 3 |2 | 1Р
ВОГ т, | бби/оь | 17+п | 8+1 — 7 4 ЗРО
ОВ г.1 0 /1 2 |2 2 313 ТРИ
НОВ т, | 00%/1 | 23+еа | 74 | ЗР
ОВ ге | 02/1 | 8+4п _| 5+ | 5 [3 [3 [ 4№
АОЯ п,СЕ | 02/1 | 268+еа+4п | 17+п | вп |4 4 МР
ВОВ г Сом [| ПГ 5+ | бп 3 2 |
- | - т ——
ТРИ
ВОН т,‚:8 Сом /ТЬ |. 17+п в+п
т
7 4 ЗРИ
АЗМ
—+
ОРАА |
— —+ — +
83 МР
ЗАНЕ 9Е |3 [2 [2 | 2№
ЗАЕ г. ом /4 2 [2 2 |3 ТРИ
ЗАЕ т, 1 | 20% /4 23+еа | 15 7 7" |4 ЗРО
ЗАЕГСЕ | 02/4 | 8+4 5+1 | 5 Е Е] 4 МР
ЗАЕПьСЕ | 02/4 | 28+еа+4п [7 т 7 4
АС Г.В С0\ /4 15 З 2
Команды 1п*е! 80х86 НО И ПЕ
Таблица 27. Команды (продолжение)
80186
80286
80287 | 80387
Команда Код
80486 Р5 Рб
Команда Код
и |
МиВиМУО ОЕ 09 [_ 5 | 2000+№ | С
М/ВМ5В 030 | Г. [ 30.45 № | С
_| 3 ЗМР 4т
ОЕ СО\м /г
ХАОО п ОЕ Сб\ /г | | 4 4 МР С
хсне ас,г / 90г 3 ТТ з 3 Е 2 |3
1 _
;
ХСН гг
|
86 /г 4 4 | 3 [3 Е ЗМР | Зт
—+
=—
5 5 ЗМ | С
—
хонс И | 86 25+еа |5
ХЬАТ
}
57 11 м | 5
_—
1
5 4 --
АМ и|
2т
1
ХОВ аслт Зам т | 4 4 |3 2 1 ТУ т
1 м 1
1
Команда Код
| км | К |
РЗ ОЕ СГ
ве
СУТР!2Р$ хтт,тт/тб4 ОЕ 2А М
Используемые сокращения
АВГ — АррНсаНоп Втагу Пиегасе Интерфейс для приложений
на низком уровне
АСТ — АЧ@гезз Сепегайоп Пиегоск Задержка для генерации адреса
АМ!$ АЁегпайуе МшШарех Ниеггаре Спецификация альтернативного
Зрессайоп мультиплексорного прерывания
АРГ — АррЁсайоп Ргоягат Ищбегасе Интерфейс между приложением
и программой
АЗСИ Атепсап З&ап4аг4а Со4е Американский стандартный код
юг шбюгтаНоп Пиегсвапее для обмена информацией
АТ&Т Атегсап Т@ерВопе апа Те!евгарВ Американский телефон и телеграф
(компания, которой принадлежала
торговая марка МХ)
ВСР — Вшагу Со4е4 ПОесипа] Двоично-десятичный формат
ВЮЗ Вазс шри/Ошриё Зужет Основная система ввода-вывода
ВГГ —Вшагу ей Двоичная цифра
ВРВ — В1О$ Рагатейег ВюсК Блок параметров ВТО$
(для блочных устройств)
ВЕМ В Кеа Моде Большой реальный режим
(то же, что и нереальный режим)
В$) Вегкаеу бу%ет Пузи1БиНоп Один из основных видов
ОМГХ-систем
В5$$ — Воск, Заке4 Бу ЗутБо! Участок программы, содержащий
неинициализированные данные
СМО5$ Сотр!етешагу Ме Ох!4е Комплементарные
Зеписопаисог металлооксидные пары
СОЕЕ Соттов Одес ЕЦе Еогтай Общий формат объектных файлов
СР. —Сштепё РиуЦерве Г.еуе] Текущий уровень привилегий
СВТ — Сафоде Кау Тие Электронно-лучевая трубка
РАС — Приаю Апаюв Сопуецег Цифро-аналоговый преобразователь
Орк —Онуегз Оеуеортепе КИ Набор для создания драйверов
ОМ. — ПупаписаЙу Сллкеа ГЛЬгагу Динамическая библиотека
ОМА Пес Метогу Ассезз Прямой доступ к памяти
00$ ПК Орегания Зует Дисковая операционная система
ОРГ. —ПОезсиреог РиуЦеве [леуе] Уровень привилегий дескриптора
596]
| | ||| АззетЫег для 00$, МИпдо\и и УМХ
ОРМТ ро$ Ргоеце4 Моде Пиегасе Интерфейс для защищенного режима
в РО$
О$Р Пека! $1па| Ргосеззог Процессор для оцифрованного звука
в звуковых картах
ОТА ПЕ ТгапзЕег Агеа Область передачи дисковых данных
(в 2О5$)
ЕТЕ — ЕхесшаЫе апа Глок Еогта* Формат исполняемых
и компонуемых файлов
ЕМ$ Ехрап4дед Метогу ресйсанол Спецификация доступа
к дополнительной памяти
ЕРВ — Ехесийоп Рвгат Воск Блок информации об исполняемой
программе
ЕАТ Ее АПосайоп Тае Таблица распределения файлов
ЕСК ЕО Сота Керлзег Регистр управления Е1ЕО
НЕО Ех Шш Еи$ Ощ Первый вошел — первый вышел
(очередь)
ЕМ Егедиепсу МодаНоп Частотный синтез
ЕРО — Ноаапя Рош Опи Блок для работы с числами
с плавающей запятой
СОТ —С]оБа Оезсиреог ТаЫе Глобальная таблица дескрипторов
НСГ Нитап Сотрщег Пуегасе Интерфейс между пользователем
и программой
НМА Не Метогу Агеа Верхняя область памяти
(64 Кб после первого мегабайта)
ВМ — шегпайопа] Виярез$ Мас тез Название компании
[С\ — Шиашайоп Сопего| \ога Управляющее слово инициализации
ШЕ — Шшергаед Опуе Вес готис$ Один из интерфейсов для жестких
дисков |
ШТ — Паеггаре Оезсир®ог ТаЫе Таблица дескрипторов обработчиков
прерываний
ТЕК — Пщеггаре ЕпаЫе Веззег Регистр разрешения прерываний
ТОСТЕ. при/Ошриш Сопёго| Управление вводом-выводом
ТОРГ. Тпри/ОибриЕ РиуЦеве Г.еуе! Уровень привилегий ввода-вывода
[ВО ‘мегаре Кедиез Запрос на прерывание
(от внешнего устройства)
[5Р Гиеггире Звания Ргобосо| Протокол разделения прерываний
СВ — Ипе Сопто] Вевязбег Регистр управления линией
ГОТ Гося Резсирог.ТаЫе Таблица локальных дескрипторов
ТЕ Гпеаг ЕхесшаЫе Линейный исполняемый формат
ТЕМ Гопв ЕЦе Мате Длинное имя файла
15В — пе Зфабиз Кезхег Регистр состояния линии
Используемые сокращения 1 ПИ ПО ООИЕСУ
МАЗМ Масго Аззетег Ассемблер компании М1сгозой
МСК Модет Сопго] Вензег Регистр управления модемом
ММХ Мшатеда Ежептзяоп Расширение для работы
с мультимедийными приложениями
М5В Модем Зе Вержег Регистр состояния модема
М$К —МасЬше Зресмйс Веяет Машинно-специфичный регистр
МЕ Ме\м ЕхесшаЫе Новый исполняемый формат
МРХ — Митенса| Ргосеззог Ежепя!юп Расширение для работы с числами
с плавающей запятой
ОСМ\М’ Орегайоп Сопёго] УУог4 Управляющее слово
(для контроллера прерываний)
РЕ РонаЫе ЕхесщаЫе Переносимый исполняемый формат
РОЗТ Ро\жег Оп Зе Тез Самотестирование при включении
РЭР Ргоргат Зевтень Ргейх Префикс программного сегмента
ВВК — Вечеуег ВиНег Везчег. Регистр буфера приемника
ВЕС — Кедаез Рог Соттепт6 Запрос для комментария
(форма публикации документов
в Ницегпеё, включая стандарты)
'ВЕМ Веа Её Моде Реальный Йа(-режим
(то же, что и нереальный режим)
ВТС Ве Типе С]оск Часы реального времени
ВРГ. —Ведиезог РиуЦере Тлеуе] Запрашиваемый уровень привилегий
КРМ — Веуегзе Роз Маайоп Обратная польская запись
(для арифметических выражений)
$С$Т Зта| Сотриег Зузет Пиегасе Один из интерфейсов для жестких
дисков
ЗУМ — Запюг4 Чшуегзиу МебуогК$ Название компании
ЗУСА Зирег УСА Любой видеоадаптер, способный
на режимы, большие 13Ъ
ТАЗМ Тиго АззетЫег Ассемблер компании Во[ап4
ТНЕ Тгапзпийег Но!её Веззег Регистр хранения передатчика
Т$В — Тегимаже ап вау Везет Завершиться и остаться резидентным
Т$$ — ТазК Земе Зертем Сегмент состояния задачи
ОМВ Оррег Метогу ВюсКк Блок верхней памяти
(между границами 640 Кб и 1 Мб)
УВЕ — УЕЗА ВОЗ Ежеряюп Спецификация УЕЗА
для расширения ВОЗ
УСРТ Уишиа! Сопёго! Рговгат Пиегасе Один из интерфейсов к защищенному
режиму для РОЗ
УЕЗА \У1ео Весгогис$ Збап4агА Ассоциация по стандартизации
Аззосайоп видео в электронике
[598 | |1 || А55етЫег для 00$, МИпо\ми$ и ОМХ
УСА — \4ео СгарЫсз Аггау Основной тип видеоадаптеров
Ухр Ушла Х Оеуке Виртуальное устройство Х.
(общее название виртуальных
/
драйверов в УЛп4о\$ 95)
У\МАЗМ Уакот АззетЫег Ассемблер компании У/асот
ХМ$ Ежепае4 Метогу ЗречйсаНоп Спецификация доступа
к расширенной памяти
Глоссарий
А
Активационная запись (асНуаНоп гесог4) — область стека, заполняемая при вы-
зове процедуры.
Ассемблер (аззету |априаве) — язык программирования низкого уровня.
Ассемблер (аззетЫег) — компилятор с языка ассемблера.
Б
Байт (Буе) — тип данных, имеющий размер 8 бит; минимальная адресуемая еди-
ница памяти.
Бит (516) — минимальная единица измерения информации.
д
Двойное слово (доцЫе ога) - тип данных, имеющий размер 32 бита.
Дескриптор (Чезструог) — восьмибайтная структура, хранящаяся в одной из таб-
лиц СОТ, ГОТ или ГОТ и описывающая сегмент или шлюз.
Директива (Фгесиуе) — команда ассемблеру, которая не соответствует командам
`процессора. |
Драйвер (дпуег) - служебная программа, выполняющая функции посредника
между операционной системой и внешним устройством.
З
Задача ((25К) — программа, модуль или другой участок кода программы, который
можно запустить, выполнять, отложить и завершить.
Защищенный режим (ргобесе4 то4е) — режим процессора, в котором действуют
механизмы защиты, сегментная адресация с дескрипторами и селекторами и стра-
ничная адресация.
И
Идентификатор (рапе или еп йег) - число (если вап е) или переменная дру-
гого типа, используемая для идентификации того или иного ресурса.
600] | [||| Аз5етЫег для 20$, \Мтдоми$ и УМХ
Исключение (ехсерйоп) — событие, при котором выполнение программы прекра-
щается и управление передается обработчику исключения.
К
Код (со4е) - исполняемая часть программы (обычная программа состоит из кода,
данных и стека).
Компилятор (сотр!Иег) — программа, преобразующая текст, написанный на по-
нятном человеку языке программирования, в исполняемый файл.
Конвейер (р!ре) — последовательность блоков процессора, которая задействует-
ся при выполнении команды.
Конвенция (сопуепНоп) — договоренность о передаче параметров между проце-
дурами.
Конечный автомат (НпКе збабе тасЬше) — программа, которая может переклю-
чаться между различными состояниями и выполнять в разных состояниях раз-
ные действия.
Кэш (сасКе) — быстрая память, использующаяся для буферизации обращений к ос-
НОвНоЙ Памяти.
л
Лимит (|11110)— поле дескриптора (равно размеру сегмента минус 1).
Линейный адрес (Ппеаг а4гез$) — адрес, получаемый сложением смещения
и базы сегмента.
Ловушка (тар) — исключение, происходящее после вызвавшей его команды.
м
Метка (1аЪе]) — идентификатор, связанный с адресом в программе.
Н
Нить ((геа4) — процесс, данные и код которого совпадают с данными и кодом
других процессов.
Нереальный режим (ипгеа] то4е) — реальный режим с границами сегментов по 4 Гб.
о
Операнд (орегап4) — параметр, передаваемый команде процессора.
Описатель носителя (теа дезстрбог) — байт, используемый ОО для иденти-
фикации типа носителя (обычно не используется).
Останов (аБоге) —- исключение, происходящее асинхронно.
Отложенное вычисление (]а7у еуащайоп) — вычисление, которое выполняется,
только если реально требуется его результат.
Очередь предвыборки (рге{есВ диеце) — буфер, из которого команды передают-
ся на расшифровку и выполнение. |
Ошибка (116) — исключение, происходящее перед вызвавшей его командой.
Глоссарий = 1601
п
Пиксел (р:хе]) - минимальный элемент растрового изображения.
Повторная входимость (геепёгапсу) — возможность запуска процедуры из обра-
ботчика прерывания, прервавщего выполнение этой же процедуры.
Подчиненный сегмент (сопюгшше зевтепе) — сегмент, на который можно пере-
давать управление программам с более низким уровнем привилегий.
Прерывание (ищеггир() — сигнал от внешнего устройства. приводящий к преры-
ванию выполнения текущей программы и передаче управления специальной про-
грамме-обработчику (см. ловушка).
Р
Разворачивание циклов (1оор ипгоШп8) — превращение циклов, выполняющих-
ся известное число раз, в линейный участок кода.
Реальный режим (геа] то4е) — режим, в котором процессор ведет себя идентично
8086 — адресация не выше одного мегабайта памяти, размер всех сегментов огра-
ничен и равен 64 Кб, только 16-битный режим.
Резидентная программа (гез1ет ргоёгат) — программа, остающаяся в памяти
после возврата управления в РОЗ.
С
Сегмент (зевтелё) — элемент сегментной адресации в памяти или участок про-
граммы для РО$/\МЛиао\.
Секция (5есйоп) - участок программы для ОМХ.
Селектор (з@есфог) — число, хранящееся в сегментном регистре.
Скан-код (5сап-со4е) —- любой код, посылаемый клавиатурой.
Слово (\огА) — тип данных, имеющий размер 16 бит.
Смещение (оН5е() — относительный адрес, отсчитываемый от начала сегмента.
Стековый кадр ($асКк Нате) — область стека, занимаемая параметрами процеду-
ры, активационной записью и локальными переменными или только локальны-
ми переменными.
Страничная адресация (рартайоп) — механизм адресации, в котором линейное
адресное пространство разделяется на страницы, которые могут располагаться
в разных областях памяти или вообще отсутствовать.
т
А
Адресация Байт 15
косвенная 25 Байты состояния клавиатуры 149
с масштабированием 26 Бит 15
непосредственная 25 Блоки
по базе информации УВЕ 158
с индексированием 27 параметров РЗР 202
со сдвигом 26 параметров запускаемого файла 204
по смещению 25 Блоки повторений 123
полная форма 27 вИМХ 537
прямая 25 Буфер клавиатуры 150
регистровая 24 расширение при помощи драйвера 377
Активационные записи 219
дисплей 223
Ввод
стековый кадр 222 из стандартного устройства ввода 14]
Алгоритмы с клавиатуры 148
вывода на экран с помощью мыши 166
шестнадцатеричного числа 142 Видеопамять
генераторов случайных чисел 238
в $УСА-режимах 156
генерации пламени 406
в графических режимах 154
неупакованного ВСВ в АЗС! 201 в текстовом режиме 139 _
преобразования Видеорежимы
цифры в АЗСИ-код 39 ЗУСА 156
шестнадцатеричного числа УСА 151 `
в десятичное 201 Виртуальная память 511
рисования Виртуальные прерывания (в У86} 527
круга 164 Вложенные процедуры . 222
прямой линии 169 Время выполнения микроопераций 473
сортировки 242 Вывод
Ассемблер в стандартное устройство вывода 13]
директивы 106 на экран
макроопределения 121 в УСА-режимах 151
метки 106 в текстовом режиме 134, 139
модели памяти 112 Вычисления
операторы 120 с плавающей запятой 233
преимущества и недостатки 11 с повышенной точностью 225
процедуры 115 с фиксированной запятой 228
псевдокоманды 108 г
сегменты 110
структура программ 106 Генераторы случайных чисел 238
условное ассемблирование 118 вычитаниями 239
Атрибут символа 136 конгруэнтные 238
Алфавитный указатель
д ОН: (в МИпдоми 95/МТ) 451
Дата и время 172 ЕЕ 536
Дескрипторы 49] ЕХЕ (в 205} 130
сегмента данных или кода 389 РЕ (в У/таомз 95/МТ) 413
Джойстик 371 $5 (в 205} 374
Диалоги 431 Ухо (в МИпдомз 95) 457
Динамик 335 К
Динамические библиотеки 45]
Кластер 385
Директивы ассемблера
в ВО5/МИпаом $ 106 Кодировки 561
в ОМХ 534 Коды команд 567
Директории. 192 Командные параметры 208
Драйверы 374 Команды
Ухо 457 ААА 40
блочные 384 ААО 41
символьные 375 ААМ 40
з АА$ 40
АБС 34
Завершение программы 205
АБО 34
Задача 519
АВОР$ 94
Защита памяти 516
Защита страниц 519 АВО$$ 94
Защищенный режим 488 АМО 41
адресация 388 АМОМР$ 99
модель памяти 490 АМОР$ 99
селекторы 388 АВРЕ 484
средствами ОРМ! 394 ВОЦМО 52
средствами УСР! 391 В$Е 46
Звук ВУВ 46
без программирования ОМА 355 ВУМУАР 30
с программированием ОМА 361 ВТ 45
Звуковые платы 339 ВТС 46
и ВТК 46
Идентификация процессора 60 ВТ$ 46
Инициализация контроллера прерываний 369 САЦ 50
Интерфейс СВМ/ 32
ОРМ! СВО 32
вызов прерываний 397 СС 57
обработчики прерываний 398 СО 58
операции над дескрипторами 395 СН 59
передача управления между СИ$ 484
режимами 396 СМС 57
управление памятью 405 СМО\сс 28
УСРЕ 391 СМР 37
Исключения 245
СМРР$ 97
‚ РУ 67
55Е 105 СМР$ 55
в реальном режиме 249 СМР5$ 98
код ошибки 506 СМРХСНС 38
список и функции 506 СМРХУНСВВ 38
Исполняемые файлы 127 СРУЮ 60
СОЕЕ (в УМХ) 540 СОмМ!5$ 98
СОМ (в 905] 128 СУТ* 98
[604 |
ТТТ А5зетЫег для ОО$, МАпдо\ми5 и ИМХ
С\У/О 32 АМЗАУЕ 81
СУ/ОЕ 32 АМЗТСУУ 79
ОАА 38 АМУТЕМУ 80
РАЗ 39 АМ$ТЬУИ 82
ОЕС 37 ГРАТАМ 77
ОУ 36 ЕРКЕМ 73
ОИУР$ 95 ЕРКЕМТ 73
015$ 95 ЕРТАМ 77
ЕММ$ 90 РЕМЫМТ 73
ЕМТЕВ 52 РВЗТОК 81
ЕОХМТ 77 РАМЕ 81
РАВ 73 РЭСАЁЕ 73
РАОБОР 70 РМ 76
ЕВШ 69 РУМСО$ 76
ЕВУТР 69 РЗОКТ 74
ЕСН$ 73 ГУТ 69
РСШЕХ 79 РУТСМ/ 79
ЕСМО\Усс 70 ГЭТЕМУ 80
ЕСОМ 74 ЕЗТР 69
ЕСОМИ, 75 РУТУУУ 82
ЕСОМР 75 РОВ 71
ЕСОМР 74 РЗЦВР 71
ЕСОМРР 74 РЗУВК 71
ЕСО$ 76 РУОВЕР 71
РОЕСЗТР 79 ЕТЗТ 75
ЕОМ 72 РОСОМ 74
ЕОМР 72 РОСОМГ 75
ЕОМВ 72 РОСОМР 75
РОМАР 72 РОСОМР 74
ЕЕВЕЕ 79 РОСОМРР 74
ЛАОО 70
АМАГ 82
ЕХАМ 75
АСОМ 75
ЕХСН 70
АСОМР 75
ЕХКТОК 81, 103
НОМ 72
ГХЗАМЕ 81, 103
НОМК 72
РАВАСТ 74
НЕО 69
Р/.2Х 78
АМОЕ 71
РУЕ2ХР1 78
НМСУТР 78
НИ 486
НМИ 79
Юм 36
НТ 69 1МИЕ 35
НУТР 69
М 32
Н$ИВ 71 МС 37
АЗИВЮЕ 71 №5 56
ЕО 68 МТ 51
АО* 78 ИМТЗ 52
РОС\/ 80 МТО 52
НОЕМУ 81 ИМУО 485
ЕМУ 71. ИММРС 485
ЕМШР 71 ВЕТ 51
ЕМСЕХ 79 кс 48
АМИМИ 79 ХР 49
ЕМОР 82 ЗЕСХР 49
Алфавитный указатель 1605,
МР 47 ОК 41
1АНЕ 58 ОКР$ 100
[АВ 484 ОЧТ 32
(ОМХС$Е 103 ОЧТ$ 57
12$ 59 РАСК* 84
(ЕА 34 РАООБ* 85
[ЕАУЕ 53 РАМО 88
{Е$ 59 РАМОМ 88
15 59 РАУСВ 100
(СОТ 482 РАУСМ\М/ 100
[5$ 59 РСМР* 88
НОТ 483 РЕХТВУУ 100
ЦОТ 482 РАМУКУУ 100
[М5\/ 483 РМАВОМ/О 87
СК 60 РМАХЗМ/ 101
05$ 56 РМАХОВ 101
ЮОР 49 РМИМЫМУ/ 101
ЮОРЕ 50 РМИМИВ 101
{ООРМЕ 50 РМОУМЪЗКВ 101
[ООРМР 50 РМЦ 87
[ЮОРИ 50 РМУНИМУ 101
(5Ё 485 РОР 31
[$$ 59 РОК 88
ТВ 482 РОРА 31
МАЗКМОУ@ 104 РОРЕ 58
МАХРЗ 96 РВЕГЕТСН* 104
МАХ$$ 96 РЗАОБВУУ 102
МИМРЗ 97 РЗИ* 89
мм$$ 97 РЗВА* 89
МОЕРЗ 95 РЗК* 89
МО!$5 95 РЗУВ* 86
МОУ 28, 483 РИМРСК* 84
МО\УАР$ 93 РОЗН 30
МОУО 83 РИЗНА 31
МОУНЕР$ 93 РУЗНЕ 58
МОУНРЗ 93 РХОК 89
МОУМЬНР$ 93 КСЕ 44
МОМРЗ 93 ЮСРР$ 96
МОУМЗКР$ 94 КСР$$ 96
МОУМТР$ 104 ВСК 44
МОУМТО 104 ®ОМ$К 486
МОУСО 84 КОРМС 487
МО\$ 54 КОТ$С 486
МО\$$ 94 ВЕР 54
МО\У$Х 33 КЕРЕ 54
МОУЦРЗ 93 КЕРМЕ 54
МОУ7Х 33 КЕРМ7 54
МОИ 36 ВЕРУ 54
МЦР$ 95 ВЕТ 51
му$$ 95 ВЕТЕ 51
МЕС 37 ВЕТМ 51
МОР 59 КО 44
МОТ 42 КОК 44
6061 СТ АзбетЫег для 2О$, МУАпдоми$ и УМХ
В5М 486 в ЕХЕ-файл 131
В5ОКТРЗ 96 вИМХ 541
*
®5ОВТ5$ 96 драйверы для РОЗ 374
ЗАНЕ 58 графического приложения 415
ЗАЕ 43 с ресурсами 427
ЗАЕС 59 консольного приложения 416
ЗАВ 43 с использованием расширителей ВО 404
УВВ 35 Конвейеры исполнения команд 471
$СА$ 55 Конвенции передачи параметров
ЗЕТсс 46 С-конвенция 461
$СОТ 482 РАЗСА!-конвенция 460
УНЕ 43 смешанные 463
УНР 44 Конечные автоматы 214
УНК 43 Консольные приложения 416
УНАР 44 Контроллер
ЗНУЕР$ 102. ОМА 359
ЭНУАМ 102 прерываний 366
ОТ 483
ОТ 482 л
ЗМ$\М/ 484 Линейный кадровый буфер (1ЕВ} 155
ЗОКТР$ 95 Линия А20 493
$ОВТ$5 95 Логические операции 18
УТС 57
ТО 58 М
УП 59 Макроопределения 121
УТМХСУК 103 в ОМХ 538
510$ 56 Микрооперации 473
ТВ 483 Младший байт 16
ЗИВ 35 Младший бит 15
ИВР 94 Многозадачность 526
$4855 94 вВО5 298
ЭУЗЕМТЕК 487 Модели памяти 112
ЗУЗЕХИ 487 Модемы 179
ТЕЗТ 42 Мышь 166
иСОМ!$$ 98 Н
402 60
Насыщение 83
ОМРСКНР5 102
Нереальный режим 497
ИМРСКИР$ 102
Нитевая многозадачность 298
УЕВВ 485
\МЕРМУ 485 о
МАТ 82 Обратная польская нотация 234
УУНМУО 485 Окружение РОЗ 208
У/ВМ$Е 486 Операнды 24”
ХАВО 35 Операторы 120
хснс 30 в АТ&Т-ассемблерах 533
ЖАТ 33 Операционные системы
ХОК 42 005 127
ХОКР5 100 Ипих, РгевВЗО, Зо!ат$ 529
идентификация процессора 60 УИпаомз 95/МТ 413
расширение АМО ЗВ 90 Оптимизация
Компиляция / программ
в СОЕЁЕ-формат 540 высокоуровневая :465
в СОМ-файл 128 на среднем уровне 465
в И 452 низкоуровневая :468.`
в Е1Р-формат 539 циклов 466
Алфавитный указатель 1 607,
Организация Префиксы
задержек 174 1ОСК 60
памяти ВЕР 54
модели памяти 112 ВЕРЕ 54
порядок байтов 16 КЕРМЕ 54
сегменты 22 КЕРМИ 54
стек 22 КЕРР 54
Отладочные регистры 480 другие префиксы 571
Привилегировснчые комс-2> 518
п
Процедуры 216
Палитра УСА 328 Процессоры
Память Репнит Рго и Рептит # 472
ХМ$ 197 Реппит и Реппит ММАХ 471
выделение 194 Псевдокоманды определения донных 108
определение максимального блока 194 в ОМХ 534
освобождение 194 Р
Передача параметров
Расширения страничной адресации 510
в блоке параметров 220
Расширенные АЗС!-коды 565
в глобальных переменных 218
Расширители ОО$ 403
в потоке кода 220
Реальный режим 20
в регистрах 218
Регистры
в стеке 218
СВх 478
в языках высокого уровня 460 ОВх 480
отложенным вычислением 218 М$В 481
по возвращаемому значению 217 общего назначения 20
по значению 216 данных
по имени 217 ЕРИ 65
по результату 217 ммх 82
по ссылке 216 сегментные 22
Переключение слова состояния ЕР) 66
банков 155 слова управления ЕРУ 66
задач 521 управления памятью 477
Переменные среды 208 флаги СРИ 23
Повторная входимость Режимы Х 325
в ВОЗ 255 Режимы процессора
в 00$ 254 ВЕМ/ВЕМ 497
Полурезидентные программы 292 \86 527.
Порты защищенный 488
УСА ВАС 328 нереальный 497
\УСА-контроллер СКТ 320 реальный 20
УСА-синхронизатор 324 Резидентные программы 256
клавиатура 305 выгрузка из памяти 276
параллельный 181, 315 без РЭР 259
последовательный 179, 309 мультиплексорное прерывание 263
Предсказание переходов 475 пассивные и активные 256
Прерывания 245 повторная входимость 253
в ОРМГ 397 полурезидентные программы 292
в защищенном режиме 499 спецификация АМ!$ 263
инициализация контроллера 369 с
обработчики прерываний 246 Сегмент состояния задачи 519
отвнешних устройств 249 Сегментная адресация
разрешение и запрещение 59 в защищенном режиме 490
Префикс программного сегмента (РЗР} 202 Сегменты 110
608 ТИВ А$5етЫег для ОО$, МИпдо\м5 и ОМХ
Сектор 384 У
Секции 535 Управление задачами 519
Селекторы 388, 491 Управляющие регистры 478
Символы АЗСИ 18, 559 Управляющие символы АЗСИ 561
Система счисления Уровень вложенности 222
двоичная 14
Условные переходы 212
шестнадцатеричная 16
Устройства
Системные функции
видеосдаптеры УСА 316
№с 538
джойстик 371
ИМХ 540
\т32 414 динамик 335
Системный таймер запись в устройство 186
на уровне 805$ 171 звуковые платы 339
на уровне портов ввода-вывода 331 клавиатура 305
Скан-коды 148 контроллеры
Скорость выполнения команд 570 ОМА 359
Слово 16 прерываний 366
Сообщения (в \\тдо\з} 422 системный таймер 331
Сортировки
Ф
быстрая 242
пузырьковая 242 Файлы
выбором 244 запись 186
Старший байт 16 идентификатор 183
Старший бит 15 открытие 183
Статические ссылки 222 поиск 188
Стековый кадр 222 поиск с длинным именем 189
Страничная адресация 509 создание 183
защита при страничной адресации 519 удаление 187
расширения Репнит Рго 510 Флаги
т
системные 476
Таблица переходов 213 флаги состояния ЕРЦ 66
Таймер центрального процессора 23
на уровне ВОЗ 171 Функции
на уровне портов ввода-вывода 331 в ассемблере 216
Типы данных . системные
АЗ$С!-символы 18 НЬс 538
ММХ 83 мт32 414
упакованные байты 83 вИМХ 540
упакованные двойные слова 83
упакованные слова 83 Ц
учетверенное слово 83 Циклы
байт 15 РОК 215
бит 15 [ООР/ЕМОООР 215
вещественные числа РЕРЕАТ/УМИЕ 215
длинное 64 МИНИЕ 215
короткое 64 Ч
расширенное 64
специальные случаи 64 Часы реального времени
двоично-десятичные числа 38 на уровне ВЮ5 171
двойное слово 16 на уровне портов ввода-вывода 336
Числа
с фиксированной запятой 228
‘с плавающей запятой 233