Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web...

112
Лекции СПО Лекция № 1 Введение Системное ПО это комплексы программ, предназначенные для совместного использования технических средств вычислительных систем, для автоматизации создания программ и для выполнения существующих. Все системное ПО делится на 5 классов: 1. ОС. 2. СУФ. 3. Интерфейсная оболочка. 4. Система программирования. 5. Утилиты. Операционная система – это комплекс управляющих и обрабатывающих программ, предназначенных для организации интерфейса взаимодействия между техническими средствами и пользователем с его задачами. ОС предназначена для использования и распределения ресурсов вычислительной системы, для организации надежности вычислений. В общем случае, существует 3 способа взаимодействия программ с техническими средствами: Через использование функций ОС. Через использование функций базовой системы ввода/вывода (BIOS). Например, int 13h обеспечивает доступ к магнитным носителям, int 10h – доступ к видеобуферу и т.д. Прямое обращение к регистрам периферийных устройств. Важнейшие решаемые задачи ОС: 1. Прием от пользователя заданий или команд и их предварительная обработка. 2. Прием запросов на запуск, остановку или приостановку программы. 3. Загрузка программ в оперативную память. 4. Инициализация программ.

Transcript of Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web...

Page 1: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Лекции СПОЛекция № 1

Введение

Системное ПО – это комплексы программ, предназначенные для совместного использования технических средств вычислительных систем, для автоматизации создания программ и для выполнения существующих.

Все системное ПО делится на 5 классов:1. ОС.2. СУФ.3. Интерфейсная оболочка.4. Система программирования.5. Утилиты.Операционная система – это комплекс управляющих и обрабатывающих

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

В общем случае, существует 3 способа взаимодействия программ с техническими средствами:

Через использование функций ОС.Через использование функций базовой системы ввода/вывода (BIOS).

Например, int 13h обеспечивает доступ к магнитным носителям, int 10h – доступ к видеобуферу и т.д.

Прямое обращение к регистрам периферийных устройств.Важнейшие решаемые задачи ОС:1. Прием от пользователя заданий или команд и их предварительная

обработка.2. Прием запросов на запуск, остановку или приостановку программы.3. Загрузка программ в оперативную память.4. Инициализация программ.5. Идентификация данных и программ.6. Обеспечение работы СУФ и СУБД.7. Организация обмена сообщениями и данными между программами.8. Распределение внутренней памяти и организация виртуальной памяти.9. Обеспечение мультипрограммного режима работы.10. Планирование и диспетчеризация задач.11. Управление операциями ввода/вывода. 12. Организация защиты между управляющимися программами.Упрощенно ОС состоит из двух компонент: базовой системы

ввода/вывода (BIOS) и собственно дисковой операционной системы, реализующих следующие функции управления:

Page 2: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Назначение BIOS – управление периферийным оборудованием. BIOS располагается в ПЗУ на материнской плате и представляет собой набор подпрограмм по управлению дисковыми носителями, видеобуфером, принтерами, клавиатурой, системным таймером и т.д.

Базовыми языками для СПО следует считать такие языки, которые обеспечивают, с одной стороны, доступ к устройствам на уровне портов ввода/вывода, регистров, аппаратных буферов, управляющих схем и т.д. для эффективной организации всех вычислительных процессов. К таким языкам следует отнести языки программирования ASM и СИ.

Ассемблер – это программа, переводящая (компилирующая) мнемонический текст исходной программы, понятный программисту, в машинный код, понятный процессору, т.е. в его систему команд. В повседневной жизни под ASM понимается язык программирования, основанный на системе команд процессора.

Page 3: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Лекции № 2 - 3

Архитектурные особенности IBM PC

Краткий обзор семейства микропроцессоров фирмы IntelМикропроцессоры (МП) Intel 8086, 8088, 80286, 80386 и 80486,

явившиеся в разные годы основой новых моделей персональных компьютеров фирмы IBM (IBM PC, PC/XT , PC/AT, PS/2) при всех своих различиях и особенностях сохраняют единство архитектурных принципов, системы команд и языка программирования, что обеспечивает программную совместимость многочисленных разновидностей компьютеров «типа IBM PC».

Важнейшей характеристикой любого микропроцессора является разрядность его внутренних регистров, также внешних шин адресов и данных. МП 8086 имеет 16-разрядную внутреннюю архитектуру и такой же разрядности шину данных. Все регистры внутри процессора, в которых могут хранится данные, имеют длину 16 битов. Таким образом, максимальное целое число (данное или адрес), с которым может работать микропроцессор, составляет 216-1=65536 (64К-1). Однако адресная шина МП 8086 содержит 20 линий, что соответствует адресному пространству 220-1 Мбайт. Для того, чтобы с помощью 16-разрядных адресов можно было обращаться в любую точку 20-разрядного адресного пространства, в микропроцессоре предусмотрена сегментная адресация памяти, реализуемая с помощью четырех сегментных регистров.

Суть сегментной адресации заключается в следующем. Исполнительный 20-разрядный адрес любой ячейки памяти вычисляется путем сложения начального адреса сегмента памяти, в котором располагается эта ячейка, со смещением к ней (в байтах) от начала сегмента, которое обычно называют относительным адресом или смещением. Сегментный адрес без четырех младших битов, т. е. Деленный на 16, хранится в одном из сегментных регистров. При вычислении исполнительного адреса процессор умножает содержимое сегментного регистра на 16 (путем сдвига влево на 4 двоичных разряда) и прибавляет к полученному 20-разрядному адресу относительный адрес.

Умножение базового адреса на 16 увеличивает диапазон адресуемых ячеек до величины 64 Кбайт * 16 = 1 Мбайт.

МП 8088 является, по существу, 8-разрядным вариантом МП 8086. В нем, как и в МП 8086, предусмотрена адресация физической памяти объемом до 1 Мбайт с помощью такого же набора сегментных регистров. Однако шина данных МП 8088 имеет ширину не 16, а 8 разрядов, т.е. доступ к памяти осу-ществляется байтами. Это обстоятельство никак не отражается на работе с процессором, так как, например, при считывании из памяти операнда-слова микропроцессор автоматически генерирует два цикла магистрали, реализующих чтение младшего и старшего байтов. С другой стороны, 8-разрядная шина данных облегчила согласование этого микропроцессора со схемами, разработанными ранее для 8-разрядных МП 8080 и 8085.

Page 4: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

МП 80286, используемый как центральный процессор компьютеров IBM PC/AT, является усовершенствованным вариантом МП 8086, дополненным схемами управления памятью и ее защиты. МП 80286 работает с 16-разрядными операндами, но имеет 24-разрядную адресную шину, что соответствует адресному пространству 224=16 Мбайт. Однако описанный выше способ сегментной адресации памяти не позволяет выйти за пределы 1 Мбайт. Для преодоления этого ограничения в МП 80286 (так же, как и в МП 80386) используются два режима работы: реального адреса и виртуального защищенного адреса, или просто защищенный режим. В реальном режиме МП 80286 функционирует фактически так же, как МП 8086 с повышенным бы-стродействием и может обращаться лишь к 1 Мбайт адресного пространства. Оставшиеся 15 Мбайт памяти, даже если они установлены в компьютере, использоваться не могут.

В защищенном режиме по-прежнему используются сегменты и смещения в них, однако начальные адреса сегментов не вычисляются путем умножения на 16 содержимого сегментных регистров, а извлекаются из таблиц сегментных дескрипторов, индексируемых теми же сегментными регистрами. Каждый сег-ментный дескриптор занимает 6 байтов, из которых 3 байта (24 двоичных разряда) отводятся под сегментный адрес. Тем самым обеспечивается полное использование 24-разрядного адресного пространства.

В каждом сегментном регистре под индекс таблицы сегментных дескрипторов отводится 14 двоичных разрядов. Полный логический адрес адресуемой ячейки состоит из 14-разрядного индекса (номера) сегмента и 16-разрядного относительного адреса. Это позволяет каждой программе использовать до 230! байт логического, или виртуального пространства, которое, таким образом, в 64 раза превышает максимально возможный объем физической памяти. Операционная система виртуальной памяти хранит все сегменты выполняемых программ в большом дисковом пространстве, автоматически загружая в оперативную память те или иные сегменты по мере необходимости.

МП 80386 и 80486 являются высокопроизводительными процессорами с 32-разрядными шинами данных и адресов и 32-разрядной внутренней архитектурой. Последнее означает, что внутренние регистры этих процессоров, в отличие от процессоров ранних моделей, имеют длину 32 бита. Поэтому максимальное целое число, с который может работать микропроцессор, составляет 232-l=42949б729б (4Г-1). Во многих случаях использование 32-битовых операндов позволяет существенно упростить и ускорить вычисления. Помимо этого, в МП 80386 и 80486 расширен состав регистров, что также предоставляет программисту значительные удобства. Наконец, в новых моде-лях процессоров имеются встроенные средства поддержки многозадачного режима, а также мультипроцессорных систем. Естественно, что эти процессоры, как и МП 80286, могут работать в реальном и защищенном режимах. В последнем случае микропроцессор позволяет адресовать до 232=4 Гбайт физической памяти и 24б=64 Тбайт виртуальной. При этом следует подчеркнуть, что разработчиками обеспечена полная совместимость новых

Page 5: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

моделей процессоров со старыми, в том смысле, что программы, написанные для процессоров 8086-80286, т.е. с использованием 16-битовых операндов, выполняются на новых процессорах без всяких исправлений. Фактически программист, создающий программу, предназначенную для работы под управ-лением MS-DOS, может не задумываться над тем, какой процессор установлен на его компьютере.

Используемые в настоящее время версии MS-DOS работают в реальном режиме и не обеспечивают управление виртуальной памятью. В то же время обширные классы программ, в частности, программы управления технологи-ческими процессами или научно-исследовательскими установками, не требуют использования защищенного режима и успешно работают в среде опе-рационной системы MS-DOS. Вообще во многих случаях относительно простая и надежная система MS-DOS, получившая, к тому же, широчайшее распространение, оказывается удобнее более совершенных, но и значительно более сложных систем, реализующих все возможности современным микро-процессоров.

Распределение адресного пространстваВ зависимости от модификации персонального компьютера и состава его

периферийного оборудования распределение адресного пространства может несколько различаться. Тем не менее, размещение основных компонентов системы довольно строго унифицировано. Типичная схема использования адресного пространства компьютера приведена на рис. 1.1. Значения адресов на этом рисунке, как и повсюду далее в книге, даны в 16-ричной системе счисления. Признаком 16-ричного числа служит буква h, стоящая после числа.

Page 6: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

1 Кбайт Векторы прерываний 00000h

256 байтов Область данных BIOS 00400h

512 байтов Область данных DOS 00500h

IO.SYS/MSDOS.SYS 00700h Стандартная память

Загружаемые драйверы (640 Кбайт)

COMMAND.COM

(резидентная часть) Дополнительная

Свободная память память(EMS)

для загружаемых

прикладных и системных

программ А0000h

64 Кбайт Графический буфер EGA B0000h

32 Кбайт UMB B8000h

32 Кбайт Текстовый буфер EGA C0000h Верхняя память(384 Кбайт)

64 Кбайт ПЗУ-расширения BIOS D00000h

64 Кбайт UMB E00000h

128 Кбайт ПЗУ BIOS 1000000h

64 Кбайт HMA 10FFF0h

До 15 Мбайт

(80286) XMS Расширенная память

До 4 Гбайт

(80386/486)

Первые 640 Кбайт, адресного пространства с адресами от OOOOOh до 9FFFFh отводятся под основную оперативную память, которую еще называют стандартной (conventional). Начальный килобайт оперативной памяти занят век-торами прерываний (256 векторов по 4 байта). Вслед за векторами прерываний располагается область данных BIOS, которая занимает

адреса от 00400h до 004FFh. В этой области хранятся разнообразные данные, используемые программами BIOS в процессе управления периферийным оборудованием. Так, здесь размещаются:

- входной буфер клавиатуры с системой указателей;

Дополнительная память(EMS)

Page 7: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

- адреса последовательных и параллельных портов;- данные, характеризующие настройку видеосистемы (форма курсора и его

текущее местоположение на экране, текущий видеорежим, ширина экрана и прочее);

- ячейки для отсчета текущего времени;- область межзадачных связей и т.д.Область данных BIOS заполняется информацией в процессе начальной

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

В области памяти, начиная с адреса 500h, содержатся некоторые системные данные DOS. Вслед за областью данных DOS располагается собственно операционная система, загружаемая из файлов IO.SYS и MSDOS.SYS (IВМВIO.СОМ и IBMDOS.COM для системы PC-DOS). Система обычно занимает несколько десятков Кбайт.

Если в файл CONFIG.SYS включены директивы DEVICE=... загрузки устанавливаемых драйверов (ADM.SYS, SMARTDRV.SYS, EMM386.EXE, ANSI.SYS и др.), то они загружаются вслед за системой. Наконец, ниже драйверов размещается резидентная часть командного процессора COMMAND.COM, занимающая около 3 Кбайт. В функции резидентной части COMMAND.COM входит обработка <Ctrl>/C, <Ctrl>/<Break> и критических ошибок, вывод сообщений об ошибках, завершение текущей задачи, загрузка транзитной части COMMAND.COM. Транзитная, загружаемая часть COMMAND.COM размещается в самом конце оперативной памяти, затирается при загрузке программ и после завершения выполняемой программы должна загружаться с диска заново.

Перечисленные выше компоненты операционной системы занимают обычно 60-90 Кбайт. Вся оставшаяся память до границы 640 Кбайт (называемая иногда транзитной областью) свободна для загрузки любых системных или прикладных программ. Как правило, в начале сеанса в память загружают ре-зидентные программы (русификатор, электронный блокнот, резидентные расширения DOS, программы контроля состояния диска, входящие, например, в состав Нортоновских утилит и др.). При наличии резидентных программ объем свободной памяти уменьшается. Оставшиеся 384 Кбайт адресного пространства, называемого верхней (upper) памятью, первоначально были предназначены для размещения постоянных запоминающих устройств (ПЗУ). Практически под ПЗУ занята только часть адресов. В самом конце адресного пространства, в области FOOOOh...FFFFFh (или EOOOOh... FFFFFh) располагается основное постоянное запоминающее устройство BIOS, а начиная с адреса COOOOh - так называемое ПЗУ расширений BIOS для обслуживания графических адаптеров и дисков. Часть адресного пространства верхней памяти отводится для адресации к видеобуферам графического адаптера. Приведенное на рисунке расположение видеобуферов характерно для адаптера EGA; для других адаптеров оно может быть иным, например, видеобуфер простейшего монохромного адаптера MDA занимает всего 4 Кбайт и

Page 8: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

располагается, начиная с адреса ВООООЮ.В состав компьютеров PC/AT наряду со стандартной памятью (640 Кбайт)

может входить расширенная (extended) память, максимальный объем которой зависит от ширины адресной шины процессора и при использовании процессора 80286 может достигать 15 Мбайт, а для процессоров 80386/486 - 4 Гбайт. Эта память располагается за пределами первого мегабайта адресного пространства и начинается с адреса lOOOOOh. Реально на машине может быть установлен не полный объем расширенной памяти, а лишь 2-3 Мбайт или даже меньше, например, всего 384 Кбайт.

Поскольку функционирование расширенной памяти подчиняется "спецификации расширенной памяти" (Extended Memory Specification, сокращенно XMS), то и саму память часто называют XMS-памятью. Как уже отмечалось выше, доступ к расширенной памяти осуществляется в защищенном режиме, поэтому для MS-DOS, работающей только в реальном режиме, расширенная память недоступна.

Однако в современные версии MS-DOS включается драйвер HIMEM.SYS, поддерживающий расширенную память, т.е. позволяющий ее использовать, хотя и ограниченным образом. Конкретно в расширенной памяти можно разместить электронные диски (с помощью драйвера RAMDRIVE.SYS) или кош буферы диска (с помощью драйвера SMARTDRV.SYS).

Первые 64 Кбайт расширенной памяти, точнее, 64 Кбайт -16 байт с адресами от lOOOOOh до lOFFEFh, носят специальное название область старшей памяти (High Memory Area, НМА). Эта область замечательна тем, что хотя она находится за пределами первого мегабайта, к ней можно обратиться в реальном режиме работы микропроцессора, если определить сегмент, начинающийся в самом конце мегабайтного адресного пространства. с ЯЛПРСЯ FFFFOh. и разрешить использование адресной линии А20. Первые 16 байтов этого сегмента заняты ПЗУ, область же со смещениями 0010h...FFFFh можно, в принципе, использовать под программы и данные. MS-DOS позволяет загружать в НМА (директивой файла CONFIG.SYS DOS=HIGH) значительную часть самой себя, в результате чего занятая системой, область стандартной памяти существенно уменьшается. Старшую память обслуживает тот же драйвер HIMEM.SYS, поэтому загрузка DOS и НМА возможна, только если установлен HIMEM.SYS.

Как видно из приведенного выше рисунка, часть адресного пространства верхней памяти, не занятая расширениями BIOS и видеобуферами, оказывается свободной. На компьютерах с МП 80386 и 80486 эти свободные участки можно использовать для адресации к расширенной памяти (конечно, не ко всей, а лишь к той ее части, объем которой совпадает с общим объемом свободных адресов верхней памяти). Пере отображение расширенной памяти на свободные адреса верхней памяти выполняет драйвер ЕММ386.ЕХЕ, а сами участки верхней памяти, "заполненные" расширенной, называются блоками верхней памяти (Upper Memory Blocks, UMB). MS-DOS позволяет загружать в UMB устанавливаемые драйверы устройств, а также резидентные программы-расширения DOS (APPEND.EXE, DOSKEY.COM, KEYB.COM и др.). Загрузка

Page 9: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

системных программ в UMB освобождает от них стандартную память, увеличивая ее транзитную область. В UMB можно загрузить также и прикладные резидентные программы. Загрузка в UMB драйверов осуществляется директивой файла CONFIG.SYS DEVICEHIGH (вместо директивы DEVICE), a загрузка резидентных программы - командой DOS LOADHIGH.

По умолчанию драйвер ЕММ386.ЕХЕ преобразует в UMB 128 Кбайт расширенной памяти, располагая ее по адресам СООО... CFFF. При необходимости (если, например, на эти адреса настроено какое-то нестандартное внешнее устройство) объем, и расположение UMB в адресном пространстве верхней памяти можно изменить с помощью ключей в строке установки драйвера ЕММ386.ЕХЕ.

Независимо от наличия и объема расширенной (XMS) памяти, компьютер может быть укомплектован платой с дополнительной памятью, не отвечающей каким-либо определенным адресам 16-мегабайтного адресного пространства. Эта память функционирует в соответствии со спецификацией Lotus-Intel-Microsoft Expanded Memory Specification (LIM EMS) и может достигать объема (в версии EMS 4/0) 32 Мбайт. Обращение к EMS-памяти осуществляется через относительно узкие окна (физические страницы) размером по 16 Кбайт, в качестве которых используется часть адресного пространства верхней памяти (от границы 640 Кбайт до 1 Мбайт). Любой блок дополнительной памяти, называемый логической страницей, может быть отображен на физическую страницу в верхней памяти, чем и обеспечивается прямая (хотя и не одновременная) адресация всего пространства дополнительной памяти. В дополнительной памяти, как и в расширенной, обычно размещают электронные диски или кеш- буферы, хотя спецификация EMS 4.0 допускает (в отличие, от EMS 3.2) выполнение программ, находящихся в дополнительной памяти.

Компьютеры типа PC/AT или PS/2 обычно оснащаются расширенной памятью того или иного объема, но не всегда дополнительной. Между тем, некоторые программы в процессе своего выполнения обращаются к дополнительной памяти и при ее отсутствии просто не будут функционировать. Для того, чтобы позволить таким программам выполняться на компьютерах без дополнительной памяти, предусмотрена возможность преобразования части расширенной памяти в дополнительную. Это преобразование осуществляет тот же драйвер ЕММ386.ЕХЕ. По умолчанию для отображения дополнительной памяти используется диапазон адресов верхней памяти DOOO...DFFF, который в этом случае, естественно, выпадает из области блоков верхней памяти UMB. При необходимости область отображения дополнительной памяти можно изменить.

1.3. Регистры процессораКак уже отмечалось выше, внутренняя архитектура микропроцессоров

Intel практически совпадает, если не рассматривать имеющихся в старших моделях процессоров (начиная с МП 80286)' схем организации защищенного режима. Поэтому ниже все эти микропроцессоры будут рассматриваться вместе под общим названием "процессор".

Page 10: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Процессор содержит двенадцать 16-разрядных программно - адресуемых регистров, которые принято объединять в три группы: регистры данных, регистры-указатели и сегментные регистры. Кроме того, в состав процессора входят счетчик команд и регистр флагов (рис. 1.2).

В группу регистров данных включаются регистры АХ, ВХ, СХ и DX. Программист может использовать их по своему усмотрению для временного хранения любых объектов (данных или адресов) и выполнения над ними требуемых операций. При этом регистры допускают независимое обращение к старшим (АН, ВН, СН и DH) и младшим (AL, BL, CL и DL) половинам. Так команда mov BL, AH пересылает старший байт регистра АХ в младший байт регистра ВХ, не затрагивая при этом вторых байтов этих регистров.Заметьте, что сначала указывается операнд-приемник, а после запятой - операнд-источник. Во многих случаях регистры данных вполне эквивалентны, однако предпочтительнее пользоваться регистром АХ, поскольку многие команды занимают в памяти меньше места и выполняются быстрее, если их операндом является регистр АХ (или его половины AL или АН). С другой стороны, ряд команд использует определенные регистры неявным образом. Так, все команды циклов используют регистр СХ в качестве счетчика числа повторений; в командах умножения и деления регистры АХ и DX выступают в качестве неявных операндов; операции ввода-вывода можно осуществлять только через регистр АХ (или AL) и т.д.

Индексные регистры SI и DI так же, как и регистры данных, могут использоваться произвольным образом. Однако их основное назначение - хранить индексы (смещения) относительно некоторой базы (т.е. начала массива) при выборке операндов из памяти. Адрес базы при этом может находиться в базовых регистрах ВХ или ВР. Специально предусмотренные команды работы со строками используют регистры SI и DI в качестве неявных указателей в обрабатываемых строках.

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

Последний из группы регистров-указателей, указатель стека SP, стоит особняком от других в том отношении, что используется исключительно как указатель вершины стека, обеспечивая выполнение стековых команд (PUSH, POP и др). Однако это не исключает его использование в качестве операнда в арифметических операциях или операциях пересылки, если требуется изменить положение вершины стека.

Регистры SI, DI, ВР и SP, в отличие от регистров данных, не допускают побайтовую адресацию.

Четыре сегментных регистра CS, DS, ES и SS являются важнейшим элементом архитектуры процессора, обеспечивая адресацию 20-разрядного адресного пространства с помощью 16-разрядных операндов.

Page 11: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

АН AL

ВН BL

СН CL

DH DL

Регистры-указатели

SI

DI

ВР

SP

Сегментные регистры

CS

DS

ES

SS

Прочие регистры

IP

FLAGS

Аккумулятор

Базовый регистр

Счетчик

Регистр данных

Индекс источника

Индекс приемника

Указатель базы

Указатель стека

Регистр программного сегмента

Регистр сегмента данных

Регистр дополнительного сегмента данных

Регистр сегмента стека

Указатель команд

Регистр флагов

Page 12: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Рис.1.2. Регистры процессора.

Page 13: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Обращение к памяти (как к стандартной памяти в пределах 640 Кбайт, так и к буферам или ПЗУ в области 640 Кбайт -1 Мбайт) осуществляется исключительно посредством сегментов - логических образований, накладываемых на любые участки физического адресного пространства. Размер сегмента должен находиться в пределах 0 байт - 64 Кбайт (допустимы и иногда используются сегменты нулевой длины). Начальный адрес сегмента, деленный на 16, т.е. без младшей 16-ричной цифры, заносится в один из сегментных регистров. Как правило, это действие выполняет программист с помощью соответствующих программных строк. При обращении к памяти процессор извлекает из сегментного регистра сегментный базовый адрес, умножает его на 16 сдвигом влево на 4 двоичных разряда и складывает с заданным каким-либо образом относительным адресом (смещением), получая 20-разрядный физический адрес адресуемой ячейки памяти (слова или байта). Этот процесс проиллюстрирован на рис. 1.3 на конкретном примере команды inc meml.

Оперативная память слова

Программныйсегмент

06FF

0006

0

2 Сегмент данных

4

6 Ячейка meml

Код команды inc meml

Смещение к ячейке meml

I—— Содержимое DS - 10E2h

10E20h Базовый адрес сегмента (на границе параграфа) lDE22h

lDE24h lDE26h Физический адрес ячейки meml

10Е28П Вычисление физического адреса:lDE2h * 10h = lDE20h + ООО6h=1DE26h

Рис. 1.3. Формирование физического адреса

Page 14: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

В примере предполагается, что сегмент данных, адресуемый через регистр DS, имеет базовый адрес lDE20h, а ячейка meml расположена в байтах 6 и 7 этого сегмента (смещение meml относительно начала сегмента равно 6).

Поскольку младшая 16-ричная цифра базового адреса сегмента должна быть равна 0, сегмент всегда начинается с адреса, кратного 16, т.е. на границе 16-байтового блока памяти (параграфа). Число, хранящееся в сегментном .регистре, называют сегментным адресом. Следует помнить, что сегментный адрес в 16 раз меньше физического; его можно рассматривать, как номер параграфа, с которого начинается данный сегмент.

Регистр CS обеспечивает адресацию к сегменту, в котором находятся программные коды, регистры DS и ES - к сегментам с данными (таким образом, в любой момент времени программа может иметь доступ к 128 Кбайт данных), а регистр SS -к сегменту стека, который на машинах типа IBM PC, в отличие от других вычислительных систем, может быть очень большим и достигать 64 Кбайт. Сегментные регистры, естественно, не могут выступать в качестве регистров общего назначения.

Указатель команд IP "следит" за ходом выполнения программы, указывая в каждый момент относительный адрес команды, следующей за исполняемой. Регистр IP программно недоступен (IP - это просто его сокращенное название, а не мнемоническое обозначение, используемое в языке программирования); наращивание адреса в нем выполняет микропроцессор, учитывая при этом длину текущей команды. Команды переходов, прерываний, вызова подпрограмм и возврата из них изменяют содержимое IP, осуществляя тем самым переходы в требуемые точки программы.

Регистр флагов, эквивалентный регистру состояния процессора других вычислительных систем, содержит информацию о текущем состоянии процессора (рис. 1.4). Он включает 6 флагов состояния и 3 бита управления состоянием процессора, которые, впрочем, тоже называются флагами.15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 Разряды

OF DF IF TF SF ZF AF PF CF

Рис. 1.4. Регистр флагов.

Флаг переноса CF (Carry Flag) индицирует перенос или заем при выполнении арифметических операций, а также служит индикатором ошибки при обращении к системным функциям.

Флаг паритета PF (Parity Flag) устанавливается в 1, если результат операции содержит четное число двоичных единиц.

Флаг вспомогательного переноса AF (Auxiliary Flag) используется в операциях над упакованными двоично-десятичными числами. Он индицирует перенос или заем из старшей тетрады (бита 3).

Флаг нуля ZF (Zero Flag) устанавливается в 1, если результат операции равен 0.

Флаг знака SF (Sign Flag) показывает знак результата операции,

14

Page 15: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

устанавливаясь в 1 при отрицательном результате.Управляющий флаг трассировки (ловушки) TF (Trace Flag) используется

для осуществления пошагового выполнения программы. Если TF«1, то после выполнения каждой команды процессор реализует процедуру прерывания типа 1 (через вектор, расположенный по адресу 04).

Управляющий флаг разрешения прерываний IF (Interrupt Flag) разрешает (если равен 1) или запрещает (если равен 0) процессору реагировать на прерывания от внешних устройств.

Управляющий флаг направления DF (Direction Flag) используется командами обработки строк. Если DF-0, строка обрабатывается в прямом направлении, от меньших адресов к большим; если DF*1, обработка строки идет в обратном направлении.

Флаг переполнения OF (Overflow Flag) фиксирует переполнение, т.е. выход результата за пределы допустимого диапазона значений.

Для работы с регистром флагов предусмотрен ряд команд. Установка и сброс флагов CF, DF и IF осуществляется командами STC, STD и STI (установка) и CLC, CLD и CLI (сброс). Все содержимое регистра флагов можно сохранить в стеке командой PUSHF и извлечь из стека командой POPF; кроме того, младший байт регистра флагов (флаги CF, PF, AF, ZF и SF) можно переслать в регистр АН командой LAHF или загрузить в регистр флагов из АН командой SAHF.

Сегментация памятиПеред тем как изучать регистры и команды процессора 8086, необходимо по-

нять, как он адресует память, используя системные сегменты и смещения — термины, часто вызывающие недоразумения.

Используя для представления значения адреса 20 бит, 8086-й процессор может иметь прямой доступ к 1 Мбайт памяти. DOS, ROM BIOS и другие находящиеся в памяти программы уже занимают определенное место памяти персонального компьютера, поэтому остальные программы запускаются, используя меньшее пространство памяти — до 640 Кбайт. Если вы хотите, чтобы ваша программа работала на возможно большем числе компьютеров — ограничьте пределы необходимой памяти.

ЗамечаниеПоследние модели процессов, такие как 80386, 80486 и Pentium (известный

как 80586), эмулируют режим процессора 8086. Методы, описанные в этой главе, применимы ко всем процессорам 80х86.

Программирование на языке ассемблераНезависимо от того, сколько памяти может адресовать процессор или

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

15

Page 16: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

физические адреса. Если в вашем компьютере 64 Кбайт памяти, тогда для задания адреса любого байта достаточно 16 бит, с помощью которых представляются значения от 0 до 65535 (216-!), или округленно — 64 Кбайт. Для адресации 1 Мбайт памяти персонального компьютера требуется как минимум 20 бит (220-! равно 1048575, или, в шестнадцатеричном представлении, FFFFF). Проблема состоит в том, что 8086 процессор использует только 16-битовые регистры. Тогда каким образом процессор 8086 может иметь доступ ко всему мегабайту памяти в обычном персональном компьютере?

Ответом является сегментация памяти — метод, используемый процессором 8086 для разделения большого адресного пространства памяти на логические 64 Кбайт фрагменты. С помощью этого метода адрес конкретного байта может быть выражен двумя значениями: адресом фрагмента (сегмента) и 16-битовым смещением от начала сегмента.

Эта комбинация значений сегмента и смещения называется логическим адресом. Первый байт сегмента имеет смещение 0000, второй — 0001, третий — 0002 и т.д., независимо от того, где сегмент физически начинается в памяти. Рис. 4.1 демонстрирует эту идею, показывая, что каждая точка памяти имеет как физический адрес (справа), так и логический адрес (слева), выраженный через смещение от начала границы сегмента. С помощью сегментации процессор 8086 может эффективно адресовать до 1 Мбайт памяти, даже используя относительно небольшие 16-битовые регистры. Кроме того, сегментация позволяет легко перемещать программы в новые физические области памяти, изменяя только базовый адрес сегмента. При этом не требуется изменять значения смещений внутри сегмента, что позволяет перемещаемым программам исполняться одинаково в разных местах памяти.

Рис. 1. Логические адреса с соответствующими физическими адресами в памяти

16

Нижняя памятьФизические адреса Логические адреса

0 01 12 23 34 05 16 27 38 09 110 211 312 013 114 215 3 Верхняя память

Сегмент

Сегмент

Сегмент

Сегмент

Page 17: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Параграфы, сегменты и смещения

Для определения начал сегментов памяти процессор 8086 использует четыре 16-битовьк сегментных регистра. Для создания 20-битового физического адреса процессор объединяет значение одного сегментного регистра с 16-битовым смещением (логическим адресом). Это делается путем умножения сегментного значения на 16 (сдвиг влево на 4 бита) и прибавлением к результату смещения (умножение на 16 эквивалентно четырехкратному сдвигу битов влево, как вы помните из главы 3). Исходя из этого получается, что границы сегментов располагаются через каждые 16 байт физических адресов. Каждый из этих 16-байтовых фрагментов называется параграфом. Простые вычисления показывают, что максимально может существовать 65536 параграфов и, следовательно, такое же число границ сегментов в одномегабайтовом адресном пространстве процессора 8086 (1048576/16). (Заметим, что это также равняется числу значений, которые могут быть выражены с помощью одного 16-битового сегментного регистра.) Кроме того, запомните несколько важных сведений о сегментах.

• Сегменты физически не выделены в памяти, что является общим заблуждением. Сегменты — это логические окна, через которые программы просматривают области памяти удобными, в 64 Кбайт порциями. ^

• Начальное положение сегмента (т.е. логический адрес) определяется вами и может иметь любое значение от | 0000 до FFFF в шестнадцатеричном представлении. Каждое логическое значение сегмента (0,'1, 2,..., 65535), соответствует физической границе параграфа (0,16, 32,..., 1048560).• Размеры сегментов могут изменяться от 16 байт до 64 Кбайт (65536

байт). Действительный размер сегмента определяется вами и вашей программой.

• Сегменты не обязательно располагаются физически в памяти один за другим, хотя так бывает достаточно часто.

• Сегменты могут перекрываться один другим; поэтому один и тот же байт в памяти может иметь различные логические адреса, определяемые разными, но при этом эквивалентными парами сегмент-смещение. Но, несмотря на это, каждый байт имеет только единственный 20-битовый физический адрес. Почти всех, кто впервые знакомится с сегментацией памяти, этот последний пункт приводит в замешательство. Две разные пары сегмент-смещение могут (и так часто бывает) указывать в памяти на один и тот же байт. Если вы вспомните, как процессор создает 20-битовые физические адреса — умножением значения сегмента на 16 и прибавлением смещения, вы увидите, что шестнадцатеричные значения пар сегмент-смещение 0000:0010 и 0001:0000 указывают на одну и ту же физическую область памяти. Если повторить процесс преобразования этих логических адресов в физические в десятичной системе счисления, то при вычислении (0000х16)+1б и (0001х16)+0 получается один и тот же результат –16.

17

Page 18: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Лекция № 4Модели памяти и структуры программ

Структура и образ памяти программы .ЕХEПрограммы, выполняемые под управлением MS-DOS, могут принадлежать

к одному из двух типов, которым соответствуют расширения имен программных файлов .СОМ и .ЕХЕ. Основное различие этих программ заключается в том, что программы типа .СОМ состоят из единственного сегмента, в котором размещаются программные коды, данные и стек, а в программах типа .ЕХЕ для собственно программы, данных и стека предусма-триваются отдельные сегменты. Таким образом, размер программы типа .СОМ не может превысить 64 Кбайт, а размер программы типа .ЕХЕ практически не ограничен, так как в нее может входить любое число сегментов программы и данных.

Структура типичной программы типа .ЕХЕ на языке ассемблера выглядит следующим образом.title Программа типа .ЕХЕ text segment 'code'

assume CS:text, DS:data mургос proc mov AX,data mov DS, AX

;Текст программы . . .myproc endp

text ends data segment

. . .

data ends

stack segment stack 'stack* dw 128 dup (0)

stack endsend myproc

Следует заметить, что при вводе исходного текста программы с клавиатуры можно использовать как прописные, так и строчные буквы: транслятор воспринимает, например, строки MOV AX.DATA и mov ax,data одинаково. Однако с помощью соответствующих ключей можно заставить транслятор различать прописные и строчные буквы в именах. Тогда программные строки MYPROC proc и myproc proc уже не будут эквивалент-ны. В настоящей книге принята следующая система обозначений:

- тексты программ набраны строчными буквами, за исключением обозначений регистров (AX, CS) и имен файлов (MYFILE.TXT), которые для наглядности выделены прописными буквами;

- в тексте книги (но не в программах) прописными буквами выделены

;Определения данных

18

Page 19: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

зарезервированные слова, т.е. операторы языка ассемблера (SEGMENT, ENDS, MOV и т.д.), а также имена файлов.

Рассмотрим теперь структуру приведенной программы. Оператор TITLE позволяет предпослать программе текстовый заголовок, который будет выводиться на все страницы листинга трансляции. Программа состоит из трех сегментов: сегмента команд, или программного сегмента с произвольным именем text, сегмента данных с именем data и сегмента стека с именем stack (оба эти имени также могут выбираться произвольно). Каждый сегмент открывается оператором SEGMENT и закрывается оператором ENDS. Перед обоими операторами должно стоять имя сегмента. Порядок сегментов в большинстве случаев роли не играет.

Слово 'CODE', стоящее в апострофах в строке описания сегмента команд, указывает класс сегмента - "программный". Классы сегментов анализируются компоновщиком и используются им при компоновке загрузочного модуля: сегменты, принадлежащие одному классу, загружаются в память друг за дру-гом. Для простых программ, включающих один сегмент команд и один сегмент данных, эта процедура не имеет значения, однако для правильной работы компоновщика LINK и отладчика CodeView при описании сегмента команд необходимо указание его класса 'CODE'.

Текст сегмента команд начинается с оператора ASSUME, который позволяет транслятору сопоставить сегментные регистры и адресуемые ими сегменты. Определение CS:text указывает транслятору, что данный сегмент является программным и будет адресоваться с помощью сегментного регистра CS. Определение DS:data закрепляет за сегментом data сегментный регистр DS, как регистр, используемый по умолчанию, что позволяет ссылаться на переменные, описанные в сегменте data, без явного указания регистра DS. При этом ассемблер проверяет, действительно ли они описаны в сегменте data.

Собственно программа обычно состоит из процедур. Деление программы на процедуры не обязательно, но повышает ее наглядность и облегчает передачу управления на подпрограммы и в другие программные модули. В рассматриваемом примере сегмент команд содержит единственную процедуру тургос, открываемую оператором PROC и закрываемую оператором ENDP. Перед обоими операторами указывается имя процедуры. В первых строках программы инициализируется регистр DS - в него заносится сегментный адрес сегмента данных. Поскольку передача в сегментные регистры непосредственных значений не допускается, в качестве "перевалочного пункта" используется регистр АХ. После того, как регистр DS инициализирован, про-грамма может обращаться к данным, описанным в регистре данных.

Сегмент данных содержит описания всех переменных, используемых в программе. Способы описания данных будут рассмотрены ниже.

Строка описания сегмента стека должна содержать класс сегмента - 'STACK', а также тип объединения - STACK. Тип объединения указывает компоновщику, каким образом должны объединяться одноименные сегменты разных модулей - накладываясь друг на друга (тип объединения COMMON) или присоединяясь друг к другу (тип объединения STACK для сегментов стека

19

Page 20: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

или PUBLIC для всех остальных). Хотя для одномодульных программ тип объединения значения не имеет, для сегмента стека обязательно указание типа STACK, поскольку в этом случае при загрузке программы выполняется автоматическая инициализация регистров SS (адресом начала сегмента стека) и SP (смещением конца сегмента стека). В приведенном примере для стека зарезервировано 128 слов памяти. Класс для сегмента стека указывать не обязательно, однако в тех случаях, когда программисту важен фактический порядок расположения сегментов программы в памяти, лучше всем сегментам присвоить какие-то различающиеся классы (один сегмент может не иметь класса). В этом случае компоновщик расположит сегменты в памяти в таком порядке, в котором они следуют в исходном тексте программы.

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

При загрузке программы сегменты размещаются в памяти, как показано на рис. 2.1.

Образ программы в памяти начинается с префикса программного сегмента (Program Segment Prefics, PSP), образуемого и заполняемого системой. PSP всегда имеет размер 256 байтов содержит таблицы и поля данных, используемые системой в процессе выполнения программы. Некоторые из этих полей будут описаны ниже. Вслед за PSP располагаются сегменты программы. Сегментные регистры автоматически инициализируются следующим образом: ES и DS указывают на начало PSP (что дает возможность, сохранив их содержимое, обращаться затем i программе к PSP), CS - на начало сегмента команд, a SS - на начало сегмента стека. В указатель команд IP загружается от-носительный адрес точки входа в программу (из операнда директивы END), а в указатель стека SP - смещение конца сегмента стека. Таким образом, после загрузки программы в па мять адресуемыми оказываются все сегменты, кроме сегмента данных. Инициализация регистра DS в первых строках программы, позволяет сделать адресуемым и этот сегмент.ES.DS ---> PSP

CS - - 256 байтов IP

Сегмент команд

Сегмент данных

SS Сегмент стека <---SP

Рис. 2.1. Образ памяти программы .ЕХЕ.

Структура и образ памяти программы .СОМКак уже отмечалось, программа типа .СОМ отличается от программы

типа .ЕХЕ тем, что содержит лишь один сегмент включающий все компоненты программы: PSP, программный код (т.е. оттранслированные в машинные коды

20

Page 21: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

программные строки), данные и стек. Структура типичной программы типа •СОМ на языке ассемблера выглядит следующим образом:title Программа типа .СОМ text segment 'code' assume CS:text,DS:text org lOOhmyproc proc ; Текст программы …myproc endp … ;Определения данныхtext endsend myproc

Программа содержит единственный сегмент text, которому присвоен класс 'CODE'. В операторе ASSUME указано, что сегментные регистры CS и DS будут указывать на этот единственный сегмент. Оператор ORG lOOh резервирует 256 байт для PSP. Заполнять PSP будет по-прежнему система, но место под него в начале сегмента должен отвести программист. В программе нет необходимости инициализировать сегментный регистр DS, поскольку его, как и остальные сегментные регистры, инициализирует система. Данные можно разместить после программной процедуры (как это показано на рисунке), или внутри нее, или даже перед ней. Следует только иметь в виду, что при загрузке программы типа .СОМ регистр IP всегда инициализируется числом lOOh, поэтому сразу вслед за оператором ORG lOOh должна стоять первая выполнимая строка программы. Если данные желательно расположить в начале программы, перед ними следует поместить оператор перехода на реальную точку входа, например JMP entry.

Образ памяти программы типа .СОМ показан на рис. 2.2. После загрузки программы все сегментные регистры указывают на начало единственного сегмента, т.е. фактически на начало PSP. Указатель стека автоматически ини-циализируется числом FFFEh. Таким образом, независимо от фактического размера программы ей выделяется 64 Кбайт адресного пространства, всю нижнюю часть которого занимает стек. Поскольку верхняя граница стека не оп-ределена и зависит от интенсивности и способа использования стека программой, следует опасаться затирания стеком нижней части программы. Впрочем, такая опасность существует и в программах типа .ЕХЕ.

CS, DS, ES, SS PSP 256 байтов

Программа и дан-ныеСтек

<— IP

<—— SP=FFFEh

21

Page 22: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Рис. 2.2. Образ памяти программы .СОМ.

22

Page 23: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Лекция № 5

Основные определения данных, констант.

Режимы адресации

1. Основные определения данных, констант.Для заполнения последовательных байтов, слов или двойных слов памяти,

а также для резервирования памяти служат директивы ассемблера (псевдооператоры) DB, DW и DD, а для резервирования массивов - директива DUP:count dw 1000 ; В слово с именем count помещается число 1000coeffs dw 5,12000,0,168 ; Указанными числами заполняются 4 ; последовательные слова памяти. ; Первому слову дается имя coeffs mask db OFFh ; В байт именем mask помещается 16-ричное ; число FFh mes db --Внимание!--' ; Строка байтов с именем mes заполняется ; указанным текстомaddr dw mes ; В слово с именем addr помещается смещение ; первого байта строки mesaddrd dd myproc ; В двойное слово с именем addrd помещается ; двухсловный адрес процедуры myproc (в ; первое слово относительный адрес, во ; второе – сегментный адрес) area dw 128 dup (?) ; Резервируется область памяти объемом 128 ; слов testmes db 100 dup ('#') ; Строка с именем testmes заполняется кодом ; символа # array dw 1024 dup (256) ; Массив из 1024 слов заполняется числом 256

Для определения констант служат директива EQU и знак равенства:kilo equ 1024 ; Числу 1024 присваивается символическое имя kilo offs=80*2*12+40*2 ; Константа offs получает значение, равное ; результату вычисления указанного выражения length=OFFFFh ; Числу Ft-"FFh=65535 присваивается ; символическое имя length

Отличие директивы equ от знака равенства заключается в том, что директива equ присваивает символическим именам значения "раз и навсегда", а при использовании знака равенства значения констант можно

Page 24: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

изменять:counter=0 ; Символическое имя counter принимает значение О counter=counter+l ; Символическое имя counter принимает значение 1

Для ссылок на текущую ячейку используется обозначение счетчика текущего

адреса $:mes db 'Ждите' mes_1en=$-mes

В этом примере константа mes—len получает значение длины строки mes (в данном случае 5 байтов), которая вычисляется как разность значения счетчика текущего адреса после определения строки и ее начального адреса mes.

Данные, описанные в программе, должны участвовать в операциях в соответствии со своими описаниями. Ассемблер фиксирует ошибку, если, например, данное, описанное как байт, участвует в операции со словом. Во многих случаях, однако, требуются как раз такие операции. Для их реализации предусмотрен атрибутивный оператор PTR:bits dw OF5E9h ; Данное описано как слово mov AX,bits ; Операция соответствует описанию mov BH.byte ptr bits ; Из слова bits забирается младший

; байт (число E9h) mov CL.byte ptr bits+1 ; Из слова bits забирается старший

; байт (число F5h) addr dd myproc ; Данное описано как двойное слово mov BX.word ptr addr ; Забираем младшее слово(относительный

; адрес myprog)mov ES.word ptr addr+2 ; Забираем старшее слово(сегментный

; адрес myprog)

2. Режимы адресацииРежимом, или способом адресации называют процедуру нахождения

операнда. Различают следующие режимы адресации.2.1. Регистровый. Операнд (байт или слово) находится в регистре. Этот

способ адресации применим ко всем программно- адресуемым регистрам процессора.inc СХ ; Увеличение на 1 содержимого АХ push OS ; Сегментный адрес сохраняется в стекеxchg ВХ.ВР ; Регистры ВХ и ВР обмениваются содержимымmov ES.AX ; Содержимое АХ пересылается в ES

2.2. Непосредственный. Операнд, (байт или слово) указывается в команде; он может иметь любой смысл (число, адрес, код ASCII), а также быть представлен в виде символического обозначения. mov AH,40h ; Число 40h загружается в АН mov AL,'*' ; Код ASCII символа * загружается в AL int 21h ; Команда прерывания типа 21h limit equ 523 ; Число 528 получает обозначение limit

Page 25: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

mov CX,limit ; Число, обозначенное limit,загружается

; в CXВажным применением непосредственной адресации является пересылка

относительных адресов (смещений). Чтобы указать, что речь идет об относительном адресе данной ячейки, а не об ее содержимом, используется описатель OFFSET:; Сегмент данныхmes db 'Ждите' ; Отрока символов; Сегмент командmov DX,offset mes ; Адрес строки засылается в ОХ

В приведенном примере относительный адрес строки mes, т.е. расстояние в байтах первого байта этой строки от начала сегмента; в котором она находится, заносится в регистр DX.

2.3. Прямой. Адресуется память; адрес ячейки памяти (слова или байта) указывается в команде:;Сегмент данных mem dw 0 ; Резервируется слово памяти (и в него ; засылается 0) ;Сегмент команд Inc mem ; Содержимое этого слова увеличивается на 1

mov DX.mem ; Содержимое слова с именем mem загружается ; в регистр DX

Строго говоря, процессору следует передать информацию о том, с помощью какого сегментного регистра определять адрес:

inc DS:mem mov OX,DS:mem

Однако, как уже отмечалось, по умолчанию все смещения вычисляются относительно DS, поэтому в данном случае это указание сегментного регистра избыточно. В тех же случаях, когда рассматриваемая ячейка находится в сегменте, адресуемом через какой-либо другой сегментный регистр (ES, CS или SS), указание сегментного регистра является обязательным:

Inc ES:meml

Часто бывает нужно обращаться к памяти по известному абсолютному адресу. В этом случае указание сегментного регистра обязательно: mov AL,DS:17h ; Загрузка AL из ячейки с адресом 17h ; относительно DS

mov BX,ES:2Ch ; Загрузка ВХ из ячейки с адресом 2Сh ; относительно ES

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

mov AL,DS:[17h]mov BX,ES:[2Ch]

Page 26: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Следует подчеркнуть, что при любом обращении к памяти процессор обязательно использует один из сегментных регистров, Перед выполнением команды обращения к памяти в используемый сегментный регистр следует заслать требуемый сегментный адрес. Пусть, например, мы хотим прочитать код символа, изображаемого в настоящий в первой позиции экрана. Известно, что текстовый видеобуфер начинается с адреса B8OOOh. Для того, чтобы настроить на этот адрес сегментный регистр, в него следует загрузить число, характеризующее номер параграфа, с которого начинается видеобуфер, т.е. B8000h/16=B800h:

mov AX,OB800h ; Сегментный адрес видеобуфераmov ES.AX ; отправим в ES

mov AL,ES:[0] ; Прочитаем первый байт видеобуфера

2.4. Регистровый косвенный (базовый или индексный). Адресуется память (байт или слово). Относительный адрес операнда находится в регистрах ВХ или ВР (базовая адресация) или в регистрах SI или DI (индексная адресация). При использовании регистров ВХ, SI и DI подразумевается сегмент, адресуемый через DS; при использовании ВР подразумевается сегмент стека и, соответственно, регистр SS. Допускается замена сегмента. Обозначение этого способа адресации:

[ВХ](подразумевается DS:[BX]) [ВР](подразумевается SS:[BP]) [Sl](подразумевается DS:[SI]) [DI](подразумевается DS:[DI])

Регистровый косвенный способ адресации удобно использовать в тех случаях, когда к некоторой ячейке памяти приходится обращаться многократно:

mov SI,offset celts ; Относительный адрес ячейки cells

; загружается в SI mov AX,[SI] ; Содержимое ячейки cells ; ; загружается в AX inc [SI] ; инкремент содержимого ячейки ; cells mov BX,[SI] ; новое содержимое ячейки cells ; ; загружается в BX

2.5. Регистровый косвенный со смещением (базовый или индексный). Адресуется память (байт или слово). Относительный адрес операнда определяется как сумма содержимого регистра BX, BP, SI или DI и указанной в команде константы, называемой смещением. Смещение может быть числом или адресом. При использовании регистров BX, SI и DI подразумевается сегмент, адресуемый через DS; при использовании BP подразумевается сегмент стека – регистр SS. Допускается замена сегмента. Обозначение этого способа адресации:

смещение [BX] (подразумевается DS: смещение [BX])смещение [BP] (подразумевается SS: смещение [BP])смещение [SI] (подразумевается DS: смещение [SI])

Page 27: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

смещение [DI] (подразумевается DS: смещение [DI])Допустимы также обозначения (со всеми регистрами) вида:[BX]+ смещение[BX+ смещение] Пусть в сегмента данных определен массив из 10 чисел:

array db 0,10,20,30,40,50,60,70,80,90Последовательность команд

mov BX,5 mov AL,array[BX]загрузит в регистр AL элемент с индексом 5 – число 50. Тот же результат можно получить, загрузив в BX не индекс, а адрес массива: mov BX,offset array mov AL, 5[BX]Другие варианты последней команды: mov AL,[BX]+5 mov AL,[BX+5]

2.6. Базовый индексный. Адресуется память (байт или слово). Относительный адрес операнда определяется как сумма содержимого следующих пар регистров:

[BX][SI](подразумевается DS:[BX][SI])[BX][DI](подразумевается DS:[BX][DI])[BP][SI](подразумевается SS:[BP][SI])[BP][DI](подразумевается SS:[BP][DI])Допускается замена сегмента.Пусть в сегменте данных определен массив из 10 слов:

words dw 0,10,20,30,40,50,60,70,80,90Последовательность команд

mov BX,offset wordsmov SI,10mov AX,[BX][SI]

загрузит в регистр AX слов со смещением 10 байтов от начала массива, т. е. число 50.

2.7. Базовый индексный со смещением. Адресуется память (байт или слово). Относительный адрес операнда определяется как сумма содержимого двух регистров и смещения. Обозначение этого способа адресации:

смещение [BX][SI](подразумевается DS: смещение[BX][SI])смещение [BX][DI](подразумевается DS: смещение[BX][DI])смещение [BP][SI](подразумевается SS: смещение[BP][SI])смещение [BP][DI](подразумевается SS: смещение[BP][DI])Допустимы также обозначения (со всеми регистрами) вида:

смещение [BX+SI ][смещение +BX+DI][BP][DI]+смещение

Пусть в сегменте данных определен массив из 24 байтов:syms db ‘ЙЦУКЕНГШЩЗХЪ’ db ‘QWERTYUIOP{}’ Последовательность команд mov BX,12 mov SI,6 mov DL,syms[BX][SI]

Page 28: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

загрузит в регистр DL элемент с индексом 6 из второго ряда , т. е. код ASCII буквыU. Тот же результат можно получить, загрузив в один из регистров не индекс, а адрес массива:

mov BX,offset symsmov SI,6mov DL,12[BX][SI]

Page 29: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Лекция № 6 Команды сдвига

SAL/SHL Арифметический сдвиг влево/логический сдвиг влевоКоманда SAL осуществляет сдвиг влево всех битов операнда.

Старший бит операнда поступает в флаг CF. Если команда записана в формате

SAL операнд1сдвиг осуществляется на 1 бит. В младший бит операнда загружается 0. Если команда записана в формате

SAL операнд,CLсдвиг осуществляется на число битов, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда, пройдя через флаг CF, теряются, а младшие заполняются нулями.

В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение.

Каждый сдвиг влево эквивалентен умножению знакового числа на 2, поэтому команду SAL удобно использовать для возведения операнда в степень 2.

Поскольку логический сдвиг влево полностью эквивалентен арифметическому сдвигу влево, команда SHL является просто другим обозначением команды SAL.Пример 1

mov AL,7sal AL,1 ;AL=OEh=7*2

Пример 2MOV AX,lFFhmov CL,2sal AX,CL ;AX=07FCh=lFFh*4

Пример 3mov SI,-l ;SI=FFFFhmov CL,4sal SI,CL ;SI=FFFOh=-l*16=-16

SAR Арифметический сдвиг вправоКоманда SAR осуществляет сдвиг вправо всех битов операнда.

Младший бит операнда поступает в флаг CF. Если команда записана в формате

SAR операнд,1сдвиг осуществляется на 1 бит. Старший бит операнда сохраняет свое значение. Если команда записана в формате

SAR операнд,CLсдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда, пройдя через флаг CF, теряются, а старший бит расширяется вправо.

В качестве операнда можно указывать любой регистр (кроме

Page 30: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение.

Каждый сдвиг вправо эквивалентен делению знакового числа на 2, поэтому команду SAR удобно использовать для деления операнда на целые степени 2.Пример 1

mov AL,7 sar AL,1 ;AL=3=7/2. Остаток потерян

Пример 2mov AX,lFFOhmov CL,4sar AX,CL ;AX=01FFh=lFFOh/16

Пример 3mov BX,-8 ;BX=FFF8hmov CL,Zsar BX,CL ;BX=FFFEh=-2=-8/4

SHR Логический сдвиг вправоКоманда SHR осуществляет сдвиг вправо всех бит операнда. Младший

бит операнда поступает в флаг CF. Если команда записана в форматеSHR операнд,1

сдвиг осуществляется на 1 бит. В старший бит операнда загружается 0, а младший теряется. Если команда записана в формате

SHR onepaнд, CLсдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда заполняются нулями, а младшие, пройдя через флаг CF, теряются.

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

mov AL,7 shr AL,1 ;AL=3

Пример 2mov AX,lFFOhmov CL,4shf AX,CL ;AX=01FFh

Пример 3mov DX,OFFFOhmov CL,4Shr DX,CL ;DX=OFFFh

RCL Циклический сдвиг влево через бит переносаКоманда RCL осуществляет сдвиг влево всех бит операнда. Если

команда записана в формате RCL операнд, 1

сдвиг осуществляется на 1 бит. В младший бит операнда заносится значение флага CF; старший бит операнда загружается в CF. Если команда записана в

Page 31: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

форматеRСL операнд,CL

сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда поступают сначала в CF, а оттуда - в младшие биты операнда.

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

clc ;Сбросим CF mov AX,1 rc1 AX,1 ;AX=2; CF=0

Пример 2mov DL,8rcl DL,1 ;DL=10h, CF=0

Пример 3mov BX,OFFFFhrcl BX,1 ;BX=FFFEh, CF=1

Пример 4с1с ;Сбросим CFmov DH,3mov CL,4 ;Счетчик сдвиговrcl DH.CL ;DH=30h, CF=0

RCR Циклический сдвиг вправо через бит переносаКоманда RCR осуществляет сдвиг вправо всех бит операнда. Если

команда записана в форматеRCR операнд,1

сдвиг осуществляется на 1 бит. В старший бит операнда заносится значение флага CF; младший бит операнда загружается в CF. Если команда записана в формате

RCR операнд,CLсдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда поступают сначала в CF, а оттуда - в старшие биты операнда.

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

с1с ;Сбросим флаг CFmov AX,2rcr АХ,1 ;АХ=1, CF=0

Пример 2mov DL,8 rcr DL,1 ;DL=4, CF=0

Пример 3mov BX,OFh rcr BX,1 ;BX=7, CF=1

Пример 4с1с ;Сбросим флаг CF

Page 32: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

mov DH,80hmov CL,5 ;Счетчик сдвигов rcr DH,CL ;DH=4, CF=0

ROL Циклический сдвиг влевоКоманда ROL осуществляет сдвиг влево всех бит операнда. Если

команда записана в форматеROL операнд,1

сдвиг осуществляется на 1 бит. Старший бит операнда загружается в его младший разряд. Если команда записана в формате

ROL операнд,CLсдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда перемещаются в его младшие разряды

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

MOV АХ,1 rо1 АХ,1 ;AX=0002h

Пример 2mov DL,8 rо1 DL,1 ;DL=lOh

Пример Зmov BX,OFFFEh rо1 BX,l ;BX-FFFOh

Пример 4mov DH,-OCOhmov CL,2rо1 DH,CL ;DH=3

ROR Циклический сдвиг вправоКоманда ROR осуществляет циклический сдвиг вправо всех бит операнда.

Если команда записана в форматеROR операнд,1

сдвиг осуществляется на 1 бит. Младший бит операнда записывается в его старший разряд. Если команда записана в формате

ROR операнд,CLсдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда перемещаются в его старшие разряды.

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

mov AX,2 ror АХ,1 ;АХ=1

Пример 2 Mov DL,8 Ror DL,l ;DL=4

Page 33: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Пример 3Mov BX,OFhRor BX,l ;BX=8007h

Пример 4mov DН,0Сhmov CL,3ror DH,CL ;DH=81h

Page 34: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Лекция № 7 Математические функции

Команды сложенияADD Целочисленное сложение

Команда ADD осуществляет сложение первого и второго операндов. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется. В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непо-средственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака.Пример

mov BX, lFFEhmov СХ.3

add BX,CX ;BX=2001hADC Целочисленное сложение с переносом

Команда ADC осуществляет сложение первого и второго операндов, прибавляя к результату значение флага переноса CF. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется. В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда ADC обычно используется для сложения 32-разрядных чисел.Пример 1

mov AX,1125h adc AX,2C25h ;AX=3D4Bh, если CF был = 1

Пример 2В полях данных:

numtow dw OFFFFh ;Младшая часть 2-го слагаемого numhigh dw 0005h ;Старшая часть 2-го слагаемого

;Число 5FFFFh=393215В программном сегменте:

mov AX,0005h ;Младшая часть 1-го слагаемого mov BX,0002h ;Старшая часть 1-го слагаемого

;Число 20005h=131077 add AX.numlow ;Сложение младших частей. АХ=4,CF=1 adc BX.numhigh ;Сложение старших частей с переносом.

;BX:AX=0008:0004h. ;Число 80004h=524292

INC Инкремент (увеличение на 1)

Page 35: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Команда INC прибавляет 1 к операнду, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака.

Пример 1MOV AX,0563h Inc AX ;AX=0564h

Пример 2mov BH,15h Inc BH ;BH=16h

Пример 3mov AX.ASFFhInc AL ;AX=A500h

Inc AH ;AX=A600hКоманды вычитанияSUB Вычитание целых чисел

Команда SUB вычитает второй операнд (источник) из первого (приемника) и помещает результат на место первого операнда. Исходное значение первого операнда (уменьшаемое) теряется. Таким образом, если команду вычитания записать в общем виде

sub операнд_1, операнд_2 то ее действие можно условно изобразить следующим образом:

операнд_1 - операнд_2 -> операнд_1В качестве первого операнда можно указывать регистр (кроме

сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака.Примеры

sub CX,5 ; Выполняется действие СХ-5->СХ sub DH,DL ; Выполняется действие DH-DL->DH sub AX,mem ; Выполняется действие АХ-(mem)->АХ sub byte ptr men,DL ; Выполняется действие(mem)-DL->memsub tab1e[BX],'O' ; Выполняется действие (table[BX])-30h ; -> table[BX]

SBB Целочисленное вычитание с займомКоманда SBB вычитает второй операнд (источник) из первого

(приемника). Результат замещает первый операнд, предыдущее значение которого теряется. Если установлен флаг CF, из результата вычитается еще 1. Таким образом, если команду вычитания записать в общем виде

sbb операнд_1, операнд_2 то ее действие можно условно изобразить следующим образом:

операнд_1 - операнд_2 - CF -> операнд_1 В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго -регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не

Page 36: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда SBB обычно используется для вычитания 32-разрядных чисел.

Пример 1mov AX,76A5hsbb AX,76A3h ; АХ=-1, если CF был=1 ;АХ=2, если CF был=0

Пример 2 В полях данных:

numlow dw 000Ah ;Младшая часть вычитаемого

numhigh dw 000lh ;Старшая часть вычитаемого

;Число 1000Аh=65546В программном сегменте:

mov АХ,0 ;Младшая часть уменьшаемого mov DX,0002 ;Старшая часть уменьшаемого

;Число 20000h=131072 sub AX,num1ow ; Вычитание младших частей.

;AX=FFF6h, CF=1 sbb DX,numhigh ;Вычитание старших частей с займом.

;DX:AX=0000:FFF6h=65526DEC Декремент (уменьшение на 1)

Команда DEC вычитает 1 из операнда, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака.Пример 1

MOV AX.OFFFFh dec AX ;AX=FFFEh

Пример 2mov CX, О dec CX ;CX=FFFFh=-l

Команда сравненияСМР Сравнение

Команда СМР выполняет вычитание второго операнда из первого. В соответствии с результатом вычитания устанавливаются состояния флагов CF, PF, AF, ZF, SF и OF. Сами операнды не изменяются. Таким образом, если команду сравнения записать в общем виде

cmp операнд_1, операнд_2 то ее действие можно условно изобразить следующим образом:

операнд_1 - операнд_2 -> флаги процессораВ качестве первого операнда можно указывать регистр (кроме

сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком

Page 37: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

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

cmp AX,562DhJe equal ; Переход на метку equal, если

AX=562DhJa above ; Переход, на метку above, если ; содержимое АХ, рассматриваемое как ; число без знака, превышает ; беззнаковое число 562Dh

NEG Изменение знака, дополнение до 2Команда NEG выполняет вычитание знакового целочисленного операнда из нуля, превращая положительное число в отрицательное и наоборот. В КАЧЕСТВЕ ОПЕРАНДА можно, указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение.Примеры

mov АХ, 0001 neg AX ; AX=FFFfh=-l

mov BX, -2 ; BX=FFFgh=-2 neg BX ; BX=0002h

Команды умноженияMUL Умножение целых беззнаковых чисел

Команда MUL выполняет умножение целого беззнакового числа, находящегося в регистре AL (в случае умножения на байт) или АХ (в случае умножения на слово), на операнд-источник (целое число без знака). Размер произведения в два раза больше размера сомножителей.

Для однобайтовых операций один из сомножителей помещается в регистрAL, после выполнения операции произведение записывается в регистр АХ.

Для двухбайтовых операции один из сомножителей помещается в регистр АХ;

после выполнения операции произведение .записывается в регистры DX:AX (в DX - старшая часть, в АХ – младшая). В качестве операнда-сомножителя можно указывать регистр данных или ячейку памяти; не допускается умножение на непосредственное значение.Пример1 mov AL.5 ;Первый сомножитель mov BL, 3 ;Второй сомножитель mul BL ;AX=OOOFh (произведение) Пример 2 mov AX,256 ;Первый сомножитель mov BX,256 ;Второй сомножитель mul BX ;DX=0001h, AX=OOOOh

;(число 65536) Пример 3 mov AL, 251 ;AL=FBh mov BL,3 ;BL=03h mu1 BL ;AX=02Flh

Page 38: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

IMUL Умножение целых знаковых чиселКоманда IMUL выполняет умножение целого знакового числа,

находящегося в регистре AL (в случае деления на байт) или АХ (в случае деления на слово), на операнд-источник (целое число со знаком). Размер произведения в два раза больше размера сомножителей.

Для однобайтовых операций один из сомножителей помещается в регистр AL; после выполнения операции произведение записывается в регистр АХ.

Для двухбайтовых операций один из сомножителей помещается в регистр АХ; после выполнения операции произведение записывается в регистры DX:AX (в DX - старшая часть, в АХ - младшая).

В качестве операнда-сомножителя можно указывать регистр данных или ячейку памяти; не допускается умножение на непосредственное значение.Пример 1

mov AL,5 ; Первый сомножитель mov BL,3 ; Второй сомножитель imul BL ; AX=OOOFh (произведение)

Пример 2mov AX,256 ; Первый сомнохитель mov BX,256 ; Второй сомнохитель imul BX ; DX=0001h, AX=OOOOh (число 65536)

Пример 3mov AL,-5 ; AL=FBh mov BL,3 ; BL=03h imul BL ; AX=FFFlh (-15)

Команды деленияDIV Деление целых беззнаковых чисел

Команда DIV выполняет деление целого числа без знака, находящегося в регистрах АХ (в случае деления на байт) или DX:AX (в случае деления на слово), на операнд-источник (целое число без знака). Размер делимого в два раза больше размеров делителя и остатка.

Для однобайтовых операций делимое помещается в регистр АХ; после выполнения операции частное записывается в регистр AL, а остаток - в регистр АН.

Для двухбайтовых операций делимое помещается в регистр DX:AX (в DX старшая часть, в АХ - младшая); после выполнения операции частное записывается в регистр АХ, а остаток - в регистр DX.

В качестве операнда-делителя можно указывать регистр данных или ячейку памяти; не допускается деление на непосредственное значение. Если делитель равен 0, или если частное не помещается в назначенный регистр, возбуждается прерывание с вектором 0.Пример 1

mov AX,506 ;Делимое mov BL,50 ;Делитель div BL ;AL=OAh (частное), AH=06h ;(остаток)

Пример 2mov DX,1 ;Старшая часть делимого 65537 mov AX,1 ;Младшая часть делимого 65537 mov СХ,256 ;делитель div СХ ;AX=0100h (частное), OX=0001h

Page 39: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

;(остаток)IDIV Деление целых знаковых чисел

Команда IDIV выполняет деление целого числа со знаком, находящегося в регистрах АХ (в случае деления на байт) или DX:AX (в случае деления на слово), на операнд-источник (целое число со знаком). Размер делимого в два раза больше размеров делителя и остатка. Оба результата рассматриваются как числа со знаком, причем знак остатка равен знаку делимого.

Для однобайтовых операций делимое помешается в регистр АХ; после выполнения операции частное записывается в регистр AL. а остаток - в регистр АН. Для двухбайтовых операций делимое помещается в регистры DX:AX (в DX - старшая часть, в АХ - младшая); после выполнения операции частное записывается в регистр АХ, а остаток - в регистр DX.

В качестве операнда-делителя можно указывать регистр данных или ячейку памяти: не допускается деление на непосредственное значение. Если делитель равен 0, или если частное не помещается в назначенный регистр,

возбуждается прерывание через вектор 0.Пример 1

Mov AX,506 ;Делимое mov BL,50 ;Делитель div ;AL=OAh (частное), AH=06h (остаток)

Пример 2mov DX,1 ;Старшая часть делимого 65537mov АХ,1 ;Младшая часть делимого 65537mov CX.256 ;Делительdiv ;AX=0100h (частное), DX=0001h(остаток)

Пример 3mov AX,-506 ;AX=FE06h, делимоеmov BL,50 ;Делитель

idiv ;AL=F6h (-10), AH=FAh (-6)

Page 40: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Лекция № 8Команды управления процессом

1. Команда безусловного перехода JMPКоманда безусловного перехода JMP может использоваться в 5

разновидностях. Переход может быть:- прямым коротким (в пределах -128...+127 байтов);- прямым ближним (в пределах текущего сегмента команд);- прямым дальним (в другой сегмент команд);- косвенным ближним (в пределах текущего сегмента команд через ячейку

с адресом перехода);- косвенным дальним (в другой сегмент команд через ячейку с адресом

перехода).Рассмотрим структуру программы с переходами разного вида.1.1. Прямой короткий (short) переход.seg segment 'code' . . .

jmp short cont ; Koд ЕВ dd

. . .cont: . . seg ends

Метка cont должна отстоять -от команды, следующей за JMP, не более, чем на 128 байтов назад или на 127 байтов вперед. Если cont стоит в программе до команды JMP, описатель SHORT можно опустить. В приведенном коде команды dd обозначает байт с величиной относительного смещения к точке перехода от команды, следующей за командой JMP.1.2. Прямой ближний (near), или внутрисегментный переход.seg segment 'code' . . .

jmp short cont ; Koд Е9 dddd

. . .cont: . . .seg ends

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

В некоторых случаях удобно пользоваться другой формой команды ближнего перехода:

jmp near ptr contв которой в явной форме указывается, что переход должен быть ближним (в

Page 41: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

том же сегменте команд).1.3. Прямой дальний (far), или межсегментный переход.segl segment 'code' . . .

jmp far ptr cont ;KOД EA dddd ssss

. . .

segl ends

seg2 segment 'code'

. . .

cont:

. . .

seg2 endsМетка cont находится в другом сегменте команд этой двухсегментной

программы. В коде команды ssss - сегментный адрес сегмента seg2, а dddd - относительный адрес точки перехода cont в сегменте команд seg2 (относительно начала этого сегмента).1.4. Косвенный ближний (внутрисегментный) переход.seg segment 'code' . . .

jmp DS:contadr ; Код FF 26 dddd

. . .

cont: ; Точка перехода

segl ' endsdat segment . . .

contadr dw cont ; Адрес перехода (слово)

. . .

dat ends

Точка перехода cont может находиться в любом месте сегмента команд, как до, так и после команды JMP. В коде команды dddd обозначает относительный адрес слова contadr в сегменте данных, содержащем эту ячейку. Такой способ перехода удобен тем, адрес перехода может быть вычислен программно и помещен в ячейку contadr по ходу выполнения про-граммы.

В некоторых случаях удобно пользоваться другой формой команды косвенного перехода:

jmp word ptr contadr

Таким образом, и указание сегментного регистра, и описатель WORD PTR придают команде косвенность (переход осуществляется не на метку contadr, а по адресу, содержащемуся в ячейке contadr).

Page 42: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

1.5. Косвенный дальний (межсегментный) переход.segl segment 'code' . . .

jmp DS:contadr ; Код FF 2E dddd

. . .

segl ends

seg2 segment 'code'

. . .

cont: ; Точка перехода

. . .

seg2 ends

dat segment

. . .contadr dd cont ; Двухсловный адрес точки перехода

. . .

dat ends

Точка перехода cont находится в другом сегменте команд этой двухсегментной программы. В коде команды dddd обозначает относительный адрес слова contadr в сегменте данных. Ячейка contadr объявляется директивой DD и содержит двухсловный адрес точки перехода - в первом слове смещение cont в сегменте команд seg2, во втором слове сегментный адрес seg2. Обе компоненты адреса перехода могут быть вычислены и помещены в ячейку contadr по ходу выполнения программы.

В некоторых случаях удобно пользоваться другой формой команды косвенного перехода:

jmp dword ptr contadr

Здесь описатель DWORD PTR говорит о том, что адрес хранится в двухсловной ячейке и, следовательно, осуществляется дальний косвенный переход (в другой сегмент).

2. Команды условного перехода Jсс.

Команды, обозначаемые (в книгах, не в программах!) Jcc, осуществляют переход по указанному адресу при выполнении условия, заданного мнемоникой команды. Если заданное условие не выполняется, переход не осуществляется, а выполняется команда, следующая за командой Jcc. Переход может осуществляться как вперед, так и назад в диапазоне +127...-128 байтов.

В составе команд процессора предусмотрены следующие команды условных переходов:

Page 43: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Команда Перейти, если Условие переходаJA выше CF=-0 и ZF=-0

JAE выше или равно CF=-0JBE ниже или равно CF=1 или ZF=-1JC перенос CF=1JE равно ZF=1JG больше ZF=0 или SF=OFJL меньше SF не равно OF

JLE меньше или равно ZF=1 или SF не равно OFJNAE не выше и не равно CF=1JNB не ниже CF=0JNC нет переноса CF=0JNE не равно ZF=-0JNG не больше ZF=1 или SF не равно OF

JNGE не больше и не равно SF не равно OFJNLE не меньше и не равно ZF=0 и SF=OF

JN нет переполнения OF=0JNS знаковый бит равен 0 SF=0JNZ не нуль ZF=0JP есть четность PF=1JS знаковый бит равен 1 SF=1JZ нуль ZF=1

Пример 1СMР AX,0 ;АХ=0?je equal ;Если да, перейти на метку equal

Пример 2int 21 h ; Вызов системной функции jc error ;Если CF=1 (ошибка), перейти на метку error

3. Оператор цикла

Для организации многократного выполнения некоторого блока команд используется команда LOOP метка, которая передает управление на указанную метку столько раз, каково содержимое регистра СХ. В следующем примере таким образом очищается массив из 1024 чисел.;Сегмент данныхarray dw 1024 dup (?) ; Массив, требующий очистки;Сегмент команд

MOV СХ,1024 ; Счетчик повторений1еа ВХ,array ; Адрес массива в ВХ MOV SI,0 ; Указатель в массиве

null: mov [BX][SI],0 ; Очистка элемента массива inc SI ; Смещение указателя inc SI ; к следующему элементу loop null ; Команда цикла

При необходимости организовать вложенные циклы удобно воспользоваться стеком для сохранения внешнего цикла на время

Page 44: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

выполнения внутреннего. В следующем примере организуется программная задержка длительностью несколько секунд (величина задержки зависит от типа компьютера).

mov CX.10 ; Внешний счетчик повторений outer: push СХ ; Сохраним его в стеке

mov СХ,0 ; 64К шагов во внутреннем циклеinner: loop inner ; Тело внутреннего цикла -всего ; 1 строка

pop СХ ; Восстановим СХ перед командой

loop outer ; loop внешнего цикла

Page 45: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Лекция № 9Ввод/вывод данных

Системные средства ввода данных с клавиатурыОперационная система предоставляет несколько способов ввода данных с

клавиатуры:- Обращение к клавиатуре, как к файлу, с помощью прерывания DOS INT 21h с функцией 3Fh;- использование группы функций DOS INT 21h из диапазона l...Ch, обеспечивающих посимвольный ввод с клавиатуры в разных режимах;- посимвольный ввод путем обращения в обход DOS непосредственно к драйверу BIOS с помощью прерывания INT 16h.Ввод с клавиатуры средствами файловой системы (INT 21h, функция 3Fh)

осуществляется точно так же, как и чтение из файла. Обычно используется предопределенный дескриптор О, закрепленный за стандартным устройством ввода (по умолчанию за клавиатурой). Число вводимых символов указывается в регистре СХ, однако ввод завершается лишь после того, как нажата клавиша <Enter>, независимо от того, введено ли фактически меньше символов, чем было запланировано, или больше (последнее, естественно, может случиться лишь при неправильных действиях). Поэтому при вводе строк с клавиатуры нет необходимости заранее задавать их длину, достаточно загрузить в регистр СХ максимальную длину строки, например, 80 байт. В любом случае в регистре АХ возвращается число реально введенных байтов, при этом учитываются также и два байта (OAh и ODh), поступающие во входной буфер при нажатии клавиши <Enter>.

Особая ситуация возникает, если попытаться ввести больше символов, чем затребовано функцией 3Fh. В процессе выполнения этой функции все вводимые символы тут же извлекаются из кольцевого буфера ввода и пересылаются в буфер DOS. Обнаружив во входном потоке коды клавиши <Enter>, DOS пересылает из этого буфера в буфер пользователя в программе точно затребованное число символов (естественно, без кодов <Enter>, которые располагаются в конце вводимой строки). Остальные символы остаются в буфере DOS, готовые к вводу. Фактически, если не принять специальных мер к очистке буфера, они поступят в программу при очередном запросе 3Fh, даже если оператор еще не начал вводить очередную порцию данных. Очевидно, что в этом случае будет нарушена синхронизация хода выполнения программы с работой оператора.

Поскольку дескриптор 0 закреплен не собственно за клавиатурой, а за стандартным устройством ввода, он обеспечивает перенаправление ввода. Пусть, например, программа PROCDAT содержит строки ввода через дескриптор 0. При запуске программы командой

PROCDATона будет ожидать ввода исходных данных с клавиатуры, однако запуск ее командой

PROCDAT < RAWDAT.001приведет к автоматическому вводу информации из файла RAWDAT.001, который в данном случае ищется в текущем каталоге текущего диска. Поиск

Page 46: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

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

лишь для определенных операторов ввода). Для этого следует открыть консоль для ввода как файл (с именем CON) функцией 3Dh, получить выделенный системой дескриптор, а затем использовать его в операциях ввода 3Fh:

;ПОЛЯ данныхkeybd db

'CON',0 ; Имя устройстваhandle dw

0 ; Новый дескриптор;Программные строки ;Откроем новый дескрипторMOV АН, 3Dh

; Функция открытияMOV AL, О

; Доступ для чтенияmov DX,offset keybd ;

Адрес имени устройстваint 21hMOV

handle,AX ; Получили дескриптор

Второй способ получения данных с клавиатуры в программу, с помощью функций DOS из диапазона 1..Ch, несколько более громоздок, но обеспечивает более разнообразные возможности. Вообще все функции DOS разделяются на две группы: функции 1..Ch (все они обеспечивают ввод-вывод через стандартные дескрипторы) и все остальные функции с номерами 0 и Dh...6Ch. Различие между указанными группами функций заключается в том, что при их выполнении DOS работает на разных стеках - стеке ввода-вывода, если вызываются функции из первой группы и стеке, получившем название дискового, при выполнении функций второй группы. Наличие двух стеков обеспечивает частичную реентерабельность (повторную входимость) DOS. Это свойство очень важно при обработке аппаратных прерываний и будет детально рассмотрено в последующих главах. В программах, не связанных с обработкой внешних аппаратных прерываний, принадлежность функции той или иной группе не имеет значения, и при выборе для использования в программе следует руководствоваться чисто функциональными соображениями.

Для ввода с клавиатуры можно использовать 7 функций прерывания INT 21h:

0lh - ввод символа с эхом;06h - прямой ввод -, вывод через консоль;07h - ввод символа без эха и без отработки Ctrl/C08h - ввод символа без эха и с отработкой Ctrl/C0Ah - буферизованный ввод строки с эхом;0Bh - проверка состояния стандартного устройства ввода0Ch - сброс входного буфера и ввод.

Page 47: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Функции 0lh, 06h, 07h и 08h при каждом вызове вводят в программу один символ из кольцевого буфера ввода; при необходимости ввести группу символов (строку) функции следует использовать в цикле. Различаются эти функции наличием или отсутствием эха, а также реакцией на ввод с клавиатуры сочетания <Ctrl>/C. Функции 0lh и 0Ah отображают вводимые символы на экране (эхо); функции 07h и 08h этого не делают, что дает возможность вводить данные тайком от окружающих (например, пароль или ключ). Второе важное различие описываемых функций касается их реакции на ввод сочетания <Ctrl>/C. При выполнении функций 0lh и 08h DOS проверяет каждый введенный символ и, обнаружив во входном потоке код <Ctrl>/C (03h), аварийно завершает программу Функции же 06h и 07h пропускают код <Ctrl>/C в программу, не инициируя по нему никаких специальных действий. Такой метод ввода используется прикладными программами, если перед завершением в них должны быть выполнены определенные программные действия (сброс буферов на диск, модификация файлов и проч.). Аварийное завершение такой программы средствами DOS по коду <Ctrl>/C могло бы привести к нарушению ее работоспособности.

Функция 0Ah передает в буфер пользователя строку, введенную с клавиатуры; строка должна заканчиваться нажатием клавиши <Enter>. Длина строки может достигать 254 символов. Вводимые символы отображаются на экране; при вводе <Ctrl>/C происходит аварийное завершение программы

Функция 0Bh позволяет проверить наличие в кольцевом буфере ввода ожидающих символов. При обнаружении символов программа должна извлечь их из буфера одной из функций ввода; если символов нет, программа может продолжить выполнение. Такая методика используется в программах носящих циклический характер, если требуется обеспечить управление ходом выполнения программы с клавиатуры терминала. В каждом шаге цикла после выполнения запланированных действий проверяется состояние кольцевого буфера ввода; если в течение предыдущего шага цикла оператор нажал на какую-либо клавишу, программа проанализирует введенный код и осуществит выход из цикла и переход в ту или иную точку; если же буфер оказывается пуст, циклическое выполнение продолжится.

Функция 0Bh чувствительна к <Ctrl>/C. Это дает возможность организовать с ее помощью аварийное завершение программы на тех ее участках, где выполняются чисто процессорные действия. Если, например, включить вызов функции 0Bh в цикл, то при отсутствии ввода с клавиатуры цикл будет выполняться обычным образом, но после ввода <Ctrl>/C про-грамма аварийно завершится, хотя на выполняемом участке программы не используются функции ввода-вывода.

Функция 0Сh служит для организации ввода с предварительной очисткой кольцевого буфера.

Все функции, кроме 0Ch, вводят в программу наиболее старый из скопившихся в кольцевом буфере ввода символ, реализуя тем самым возможность ввода с упреждением. В этом режиме оператор может нажимать на клавиши еще до выдачи программой запроса на ввод; коды нажатых клавиш (не более 15) будут накапливаться в кольцевом буфере ввода и извле-каться оттуда в программу по мере выполнения ею запросов на ввод. В отличие от этого, функция 0Ch сначала очищает кольцевой буфер и лишь

Page 48: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

затем ожидает ввода символа с клавиатуры. В результате коды всех ранее нажатых (по предположению - случайно) клавиш теряются. Обычно функция ввода 0Ch стоит в программе непосредственно вслед за функцией вывода на экран символьной строки с предложением оператору вводить данные. В результате из кольцевого буфера убирается весь "мусор" от случайных нажатий, в программу же поступает лишь то, что вводится оператором после запроса программы. При этом режим ввода (с эхом или без него и т.д.) определяется тем, какая именно функция ввода (0lh, 07h, 08h или 0Ah) реализуется "внутри" функции 0Ch.

Все функции DOS ввода с клавиатуры допускают перенаправление ввода (из файла, последовательного порта, из вывода другой программы). Если требуется избавиться от этого качества, следует использовать файловую функцию ввода 3Fh и специально выделенный дескриптор.

Функции 0lh, 07h, 08h и 0Ah являются синхронными, т.е. при отсутствии символа в кольцевом буфере ждут его ввода. Функция 06h позволяет определить состояние кольцевого буфера и при наличии в нем кода извлечь этот код и обработать его, а при отсутствии - продолжить выполнение программы.

Функции 0lh, 06h, 07h и 08h позволяют вводить в программу расширенные коды ASCII. Для этого, обнаружив, что введенный код ASCII равен нулю, следует выполнить функцию повторно. Это дает возможность управления прикладными программами с помощью функциональных клавиш, а также сочетаний <Alt>/цифра, <Alt>/буква и др.

Функции 06h, 07h и 08h позволяют вводить в программу коды символов с помощью сочетаний <Alt>/цифра на цифровой клавиатуре (в том числе некоторые из первых 32 символов кодовой таблицы и всю вторую половину кодовой таблицы).

Сравнительные характеристики функций DOS ввода с клавиатуры приведены в табл. 5.2.

01h 06h 07h 08h 0Ah 0Bh 0Ch Эхо + - - - + +/-

Реакция на ~С + - - + + + +/-

Перенаправление + + + + + + +

Ожидание символа + - + + + - +/-

Расширенные коды ASCII + + + + - +

<A1t>+код - + + + - +/-

Очистка буфера - - - - - +

Работа с клавиатурой на уровне BIOS (INT 16h) позволяет считывать двухбайтовые коды, поступающие в кольцевой буфер ввода (код ASCII + скан-код) и анализировать слово флагов клавиатуры (нажатие клавиш <Shift>, <Caps Lock> и др.). Для ввода используются следующие функции прерывания INT 16h:

Page 49: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

00h - чтение двухбайтового кода из входного буфера;0lh - чтение состояния клавиатуры и двухбайтового кода без извлечения

его из буфера;02h - чтение флагов клавиатуры.Функция 00h позволяет в одном действии получить полный

двухбайтовый код нажатой клавиши или комбинации клавиш, из которого, в частности, можно извлечь скан-код (некоторые программы идентифицируют нажатые клавиши не по кодам ASCII, а по их скан-кодам), а также получить значащую часть расширенного кода ASCII (при нажатии, например, функциональных клавиш), функция 00h является синхронной: при ее выполнении программа останавливается в ожидании нажатия клавиши.

Функция 0lh относится к числу асинхронных: определив состояние клавиатуры (точнее - буфера ввода), она возвращает управление программе. Состояние буфера возвращается в флаге ZF: если в буфере имеются ожидающие ввода в программу символы, ZF-0, если же буфер пуст, ZF-1. При наличии в буфере кода символа его можно проанализировать, так как он возвращается функцией в регистре АХ (АН - скан-код, AL-код ASCII). Необходимо однако иметь в виду, что функция 0lh, копируя двухбайтовый код в регистр АХ, не очищает при этом кольцевой буфер. Забрать символ с очисткой буфера можно затем функцией 00h.

Функция 02h - чтение флагов клавиатуры - передает в программу содержимое слова флагов (ячейка 417).. Она может использоваться программами, работающими на уровне скан-кодов, для определения состояния клавиш <Shift>, <Caps Lock> и др.

Вывод на экран средствами DOSDOS предоставляет следующие возможности вывода текстовой

информации на экран:- обращение к экрану как к файлу, с помощью прерывания DOS Int 21h с

функцией 40h;- использование группы функций DOS из диапазона l...Ch (прерывание

Int 21h) , реализующих посимвольный вывод, а также вывод строк.Вывод на экран средствами файловой системы (Int 21h, функция 40h)

осуществляется точно так же, как и запись в файл. Используются предопределенные дескрипторы 1 или 2, закрепленные за стандартными устройствами вывода и ошибки, соответственно (по умолчанию - экраном). Число выводимых символов указывается в регистре СХ, а адрес выводимой строки - в регистре DX. Коды 08h (забой), 0Ah (перевод строки), 0Dh (возврат каретки) и некоторые другие рассматриваются, как управляющие и приводят к выполнению соответствующих им действий. Число выводимых символов передается через регистр СХ, однако, если в строке встречается <Ctrl>/Z (код 26), вывод прекращается. Дескриптор 1, закрепленный за стандартным устройством вывода, обеспечивает перенаправление вывода. Пусть, например, программа FILTXT содержит строки вывода через дескриптор 1. При запуске программы командой

FILTXT

Page 50: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

ее вывод появится на экране, однако командаFILTXT>MYFILE.DOCприведет к автоматическому образованию файла MYFILE.DOC и записи

в него всего вывода программы (на экран ничего не поступит); командаFILTXT » MYFILE.DOCнаправит вывод программы FILTXT в тот же файл MYFILE.DOC,

при этом новая запись добавится к уже существующим, увеличив тем самым длину файла MYFILE.TXT.

Предопределенный дескриптор 2 (стандартная ошибка) всегда связан с экраном и не может быть перенаправлен.

Если требуется исключить для каких-то операторов вывода или для всей программы в целом возможность перенаправления, то, помимо использования дескриптора стандартной ошибки, можно открыть экран, как файл (с именем CON) функцией 3Dh, получить выделенный системой дескриптор, а затем использовать его в операциях вывода 40h:

;Поля данныхscreen db 'CON',0 ;Имя устройстваhandlscr dw 0 ;Новый дескриптор

;Откроем новый дескрипторmov АН,3Dh ;Функция открытияmov AL.1 ;Доступ для записиmov DX,offset screen ;Адрес имени устройстваint Blhmov handlscr,AX ;Получили дескриптор

Второй способ вывода на экран текстовой информации реализуется с помощью трех функций прерывания Int 21h:

02h - вывод символа;06h - прямой ввод-вывод;09h - вывод строки.Функция 09h широко используется в системных программах (например,

в драйверах) для вывода на экран информационных и диагностических сообщений. Перед вызовом прерывания адрес сообщения засылается в регистр DX; заканчивается сообщение символом "$". В сообщение могут быть включены управляющие коды (возврата каретки, перевода строки, забоя и др.), а также Esc-последовательности. Так же, как и при выводе через дескриптор 1 (функция 40h), вывод функцией 09h поступает на стандартное устройство вывода и при запуске программы может быть перенаправлен на другие внешние устройства с помощью операторов перенаправления.

Если в процессе вывода сообщения на экран с клавиатуры поступает код <Ctrl>/C, срабатывает стандартная процедура обработки этого прерывания и вывод завершается (как и вся программа в целом). Для надежной обработки прерывания по <Ctrl>/C следует включать режим BREAK (командой DOS BREAK ON).

Функция 02h вызывает передачу на экран (точнее - на стандартное устройство вывода) одного символа, помещаемого в регистр DL. Для вывода строки функцию следует использовать в цикле. В остальном она не

Page 51: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

отличается от функции 09h (перенаправление, обработка управляющих кодов, реакция на ввод с клавиатуры <Ctrl>/C).

Функция 06h (прямой ввод-вывод через консоль) используется в тех случаях, когда надо исключить стандартную реакцию системы на ввод с клавиатуры <Ctrl>/C. В остальном она действует так же, как функции 09h и 02h, однако обеспечивает не только вывод, но ввод. В случае вывода код ASCII передаваемого символа засылается в регистр DL; при вводе DL=FFh.

Средства DOS "в чистом виде" позволяют выводить на экран только черно-белый текст; возможности позиционирования текста на экране ограничиваются использованием символов возврата каретки (0Dh) и перевода строки (0Ah). Для вывода на экран средствами DOS цветных изображений следует использовать управляющие Esc-последовательности, реализуемые драйвером ANSI.SYS.

Вывод на экран средствами BIOSРассмотрим теперь средства вывода на экран, реализуемые драйвером

BIOS, программное обращение к которому осуществляется с помощью прерывания Int 10h. При работе в текстовом режиме обычно используются следующие функции драйвера:

02h - установить позицию курсора;03h - получить позицию курсора;05h - установить видеостраницу;06h - инициализировать или прокрутить вверх окно;07h - инициализировать или прокрутить вниз окно;08h - прочитать символ и атрибут в позиции курсора;09h - вывести символ и атрибут в позицию курсора;0Ah - вывести символ в позицию курсора;0Eh - вывести символ в режиме телетайпа;10h, подфункция 03h - переключить бит мерцание/яркость;13h - вывести строку в режиме телетайпа.

Функция 02h позволяет позиционировать текстовый курсор, задавая его местоположение в виде номера строки (0...24) и номера столбца (0...79). Видео драйвер поддерживает 8 независимых курсоров - по одному на каждую страницу, причем функция 02h позиционирует курсор независимо от того, какая страница является активной.

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

Функция 05h переключает видеостраницы дисплея. Если дисплей находится в текстовом режиме, то переключаются текстовые страницы (0...7), если установлен графический режим, то переключаются графические страницы (0...1).

Большая часть описываемых ниже функций вывода на экран (кроме подфункции переключения мерцания/яркости и функции вывода строки в режиме телетайпа) позволяют формировать изображение на любой видеостранице, как активной в настоящей момент, так и скрытой. Это дает

Page 52: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

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

С помощью функций 06h и 07h в заданном месте экрана дисплея создаются цветные прямоугольные окна заданного размера. Если в созданные ранее окна выведен какой-либо текст то с помощью этих же функций можно прокручивать текст вверх или вниз. При этом текст, уходящий за край окна, пропадает, а из-под противоположного края появляются пустые строки с заданными атрибутами цвета. Для заполнения появляющихся строк текстом следует использовать подходящие функции DOS или BIOS, причем контроль местоположения, длины и цвета строк возлагается на программиста. Драйвер только прокручивает заданную прямоугольную область экрана (вместе с текстом в ней).

Функции 09h, 0Ah, 0Eh и 13h служат для вывода на экран отдельных символов и символьных строк (в цикле), функции 09h и 0Ah не выполняют фильтрации управляющих символов, поэтому с их помощью можно выводить все символы кодовой страницы. Предусмотрен вывод одного и того же символа заданное число раз, что можно использовать при создании рамок и других орнаментов. Вывод символа не перемещает курсор поэтому каждый раз перед применением функций 09h или 0Ah следует позиционировать курсор с помощью функции 02h. Различие функций 09h и 0Ah заключается в том, что первая позволяет вывести символ с любым атрибутом, а вторая использует прежний атрибут той позиции, куда выводится символ.

Функция 0Eh фильтрует управляющие коды 07h (звуковой сигнал), 08h (возврат на шаг), 10h (перевод строки) и 13h (возврат каретки), выполняя соответствующие им действия. Курсор перемещается после вывода каждого символа, что дает возможность выводить целые строки. Однако атрибут символа установить нельзя, выводимый символ приобретает прежний атрибут той позиции, куда он выводится. При необходимости вывода символа с новым атрибутом следует сначала вывести в заданную позицию

символ пробела с требуемым атрибутом (функцией 09h), а затем туда же послать символ с помощью функции 0Eh.

Важным свойством функции 0Eh является автоматический переход на следующую строку после завершения предыдущей, а также прокрутка экрана вверх на одну строку после заполнения самой нижней строки.

Функция 13h предназначена для вывода строк с указанием атрибутов как каждого символа в отдельности, так и всей строки. Функция может выполняться в четырех вариантах в зависимости от кода режима, указываемого в регистре AL. В режимах 0 и 1 атрибут символов указывается сразу для всей строки в регистре BL, причем в режиме 0 курсор не смещается в процессе вывода, а в режиме 1 - смещается на длину строки. В режимах 2 и 3 атрибуты символов включаются в выводимую строку, в которой, таким образом, чередуются коды атрибутов и коды символов, что усложняет формат строки, но позволяет устанавливать атрибуты для каждого символа

Page 53: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

независимо. Режим 2 отличается от режима 3 тем, что в первом случае курсор не смещается, а во втором смещается на длину строки.

При вызове функции 13h в регистре DX задаются координаты начала выводимой строки (в DH - строка экрана и в DL -столбец), а в регистре СХ - длина выводимой строки, которая в режимах 2 и 3 оказывается за счет байтов с атрибутом в два раза больше длины строки, реально появляющейся на экра-не. Несколько необычно указывается адрес выводимой строки. Она должен быть помещен в регистры ES:BP (ES- сегментный адрес и ВР - смещение в пределах сегмента).

Функция 13h выводит не все символы, так как коды 07h, 08h, 0Ah и 0Dh рассматриваются ею, как управляющие.

При выводе на экран средствами драйвера BIOS необходимо иметь в виду, что ввод с клавиатуры <Ctrl>/C не приводит к завершению программы. Следует опасаться бесконечных циклов вывода на экран - выход из них возможен только путем перезагрузки компьютера.

Подфункция 03h функции 10h (прерывание 10h), в отличие от описанных выше функций вывода символов и строк, воздействует сразу на весь экран, влияя на отображение тех символов, у которых установлен старший бит атрибута фона. Функция позволяет либо приписать этот бит яркости фона, давая тем самым возможность выводить на экран 16 цветов фона, либо назначить его атрибуту мерцания символа. В последнем случае цвет фона может принимать только 8 значений.

Page 54: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Лекция № 10Подпрограммы.

Команда вызова подпрограммы CALL может использоваться в 4 разновидностях. Вызов может быть:

- прямым ближним (в пределах текущего сегмента команд);- прямым дальним (в другой сегмент команд);- косвенным ближним (в пределах текущего сегмента команд через ячейку

с адресом перехода); - косвенным дальним (в другой сегмент команд через ячейку с адресом

перехода);Программа обычно оформляется в виде процедуры, завершающейся

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

Рассмотрим структуру программных комплексов с подпрограммами.1. Прямой ближний вызов.seg segment 'code'mymain proc ;Основная программа . . .

call sub ;Код Е8 dddd

. . .

mymain endp

sub proc near ; Подпрограмма

. . .

ret ; Код СЗ

sub endp

seg endsПроцедура-программа находится в том же сегменте команд, что и

вызывающая программа. В коде команды dddd обозначает смещение в сегменте команд к точке входа в подпрограмму (не обязательно оформляемую в виде процедуры). При выполнении команды CALL процессор помещает адрес возврата (содержимое регистра IP) в стек выполняемой программы, после чего к текущему содержимому IP прибавляет dddd. В результате в IP оказывается адрес подпрограммы.

Page 55: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Команда RET выполняет обратную процедуру - заносит адрес возврата в IP.

2. Прямой дальний вызов.segl segment 'code'mymain proc ; Основная программа call far ptr sub ; Код 9А dddd ssss . . .

mymain endpsegl endsseg2 segment 'code'sub proc far ; Подпрограмма . . .

ret ; Код CB

sub2 endp

seg2 ends

Процедура-подпрограмма находится в другом сегменте команд той же программы. В коде команды dddd обозначает относительный адрес точки входа в подпрограмму в ее сегменте команд, а ssss - ее сегментный адрес. При выполнении команды CALL процессор помещает в стек сначала сегментный адрес вызывающей программы, а затем адрес возврата (содержимое IP). В сегментный регистр CS заносится ssss, а в IP - dddd. Поскольку процедура-подпрограмма атрибутом FAR объявлена дальней, команда RET имеет код, отличный от кода аналогичной команды ближней процедуры и выполняется по-другому: из стека извлекаются два верхних слова и переносятся в IP и CS, чем и осуществляется возврат в вызывающую программу, находящуюся в другом сегменте команд.

Вместо того, чтобы объявлять процедуру дальней, можно вместо команды RET указать в явной форме команду дальнего возврата из подпрограммы RETF.3. Косвенный ближний вызов.seg segment 'code' mymain proc ; Основная программа . . .

call word ptr subadr ; Код FF 16 dddd

mymain endp

sub proc near ;Подпрограмма

. . .

ret ; Код СЗ

sub endp

seg ends

dat segment

. . . subadr dw sub ; Ячейка с адресом подпрограммы

. . .

Page 56: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

dat ends

Процедура-программа с атрибутом NEAR находится в том же сегменте, что и вызывающая программа, а ее относительный адрес в ячейке subadr в сегменте данных. В коде команды dddd обозначает относительный адрес слова subadr в сегменте данных. Второй байт кода команды (16 в данном примере) зависит от способа адресации. Косвенный вызов позволяет использовать разнообразные способы адресации подпрограммы:

call word ptr [ВХ] ; В ВХ адрес подпрограммы call word ptr [ВХ] [SI] ; В ВХ адрес таблицы адресов

; подпрограмм, в SI индекс ; в этой таблице.

call word ptr table [SI] ; table - адрес таблицы адресов ; подпрограмм, в SI индекс в

этой ; таблице.

4. Косвенный дальний вызов.segl segment 'code'mymain proc ; 0сновная программа call dword ptr subadr ; Код FF IE dddd . . .

mymain endpsegl endsseg2 segment 'code'sub proc far ; Подпрограмма . . .

ret ; Код СВ

sub endp

seg2 ends

dat segment

. . .

subadr dd sub ; Двухсловная ячейка с адресом

; подпрограммы

dat ends

Процедура-подпрограмма с атрибутом FAR находится в другом сегменте команд той же программы, а ее полный двухсловный адрес (сегментный адрес и смещение) - в ячейке subadr в сегменте данных. Второй байт кода команды (1Е в данном примере) зависит от способа адресации. Косвенный дальний вызов, как и косвенный ближний, позволяет использовать разнообразные способы описания адреса подпрограммы

Page 57: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Лекция № 11

Обращение к системным средствам из прикладной программы

Обращение к функциям DOS и BIOS осуществляется с помощью программных прерываний (команда 1NT).

Система прерываний машин типа IBM PC в принципе не ,, отличается от любой другой системы векторизованных прерываний. Самое начало оперативной памяти от адреса OOOOh до 03FFh отводится под векторы прерываний - четырехбайтовые области, в которых хранятся адреса программ обработки прерываний (ПОП). В два старшие байта каждого вектора записывается сегментный адрес ПОП, в два младшие - относительный адрес точки входа в ПОП в сегменте. Векторы, как и соответ-ствующие им прерывания, имеют номера, называемые типами, причем вектор с номером 0 (вектор типа 0) располагается начиная с адреса 0, вектор типа 1-е адреса 4, вектор типа 2 -с адреса 8 и т.д. Вектор с номером N занимает, таким образом, байты памяти от N*4 до N*4+3, Всего в выделенной под векторы области памяти помещается 256 векторов. Получив сигнал на выполнение процедуры прерывания с определенным номером, процессор сохраняет в стеке выполняемой программы слово флагов, а также сегментный и относительный адрес сегмента команд (содержимое CS и IP) и загружает CS и IP из соответствующего вектора прерываний, осуществляя тем самым переход на ПОП (рис 3.1).

Page 58: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Рис. 3.1. Процедура прерывания.

Программа обработки прерывания обычно заканчивается командой возврата из прерывания IRET, выполняющей обратные действия - загрузку IP, CS и регистра флагов из стека, что приводит к возврату в основную программу в точку, где она была прервана.

Запросы на выполнение процедуры прерываний могут иметь различную природу. Прежде всего различают аппаратные прерывания от периферийных устройств или других компонентов системы и программные прерывания, вызываемые командой INT, которая используется, в частности, для программного обращения к функциям DOS и BIOS. Сигналы, возбуждающие аппаратные прерывания, могут инициироваться цепями самого процессора, например, при попытке выполнения операции деления на ноль (такие прерывания называются внутренними, или отказами), а могут приходить из периферийного оборудования (внешние прерывания). Независимо от источника, процедура Прерывания, описанная выше, всегда выполняется одинаково, как для аппаратных, так и для программных прерываний.

Большая часть векторов прерываний зарезервирована для выполнения определенных действий; часть из них автоматически заполняется адресами системных программ при загрузке системы. Векторы со следующими номерами могут представлять особый интерес для пользователя:

OOh - деление на 0;Olh - пошаговое выполнение (при TF-1);02h - немаскируемое прерывание (вывод NMI процессора)

Page 59: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

03h - команда INT без числового параметра; 04h - INTO - прерывание по переполнению (инициируется аппаратно, но лишь при наличии в программе команды INTO);05h - прерывание возбуждается при нажатии клавиши PrintScreen 08h - таймер (аппаратное);09h - клавиатура (аппаратное);OAh - зарезервировано для подключения нестандартного устройства (аппаратное);OBh - второй последовательный порт COM2 (аппаратное);ОСh - первый последовательный порт СОМ1 (аппаратное);ODh - жесткий диск (PC, XT), второй параллельный порт LPT2 (AT) (аппаратное);OEh - гибкий диск (аппаратное);OFh - параллельный порт (принтер LPT1) (аппаратное);10h - видеодрайвер BIOS;13h - драйвер BIOS диска;14h - драйвер последовательного порта;16h - драйвер BIOS клавиатуры;17h - драйвер BIOS принтера;19h - начальный загрузчик BIOS;lAh - календарь-часы BIOS;IBh - обработчик прерываний по <Ctrl>/<Break>;ICh - программа-заглушка BIOS для обработки прерываний от системного таймера (18,2 прерываний в секунду);IDh - адрес таблицы видеопараметров, BIOS;lEh - адрес -таблицы параметров дискеты, BIOS;IFh - адрес второй половины таблицы шрифтов графических режимов 4...6, BIOS;21h - диспетчер функция DOS;22h - адрес перехода, при завершении процесса, DOS;23h - обработчик прерываний по <Ctrl>/C;24h - обработчик прерываний по критической ошибке;25h - абсолютное чтение диска;26h - абсолютная запись на диск;28h - программа-заглушка DOS для активизации резидентных программ командами с клавиатуры;2Fh - мультиплексное прерывание DOS;33h - драйвер мыши фирмы Microsoft;43h - адрес таблицы шрифтов графических режимов, BIOS;60h...66h - прерывания пользователя;67h - драйвер дополнительной памяти LIM EMS;68h...6Fh - свободные векторы;70h - КМОП-часы реального времени (AT, аппаратное);71h - программа BIOS, возбуждающая прерывание INT OAh для совместимости машин XT и AT в части обслуживания нестандартных внешних устройств (AT, аппаратное);72h...73h - зарезервировано (AT, аппаратное);74h - мышь (PS/2, аппаратное);76h - жесткий диск (AT, аппаратное);77h - зарезервировано (AT, аппаратное);78h...7Fh - свободные векторы;Flh.-.FFh - не используются.

Как видно из таблицы, векторы прерываний можно условно разбить на следующие группы:

Page 60: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

- векторы аппаратных прерываний (08h...OFh и 70h...77h);- драйверы BIOS (10h, 13h, 16h и т.д.);- программы DOS (21h, 22h, 23h и т.д.);- адреса системных таблиц BIOS (IDh, lEh, 43h и т.д.). Системные

программы, адреса которых хранятся в векторах прерываний, в большинстве своем являются всего лишь диспетчерами, открывающими доступ к большим группам программ, реализующих системные функции. Так, видео драйвер BIOS (вектор 10h) включает программы смены видеорежима, управления курсором, задания цветовой палитры, загрузки шрифтов и многие другие. Особенно характерен в этом отношении вектор 21h, через который осуществляется вызов практически всех функций DOS: ввода с клавиатуры и вывода на экран, обслуживания файлов, каталогов и дисков, управления памятью и процессами, службы времени и т.д.

Обращение из прикладной программы к системным функциям осуществляется единообразно. В регистр АН засылается номер функции (не путать с типом прерывания!), в другие регистры - исходные данные, необходимые для выполнения конкретной системной программы. После этого выполняется команда INT с числовым аргументом, указывающим тип (номер) прерывания, например, INT 21h.

Большинство функций DOS и многие функции BIOS возвращают в флаге переноса CF код завершения. Если функция выполнилась успешно, CF=0, в случае же любой ошибки CF=1. В последнем случае в одном из регистров (чаще всего в АХ) возвращается еще и код ошибки. Таким образом, типичная процедура обращения к системным средствам выглядит следующим образом:

MOV AH.func ;func - номер функции ;3аполнение тех или иных регистров (AL, ВХ, ES. ВР и др.) ;параметрами, необходимыми для выполнения данной функции

. . .int 2 In ; Переход в MS-DOS jc error ; Строка выполняется сразу ; после возврата из DOS

;Продолжение программы . . .error: cmp AX, 1 ; Анализ кода завершения je err1 сmр АХ2 je егг2 . . .

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

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

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

-прерывания, инициирующие обработчик, могут быть аппаратными (от

Page 61: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

периферийных устройств) или программными (команда INT);-программа обработчика может быть резидентной или транзитной;-вектор обрабатываемого прерывания может быть транзитным или

использоваться системой;-если вектор уже используется системой, т. е. в составе DOS имеется

системный обработчик прерывания данного типа, то новый обработчик может полностью заменять системный или сцепляться с ним;

-в случае сцепления новый обработчик может выполнять свои функции до или после системного обработчика.

Для того, чтобы прикладной обработчик получал управление в результате прерывания, его адрес следует поместить в соответствующий вектор прерывания. Хотя содержимое вектора прерываний можно изменить простой командой mov, однако предпочтительнее использовать специально предусмотренную функцию DOS 25h прерывания DOS INT 21h. В регистр AL помещается номер модифицируемого вектора, а в регистры DS:DL – адрес нового обработчика. Старое содержимое вектора следует сохранить в выделенных для этого ячейках и восстановить перед завершением программы (с помощью той же функции 25h). Для получения исходного содержимого вектора предусмотрена функция DOS 35h. Для ее вызова следует загрузить в AH номер функции - 35h, а в AL – тип вектора; двухсловное содержимое вектора возвращается в регистрах ES:BX.

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

text segment ‘code’intr proc . . . iretintr endpmain proc push CS ; Установим адресуемость pop DS ; к программному сегменту mov DX,offset intr ; DS:DX-> intr mov AX,25h ; функция заполнения

вектора mov AL,0Ah : тип вектора int 21h; Вектор прерывания инициализирован; далее текст основной программы . . .main enpd

Если пользователя не устраивают системные алгоритмы обработки какого=либо прерывания, он может заменить содержимое соответствующего обработчика и выполнять всю обработку прерываний собственными силами. В этом случае следует в начале основной программы сохранить (например, в двухсловной ячейке old_09) системное содержимое вектора прерывания, а в конце восстановить его:

Page 62: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

main proc; сохранение системного вектора в начале программы

mov AH,35h ; функция получения векторmov AL,09h ; номер вектораint 21hmov word ptr old_09,BX ; относительный адрес системного ; обработчика

mov word ptr old_09+2,ES ; сегмент системного обработчика . . .; восстановление системного вектора в конце программы

push DS ; сохраним наш DSlds DX,old_09 ; заполним DS:DX из old_09mov AH,25h ; функция заполнения вектораmov AL,09h ; номер вектораint 21hpop DS ; восстановим адресуемость. . .

main endp; поля данныхold_09 dd 0

Наконец, часто требуется лишь незначительно дополнить или изменить системный алгоритм. В этих случаях используется другой подход: программа пользователя “сцепляется” с системной программой обработки прерываний, выполняя свою часть обработки либо до, либо после системной. Такая методика сцепления годится и для аппаратных, и для системных прерываний и используется очень широко.

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

nem_int procpushfcall CS:old_int ; в системный обработчик с

возвратом. . . ; прикладная обработкаiret

new_int endpПосле того, как процессор выполнит процедуру прерывания, в стеке

прерванного процесса оказываются три слова: слово флагов, двухсловный адрес возврата в прерванную программу (рис.1.).

Page 63: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Рис. 1.Именно такая структура данных должна быть на верху стека, чтобы

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

Первая команда обработчика PUSHF засылает в стек еще раз слово флагов, а команда дальнего вызова процедуры CALL CS:old_int (где old_int - -двойное слово) в процессе передачи управления системному обработчику помещает в стек двухсловный адрес возврата на следующую команду прикладного обработчика. В результате в стеке формируется трехсловная структура, необходимая для команды IRET.

Системный обработчик, закончив обработку данного прерывания, завершается командой IRET. Эта команда забирает из стека три верхних слова и осуществляет переход по адресу CS2:IP2, т.е. на продолжение прикладного обработчика.

Завершающая команда обработчика IRET снимает со стека три верхних слова и передает управление по адресу CS1:IP1.

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

newint:; прикладная обработка . . . jmp CS:old_int

Завершающая команда перехода передает управление (не затрагивая стека) в системный обработчик, который далее работает обычным образом. Иногда прикладной обработчик должен выполнить некоторые действия до передачи управления в системный, а некоторые – после. Тогда используется следующая структура обработчика:

new_int proc . . . ; прикладная обработка до

системной pushf call CS:old_int ; в системный обработчик с

возвратом

Page 64: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

. . . ; прикладная обработка после системной

iretnew_int endp

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

new_int proc . . . ; анализ ситуации: если системная, обработка ; требуется jmp sys ; если системная обработка не требуется ; прикладная обработка . . . iretsys: jmp CS:old_intnew_itn endp

Обработка прерываний по <Ctrl>/C и <Ctrl>/<Break>Во многих вычислительных системах сочетание клавиш <Ctrl>/C

зарезервировано для принудительного завершения активной программы и передачи управления системе. Однако для этого нужно, чтобы DOS, обрабатывая прерывания от клавиатуры, постоянно анализировала бы поступающие коды и "вылавливала" код нажатия <Ctrl>/C (код ASCII 03h). MS-DOS проверяет наличие <Ctrl>/C во входном потоке не в программе обработки прерываний от клавиатуры, а на более высоком уровне, при выполнении программных запросов. При этом различные функции DOS по-разному реагируют на ввод с клавиатуры <Ctrl>/C.

Все функции DOS делятся на две группы - функции ввода-вывода с номерами 01h... 0Ch и все остальные функции, т.е. функции с номерами 00h, 0Dh...6Ch. Функции с номерами, превышающими 6Ch, используют расширители DOS, сетевые программы, инструментальные пакеты и другие "околосистемные" программы. Различие двух указанные групп заключается в том, что при вызове функций ввода-вывода DOS переходит на внутренний стек ввода-вывода, а при вызове всех остальных функций - на другой внутренний стек, который называется дисковым. Наличие в DOS двух внутренних стеков обеспечивает ее частичную реентерабельность, т.е. возможность при обнаружении ошибки в процессе выполнения какой-либо функции DOS (принадлежащей к "дисковой" группе) вызвать функции ввода-вывода для вывода на экран аварийного сообщения и ввода с клавиатуры указаний пользователя. Вопросы нереентерабельности DOS и методы ее преодоления будут рассмотрены в следующей главе.

Большая часть функций ввода вывода из диапазона 01h...0Ch проверяет перед своим выполнением наличие в кольцевом буфере клавиатуры кода 03 (<Ctrl>/C) и при обнаружении этого кода выполняют команду int 23h. В этом

Page 65: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

векторе обычно находится адрес программы DOS, завершающей текущий процесс. Исключение составляют функции 06h и 07h, не чувствительные к <Ctrl>/C, а также функции 02h и 09h, которые (во всяком случае, в MS-DOS версий 5.0, 6.0 и 6.2) анализируют кольцевой буфер на предмет наличия там <Ctrl>/C один раз на каждые 64 вызова. Проверка на <Ctrl>/C осуществляется независимо от перенаправления ввода-вывода, а также независимо от состояния системного флага BREAK.

"Дисковые" функции выполняют проверку на <Ctrl>/C лишь в том случае, если установлен флаг BREAK, т.е. была выполнена команда DOS

BREAK ONТаким образом, изменяя состояние BREAK, можно включать или

выключать механизм реакции на <Ctrl>/C большинства функций DOS. Заметим, что речь идет практически обо всех функциях DOS: файловых, получения или установки даты и времени, выделения и освобождения памяти, запуска и завершения задач и др.

Поскольку проверка на <Ctrl/C> осуществляется только при выполнении функций DOS, нажатием <Ctrl>/C в системе MS-DOS нельзя завершить чисто процессорную (вычислительную) задачу, а только такую, в которой имеются вызовы системных функций.

Однако и такая возможность часто оказывается чрезмерной. При завершении задачи по <Ctrl>/C могут остаться не восстановленными модифицированные векторы прерываний или неправильно закрыться открытые файлы. Поэтому большинство прикладных программ не использует системный обработчик <Ctrl>/C, заменяя его собственным. При выполнении такой операции необходимо иметь в виду, что вектор 23h, как, впрочем, и любой другой, принадлежит не конкретной задаче, а всей вычислительной системе. После завершения задачи необходимо восстановить исходное содержимое вектора, так как в противном случае ввод <Ctrl>/C при выполнении последующих задач неминуемо приведет к нарушению работы системы. Однако DOS при загрузке задачи в память копирует в определенные ячейки префикса программного сегмента содержимое векторов 22h (завершение задачи), 23h (обработка <Ctrl>/0 и 24h (обработка критической ошибки). Стандартная системная процедура завершения задачи включает в себя восстановление исходного содержимого указанных трех векторов, которое берется из префикса программного сегмента. Таким образом, даже если прикладная программа, модифицировав вектор 23h, не восстановила его, это сделает DOS в процессе завершения задачи.

В момент передачи управления через вектор 23h система находится в обычном стабильном состоянии, что позволяет использовать в обработчике любые функции DOS (например, функции вывода). При завершении обработчика командой IRET управление вернется в программу в той же точке, где она была прервана. Однако в программе обработчика можно предусмотреть переход в любое место программы без выполнения команды IRET, что позволяет организовывать переключения по ,<Ctrl>/C хода

Page 66: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

выполнения программы и, в частности, ее корректное завершение. Следует только иметь в виду, что нажатие <Ctrl>/C будет отрабатываться не немедленно, а лишь когда программа дойдет до выполнения какой-либо функции DOS. В программах с большим объемом вычислительной работы эта задержка может быть значительной.

На машинах типа IBM PC имеется вторая возможность вмешательства в ход выполнения программы - нажатие клавиш <Ctrl>/<Break>.

Системный обработчик прерывании от клавиатуры, входящий в состав BIOS, при обнаружении комбинации клавиш <Ctrl>/<Brcak> передает управление программе, адрес которой содержится в векторе 1Bh. Эта программа, также входящая в состав BIOS, состоит из единственной команды IRET и не выполняет, таким образом, никаких функций. Однако в процессе начальной загрузки операционной системы DOS изменяет содержимое вектора 1Bh, записывая в него адрес своего обработчика. Этот обработчик, получив управление, выполняет следующие действия:

- включает 0000h в кольцевой буфер клавиатуры на место головного символа;- модифицирует указатели кольцевого буфера так, что буфер

представляется системе очищенным;- записывает флаг <Clrl>/<Break> в ячейку области данных BIOS по

адресу 40h:71h;- записывает код <Ctrl>/C (03h) в буфер драйвера консоли CON, так что

драйвер "думает", что была нажата комбинация <Ctrl>/C.В результате, если после нажатия <Ctrl>/<Brcak> программа вызовет

какую-либо функцию DOS, выполняющую проверку на <Ctrl>/C, то DOS обнаружит наличие <Ctrl>/<Break> и передаст управление на вектор 23h точно также, как и при обнаружении <Ctrl>/C. -Таким образом, системная обработка <Ctrl>/<Break> и <Ctrl>/C в итоге выполняется почти одинаково. Особенность обработки <Ctrl>/C заключается в том, что если перед вводом <Ctrl>/C были нажаты какие-то клавиши и их коды остались в кольцевом буфере клавиатуры, они будут "маскировать" код <Ctrl>/C, так как драйвер консоли всегда анализирует только самый старый из символов, находящихся, в кольцевом буфере. С вводом <Ctrl>/<Brcak> ситуация иная. Программа DOS, обрабатывающая прерывание 1Bh, отправляет код 03h не в кольцевой буфер клавиатуры, а непосредственно в драйвер CON. Поэтому комбинацию <Ctrl>/<Break> нельзя замаскировать вводом символов с клавиатуры (к тому же, программа обработки <Ctrl>/<Break> очищает кольцевой буфер).

Прикладная программа может заменить содержимое вектора 1Bh адресом собственного обработчика. В этом случае при нажатии <Ctrl>/<Break> произойдет немедленный (через программу 1NT 09h и вектор 1Bh) переход на программу обработчика, который, таким образом, может взять на себя управление практически в любой точке программы, в том числе и при зацикливании или других чисто процессорных операциях. Однако такой обработчик работает на уровне прерываний, что ограничивает его возможности. В момент прерывания могли исполняться какие-то программы

Page 67: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

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

Исходное содержимое вектора 1Bh (в отличие от вектора 23h) нс восстанавливается системой автоматически при завершении программы. Поэтому в прикладной программе, перехватывающей прерывание по <Ctrl>/<Brcak>, необходимо предусмотреть перед ее завершением восстановление исходного содержимого этого вектора. Однако пользователь может завершить программу и аварийно, нажав <Ctrl>/C и обойдя, тем самым, строки нормального завершения. Поэтому в программе, пере-хватывающей вектор 1Bh, следует предусмотреть собственный обработчик прерывания по <Ctrl>/C, в котором перед завершением программы восстанавливается

Page 68: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Лекция № 12Резидентные программы

Основы организации резидентных программБольшой класс программ, обеспечивающих

функционирование вычислительной системы (драйверы устройств, оболочки DOS, программы шифрации и защиты данных, русификаторы, обслуживающие программы типа электронных блокнотов или калькуляторов и др.), должны постоянно находиться в памяти и мгновенно реагировать на запросы пользователя, или на какие-то события, происходящие в вычислительной системе. Такие программы носят названия программ, резидентных в памяти (Terminate and Stay Resident, TSR), или просто резидентных программ. Сделать резиденцией можно как программу типа .СОМ, так и программу типа .ЕХЕ, однако поскольку резидентная программа должна быть максимально компактной, чаще всего в качестве резидентной используют программы типа .СОМ.

Программы, предназначенные для загрузки и оставления в памяти, обычно состоят из двух частей (секций) - инициализирующей и рабочей (резидентной). В тексте программы резидентная секция размещается в начале, инициализирующая – за ней.

При первом вызове программы она загружается в память целиком и управление передается секции инициализации, которая заполняет или модифицирует векторы прерываний, настраивает программу на конкретные условия работы (возможно, исходя из параметров, переданных программе при ее вызов с помощью параметров командной строки) и с помощью прерывания DOS int 21h с функцией 31h завершает программу, оставляя в памяти се резидентную часть. Размер резидентной части программы (в параграфах) передастся DOS в регистре AН Указывать при этом сегментный адрес программы нет необходимости, так как он известен DOS. Для определения размера резидентной секции ее можно завершить предложением вида:

ressize=&-myproc

где myproc - смещение начала программы, а при вызове функции 31h в регистр DX заслать результат вычисления выражения (ressize+10Fh)/16.

Функция 31h, закрепив за резидентной программой необходимую для ее функционирования память, передает управление командному процессору СОММАМD.СОМ, и вычислительная система переходит, таким образом, и исходное состояние. Наличие программы, резидентной в памяти, никак не отражается на ходе вычислительного процесса за исключением того, что уменьшается объем свободной памяти. Одновременно может быть загружено несколько резидентных программ.

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

Page 69: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

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

программами в DOS предусмотрено мультиплексное прерывание 2Fh.Первый способ требует наличия в памяти текущей активной программы,

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

Второй способ, асинхронная активизация резидентной программы внешним прерыванием (от таймера, клавиатуры, последовательного порта или другого периферийного оборудования) широко используется системными и прикладными резидентными программами: спулерами принтеров, программами календарей-часов, русификаторами, калькуляторами, электронными блокнотами, резидентными электронными справочниками и базами данных и т.д.

Наконец, синхронная передача управления резидентной программе с помощью команды INT является основой взаимодействия с функциями DOS и BIOS и иногда используется в прикладных резидентных программах, в частности, при их отладке с помощью прерывания INT 3.

Рассмотрим типичную структуру резидентной программы и системные средства оставления ее в памяти. Как уже отмечалось, резидентные программы чаще всего пишутся в формате .COM:

text segment ‘code’ assume CS:text, DS:text org 100hmyproc proc far jmp init ; Переход на секцию инициалов

;Данные резидентной секции программы . . . entry: . . . ; Текст резидентной секции программы iretmyproc endpressize=equ=$-myproc ; Размер (в байтах) резидентной

секции ; программыinit proc ; Секция инициализации . . . mov DX,(ressize+10Fh)/16 ; Размер в параграфах mov AX,3100h ; Функция "завершить и оставить в

памяти" int 21hinit endptext ends end myproc

Page 70: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

При первом запуске программы с клавиатуры управление предается на начало процедуры myproc (первый байт префикса программного сегмента). Командой JMP осуществляется переход на секцию инициализации, в которой, в частности, подготавливаются условия для дальнейшей активизации программы уже в резидентном состоянии. Последними строками секции инициализации вызывается функция 31h, которая, выполняет завершение программы с оставлением в памяти указанной ее части. С целью экономии памяти секция инициализации располагается в конце программы и отбрасывается при ее завершении. •

Содержательная часть резидентной программы, начинающаяся с метки entry, активизируется, как уже отмечалось выше с помощью аппаратного или программного прерывания или командой CALL. В последнем случае программа резидентной стадии заканчивается командой RET (вместо IRET). На рис. 1 приведена типичная структура резидентной программы.

Как видно из рис.1, резидентная программа имеет по крайней мере две точки входа. После загрузки программы в память командой оператора, вводимой на командной строке управление передается в точку, указанную в поле завершающего текст программы оператора end (на рисунке – начало процедуры myproc). Для программ типа .СОМ эта точка должна соответствовать самой первой строке, программы, идущей вслед за префиксом программного сегмента. Поскольку при загрузке программы должна выполниться ее установка в памяти, первой командой программы всегда является команда перехода на секцию инициализации и установки (jmp init на рисунке).

Рис. 1. Структура резидентной программы.

После установки в памяти резидентная программа остается пассивной и никак не проявляет своего существования, пока не будет активизирована предусмотренным в ней для этого способом (аппаратным или программным прерыванием или командой дальнего вызова). Эта, вторая точка вызова обозначена на рисунке меткой entry.

Page 71: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Связь с резидентной программойДля обращения к резидентной программе из транзитной можно

использовать область межзадачных связей, являющуюся частью области данных BIOS и расположенную по адресам 40h:F0h...40h:FFh. Эта область не используется системой и предназначена специально для коммуникации программ пользователя. С помощью области межзадачных связей можно осу-ществлять как вызов резидентной программы, так и передачу параметров. Удобнее передавать не сами параметры, а их адреса; поскольку полный адрес занимает два слова, в области межзадачной связи помещается 4 адреса.

По ходу выполнения секции инициализации будущая резидентная программа помещает в обусловленные ячейки области межзадачной связи адрес своей точки входа, например, в слово 40h:FОh относительный адрес команды с меткой entry, а в слово 40h:F2h - содержимое сегментного регистра CS. Транзитная программа, желая передать управление резидентной, настраивает регистр ES на начало области данных BIOS и выполняет команду дальнего вызова

call dword ptr ES:OFOh

В этом случае резидентная программа должна быть объявлена, как дальняя процедура (myproc proc far) и завершаться командой RET дальнего возврата.

Если резидентной программе требуется передавать параметры, их начальный адрес (или, при необходимости, адрес целого списка адресов) заносится транзитной программой в другую обусловленную ячейку области межзадачной связи, например, двухсловную ячейку 40h:F4h. В этом случае резидентная программа переносит, например, в регистр SI относительный адрес параметра из ячейки 40h:F4h, а в регистр DS - сегментный адрес параметра из ячейки 40h:F6h и после этого забирает сами параметры командами типа

MOV AX,DS:[SI]mov BX,DS:[SI+2] и т.д.

Естественно, перед началом выполнения резидентная программа должна сохранить все используемые ею регистры (а перед завершением - восстановить их).

Более изящный метод передачи резидентной программе управления и параметров заключается в использовании свободных векторов, например, 60h...66h. В процессе инициализации резидентная программа помещает свой адрес в свободный вектор:

mov АХ.0 mov ES.AXmov ES:180h,offset entry ;Адрес вектора 60h MOV ES:182h,CS

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

Int 60h

В этом случае резидентная программа должна заканчиваться командой

Page 72: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

IRET. Адреса параметров можно передавать через другие свободные векторы, например, 61h или 62h. Естественно, по-прежнему можно воспользоваться областью межзадачных связей.

Если резидентная программа должна запускаться непосредственно с клавиатуры, адрес ее точки входа entry должен быть помещен в вектор прерываний от клавиатуры 09h. При этом, естественно, возникает проблема взаимодействия с системным обработчиком прерываний от клавиатуры (а также русификатором и остальным программами, перехватывающими прерывание 09h). Вопросы взаимодействия прикладных и системных обработчиков прерываний были рассмотрены в предыдущей главе.

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

Для взаимодействия с параллельными процессами и, в частности, с резидентными программами в системе MS-DOS предусмотрен стандартный интерфейс - прерывание 2Fh. Перед вызовом этого прерывания следует поместить в регистр АН номер функции, а в регистр AL - номер подфункции. Функции 00h.-.BFh зарезервированы за DOS (например, функция 0lh позволяет управлять процессом вывода файлов на печать с помощью системной программы PRINT.СОМ, а функция 02h дает возможность определить, загружена ли резидентная часть утилиты - расширения DOS ASSIGN); функции C0h...FFh зарезервированы для прикладных программ. Если с помощью прерывания 2Fh предполагается передача в резидентную программу или получение из нее большого количества параметров, можно использовать и другие регистры, например, DS:DX или DS:SI и передавать через них адреса списков параметров.

Согласно системным соглашениям прерывание 2Fh возвращает в регистре AL состояние резидентной программы:

AL=0 - программа не установлена (т.е. в памяти еще нет этой резидентной программы) и ее можно устанавливать;

AL=1 - программа не установлена и ее установить нельзя;AL=FFh - программа уже установлена и, следовательно, ее повторная

установка не требуется.В случае ошибки следует установить флаг CF, а в регистре АХ вернуть код

ошибки.Прерывание 2Fh используется прежде всего с целью исключить

повторную установку уже загруженной в память программы; иногда с помощью этого прерывания уже загруженной резидентной программе передается необходимая информация (например, приказ на выгрузку из памяти).

Для того, чтобы резидентная прикладная программа отзывалась на прерывание 2Fh, в нее следует включить прикладной обработчик одной или нескольких функций этого прерывания. Тогда вызов соответствующей

Page 73: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

функции этого прерывания в любой транзитной (или другой резидентной) программе позволит организовать взаимодействие с загруженной резидентной программой.

Рассмотрим структуру резидентной программы с обработчиком прерывания 2Fh. Закрепим за нашей программой функцию C0h этого прерывания.

;Секция инициализации;Сохраним адрес системного обработчика 2Fh, чтобы не лишать

себя ;возможности использовать системные функции этого прерывания init: mov AH,35h ;Функция получения вектора mov AL,2Fh ;Номер вектораInt 2fh mov word ptr old_ 2fh,BX ;Сохраним вектор 2Fh mov word ptr old_2fh+2,ES ;в ячейке old2fh ;Загрузим в вектор ZFh адрес нашего обработчика mov AH,25h ;Функция установки вектора mov AL,2Fh ;Номер вектора mov DX,offset new_2fh int 2lh ;Другие действия по инициализации;Завершим программу, оставив ее резидентной в памяти с помощью ;функции 31h прерывания DOS 2lh

;Резидентные поля данных

old_2fh dd 0 ;Ячейка для сохранения исходного ;содержимого вектора

2Fh ;Рабочая секция entry: . . . iret

;Наш обработчик прерывания 2Fh (функции C0h) new_2fh: CMP AH.0C0h ;Наша функция? je C0h ;Наша! jmp CS:old_2fh ;He наша, в системный обработчик

c0h:;Возможно, анализ AL и переходы на программы реализации подфункций:;передача или получение параметров, настройка резидентной программы, ;выгрузка ее из памяти и т.д.iret ;Возврат в вызвавшую программу

Page 74: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Лекция № 13Работа с файлами, каталогами и дисками

Основные характеристики файловой системы MS-DOSВ машинах типа IBM PC предусмотрены два уровня обращения к

магнитным дискам. При работе на нижнем уровне пользователь с помощью прерывания BIOS INT 13h обращается непосредственно к программам управления диска. Типичными операциями этого уровня являются запись или чтение сектора, позиционирование головок, форматирование дорожки. Файловая система DOS не используется; требуемая информация отыскивается не по имени файла, а по номерам поверхности, цилиндра и сектора.

Верхний уровень реализуется с помощью прерывания DOS INT 21h, поддерживающего, наряду с прочими, также и функции обслуживания файловой структуры. Программист работает не с программами управления физическим диском, а с файловой системой DOS, получая возможность оперировать такими понятиями файловой системы, как логический диск, каталог, файл.

Как известно, для удобства работы с большим количеством разнородных файлов в DOS используется древовидная структура каталогов. Каталог представляет собой файл обычно относительно небольшого размера, в котором содержится перечень всех подкаталогов следующего уровня и файлов, входящих в данный каталог. Каждому подкаталогу или файлу отводится одна запись размером 32 байт, в которую DOS заносит информацию о файле: имя, начальный адрес на диске (номер кластера), дата и время создания, длина в байтах, а также набор характеристик файла, называемых его атрибутами. Кроме записей, относящихся к нижележащим каталогам и файлам, каждый каталог содержит еще две записи: о себе самом и о родительском каталоге. Формат записи каталога (как корневого, так и любого подкаталога) приведен в табл. 4. 1.

Атрибут файла (в том числе файла каталога) хранятся в специально отведенном для них байте атрибутов и могут иметь значения, приведенные в табл. 4. 2.

Page 75: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Таблица 4. 1. Формат записи каталога.

Смещение Число байтов Содержимое00h 8 Имя файла в кодах ASCII

08h 3 Расширение имени файла в кодах ASCII

0Bh 1 Байт атрибутов файла

0Ch 10 Зарезервировано

16h 2 Время создания или последней модификации файла

18h 2 Дата создания или последней модификации файла

1Ah 2 Номер кластера, с которого начинается файл на диске

1Ch 4 Фактическая длина файла в байтах

Таблица 4. 2. Атрибуты файла.

Атрибут Назначение

01h Файл только для чтения. Модификация или удаление файла запрещаются

02h Скрытый файл (не "замечаемый" командой DIR и некоторыми функциями DOS)

04h Системный файл (обычно системными и заодно скрытыми объявляется файлы IO. SYS и MSDOS. SYS)

08h Запись о файле представляет собой метку тома. Такая запись (одна на весь том) может существовать только в корневом каталоге

10h Файл представляет собой каталог

20h Файл после создания или модификации не был архивирован и, следовательно, нуждается в архивации (атрибут архивации)

Файл может иметь несколько атрибутов одновременно. Так, для записи о метке тома характерно значение байта атрибутов 28: метка тома, не архивирована. Защищенный от стирания и модификации файл содержит в байте атрибутов число 21, а если к тому же он еще объявлен скрытым, то 23.

Время и дата создания файла помещаются в запись каталога после окончания работы программы с данным файлом и его закрытия. Формат этих полей приведен в табл. 4. 3 и 4. 4.

Page 76: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

Таблица 4. 3. Формат поля времени создания файла.Биты Назначение04... 00 Число двухсекундных интервалов в двоичной форме (от. 0 до 29, т. е. от 0 с до 58 с)10... 05 Число минут в двоичной форме (от 0 до 59)15... 11 Число часов в двоичной форме (от 0 до 23)

Таблица 4.4. Формат поля даты создания файла.Биты Назначение04... 00 День месяца (от 1 АО 31)

08... 05 Месяц (от 1 АО 12)

15... 09 Год относительно 1980

Номер кластера, с которого начинается файл, позволяет найти на диске начало файла; информация о его последующих кластерах содержится в таблице размещения фалов (FAT от File Allocation Table).

В последних четырех байтах записи каталога хранится длина файла в байтах. Если в процессе модификации размер файла увеличился, DOS изменяет значение данного поля.

При создании нового файла DOS сама отыскивает на диске свободное место и назначает его новому файлу, создавая и заполняя соответствующую этому файлу запись в каталоге. Хотя минимальной порцией информации, передаваемой контроллером диска в процессе записи или чтения файла, является сектор (512 байтов) (и программы BIOS работают как раз с секторами), файловая система назначает место на диске целыми кластерами. Размер кластера на гибком диске составляет обычно два сектора (1 Кбайт); на жестком диске в кластер могут входить 4-8 секторов. Таким образом, минимальный физический размер файла, даже если данные в нем занимают лишь несколько байтов, составляет один кластер. Однако в записи каталога указывается не физическая, а логическая длина файла, т. е. объем содержащихся в нем данных в байтах.

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

Существуют два способа выполнения операций с файлами: с использованием блоков управления файлами (FCB, File control block) и дескрипторов файлов (handle).

Блок управления файлами представляет собой 37-байтную таблицу, содержащую информацию о файле: имя и расширение файла, его размер,

Page 77: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

длину записей в файле, номер текущей записи и т.д. Эта таблица размещается в памяти, отводимой программе. Для выполнения какой-либо операции с файлом необходимо заполнить FCB соответствующей информацией (например, именем открываемого файла) и вызвать требуемую функцию.

Использование FCB было характерно для первых версий DOS (до 2.0). FCB-структуры и соответствующие функции DOS не поддерживают древовидных каталогов, и поэтому они могут работать только с файлами из текущего каталога текущего диска. С их помощью, естественно, нельзя создавать или удалять сами каталоги. В настоящее время функции типа FCB используются редко и в данном пособии рассматриваться не будут.

Другой способ операций с файлами предполагает использование] дескрипторов (файловых индексов, файловых описателей), которые в первом приближении можно рассматривать, как но'мера открытых файлов.

Процедура обращения к файлу в общем случае распадается на следующие операции:

создание файла с заданным именем в указанном каталоге или открытие файла, если он был создан ранее;

запись в файл или чтение из файла всего содержимого либо любой его части; закрытие файла.

В большинстве, случаев работа с файлом начинается с выполнения операции его открытия, для чего предусмотрена особая функция DOS. Открывая файл, DOS назначает ему очередной свободный элемент (блок описания файла) специальной системной таблицы, называемой таблицей открытых файлов (System File Table, SFT) и располагаемой в оперативной памяти среди системных областей данных. Объем этой таблицы, определяющий максимальное число файлов, с которыми можно работать одновременно, задается на этапе конфигурирования DOS директивой FILES файла CONFIG. SYS.

Найдя в системе каталогов диска запись об открываемом файле, DOS записывает в выделенный ему элемент SFT (блок описания файла) основные характеристики файла, такие как имя, длину, атрибуты, дату и время создания, стартовый кластер, физический адрес на диске записи каталога, содержащей информацию о файле и ряд других. Часть информации переписывается в элемент SFT из записи каталога, часть (например указатель на блок параметров диска, где хранится информация о физических характеристиках диска) DOS поставляет сама Важным элементом блока описания файла является двухсловная ячейка, в которой хранится указатель файла - номер байта относительно начала файла, с которого начнется очередная операция записи или чтения. Наличие указателя позволяет организовать прямой доступ к файлу, т.е. чтение или запись, начиная от любого места файла. Ссылку на номер выделенного файлу блока описания файла в SFT DOS возвращает в программу в виде дескриптора.

Обращение к открытому файлу (запись, чтение, изменение характеристик файла и т.д.) осуществляется по присвоенному ему дескриптору; неоткрытый файл дескриптора не имеет и система работать с

Page 78: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

ним не может. По мере выполнения операций с открытым файлом DOS модифицирует информацию в блоке SFT; содержимое SFT всегда отражает текущее состояние файла.

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

Буферы DOS, количество которых определяется директивой BUFFERS файла CONFIG.SYS, служат для ускорения работы с файлом. DOS, получив из выполняемой программы заказ на чтение некоторой порции данных из файла, находит и считывает соответствующие секторы диска (в которых, между прочим, данных может быть больше, чем конкретно затребовала программа) и, переслав прочитанные данные в программу, помимо этого сохраняет содержимое прочитанных секторов в своих внутренних буферах. Если программа в дальнейшем передаст DOS запрос на чтение с диска или запись на диск тех данных, которые уже находятся в буферах DOS, система выполнит затребованные операции не на диске, а лишь в буферах DOS, что на несколько порядков сократит время их выполнения. Однако в этом случае состояние файла на диске не всегда отвечает его логическому образу в программе. Сброс буферов DOS на диск в процессе закрытия файла выполняет физическое обновление файла на диске и приведение его в соответствие с логическим образом в программе.

Схожая ситуация складывается с характеристиками файла в записи каталога. Пока идет работа с файлом (например, добавление в него новых данных с увеличением его длины) информация о характеристиках файла обновляется только в блоке описания файла в SFT. Каталог на диске модифицируется лишь при закрытии файла, когда измененные характеристики файла переписываются из SFT в запись каталога.

Наконец, при закрытии файла освобождается выделенный ему блок описания файла вместе с дескриптором. И то, и другое можно теперь использовать для работы с другим файлом. Таким образом, система может последовательно работать с неограниченным количеством файлов, но число одновременно открытых файлов определяется объемом системной таблицы файлов.

При завершении программы (для этого предусмотрена функция DOS 4Ch) выполняется автоматическое закрытие всех открытых в программе файлов. Поэтому в простых и не слишком ответственных программах файлы можно явным образом не закрывать - они все равно будут закрыты системой. файловые функции DOS чтения и записи через дескрипторы характерны тем, что их можно использовать и для ввода-вывода через стандартные устройства компьютера. При этом для работы со стандартными устройствами DOS предоставляет пять предопределенных дескрипторов:

0 - стандартный ввод (CON);1 - стандартный вывод (CON);2 - стандартная ошибка (CON);

Page 79: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

3 - стандартный вспомогательный порт (AUX);4 - стандартный принтер (PRN). Таким образом, при работе с терминалом, принтером или

последовательным портом нет необходимости открывать новые дескрипторы; ввод с клавиатуры осуществляется через дескриптор 0, вывод на экран - через дескрипторы 1 или 2, вывод на принтер - через дескриптор 4. Различие дескрипторов 1 и 2 заключается в том, что стандартный вывод (как и стандартный ввод) можно перенаправить средствами DOS на любое устройство или в файл, а стандартная ошибка всегда связана с экраном. Обычно дескриптор 2 используют для вывода на экран аварийных или диагностических сообщений.

Перенаправление ввода или вывода программы осуществляет командный процессор COMMAND. COM. Если в программе PROG предусмотрен ввод данных с помощью какой-либо файловой функции через дескриптор стандартного ввода (0), и вывод данных через дескриптор стандартного ввода (1), то при обычном запуске программы командой

PROG. EXEпрограмма будет требовать входные данные с клавиатуры и выводить результаты своей работы на экран. Если, однако, в команде запуска программы использовать символ перенаправления

PROG. EXE > FILE. DATсистема сама создаст файл FILE. DAT, и весь вывод программы будет записан в этот файл. Ввод по-прежнему будет осуществляться с клавиатуры. Запуск программы командой

PROG. EXE < FILE. INIприведет к тому, что программа вместо обращения к клавиатуре попытается ввести всю требуемую ей информацию из файла FILE.INI. Естественно, этот файл должен быть заранее подготовлен пользователем. Вывод программы опять поступит на экран. Наконец, команда

PROG.EXE < FILE.INI > FILE.DATзаставит программу выполняться в режиме ввода информации из файла FILE.INI и вывода в файл FILE.DAT. Ни экран, ни клавиатура использоваться не будут. Следует подчеркнуть, что, сама программа ничего не знает об этих перенаправлениях -она во всех случаях обращается к стандартному устройству ввода для ввода информации и к стандартному устройству вывода для ее вывода. Однако DOS как бы подставляет ей на входе и выходе другие устройства.

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

1. Создание, открытие и закрытие файла:3Ch - создать файл;5Ah - создать временный файл;5Bh - создать новый файл;

Page 80: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

3Dh - открыть файл;3Eh - закрыть файл;68h - сбросить файл на диск;4 In - удалить файл.2. Запись и чтение данных:42h - установить указатель;3Fh - читать из файла или устройства;40h - записать в файл или устройство.3. Изменение характеристик файла:43h - получить или установить атрибуты файла;56h - переименовать файл;57h - получить или установить дату и время создания файла.4. Поиск файла:lAh - установить адрес области передачи данных (DTA);2Fh - получить адрес области передачи данных (DTA);4Eh - найти первый файл;4Fh - найти следующий файл.5. Операции над каталогами:39h - создать каталог;3Ah - удалить каталог;3Bh - сменить текущий каталог;47h - получить текущий каталог.6. Операции над дисками:19h - получить текущий диск;0Eh - сменить текущий диск; 36h - получить информацию о диске. Функции 3Ch и 5Bh позволяют создать файл с заданной

спецификацией. Спецификация файла, т.е. путь к нему вместе с именем файла и расширением указывается в виде символьной строки, завершающейся двоичным нулем ("строки ASCIIZ") Ад рес этой строки заносится в регистры DS.-DX. В регистре СХ задается код атрибутов создаваемого файла: 0 - отсутствие атрибутов, 1 - только для чтения, 2 - скрытый, 4 - систем ный, 8 - метка тома, 20h - атрибут архива. Таким образом, с помощью этих функций можно создать как "настоящий" файл, так и метку тома (в корневом каталоге диска). В регис тре АХ возвращается дескриптор созданного файла, которым можно в дальнейшем пользоваться для записи в файл или чте ния из него. Различие функций 3Ch и 5Bh проявляется лишь в случае, когда файл с заданной спецификацией уже существует. Функция 3Ch при этом фактически уничтожает имеющийся файл и создает новый с тем же именем, а функция 5Bh завершается с CF-1.

Фyнкция 5Ah используется для создания временного файла, имя которому (являющееся функцией текущего времени) дает система. В" регистрах DS:DX указывается адрес пути к файлу (не имени файла!) в виде строки ASCIIZ, в конце которой должны быть предусмотрены 13 пустых

Page 81: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

байтов, куда DOS поместит обратный слэш и имя создаваемого файла, завершаемое двоичным нулем. При необходимости файлу можно придать любые атрибуты (см. описание функций 3Ch и 5Bh) кроме атрибута метки тома. Обычно временные файлы удаляются перед завершением программы, причем забота об этом лежит на программисте (автоматически файл не удаляется). Для записи в созданный временный файл следует использовать дескриптор, возвращаемый функцией 5Ah в регистре АХ.

функция 3Dh позволяет открыть уже имеющийся файл. В регистрах DS:DX задается спецификация файла (путь и имя файла с расширением) в виде строки ASCIIZ; в регистре AL -режим доступа (0 - чтение, 1 - запись, 2 - чтение и запись). В дальнейшем запись в файл и чтение из него осуществляется с помощью дескриптора, возвращаемого функцией в регистре АХ.

Для каждого открытого файла DOS создает и поддерживает указатель, который представляет собой относительный номер байта в файле, начиная от которого будут выполняться запись или чтение данных. Указатель только что открытого или созданного файла позиционируется системой на начало файла, а функции чтения или записи смещают его на число прочитанных или записанных байтов. Таким образом, повторное использование функций чтения или записи реализует последовательный доступ к файлу. Для организации прямого доступа к произвольному месту файла предусмотрена функция 42h, позволяющая задать положение указателя относительно начала файла (для этого надо задать AL=0), конца файла (AL=2) или текущего положения указателя (AL=1). Само значение смещения указателя (со знаком) заносится в регистры СХ (старшая половина) и DX (младшая),

Функции 3Fh -и 40h используются для чтения из файла или устройства (функция 3Fh) и записи в файл или устройство (функция 40h). Перед вызовом функции в регистр ВХ помещается дескриптор, в регистр СХ - число читаемых или записываемых байтов, а в регистры DS:DX - адрес буфера в программе пользователя.

Иногда возникает необходимость найти в некотором каталоге все файлы, удовлетворяющие условиям шаблона групповой операции (например, все файлы с расширением .ТХТ или все файлы с именем EXAMPLE и любыми расширениями). Поиск файлов по заданным шаблонам групповых операций осуществляется с помощью функций 4Eh (найти первый файл) и 4Fh (найти следующий файл). Для их использования необходимо с помощью функции lAh организовать в программе область передачи данных (Disk transfer area, DTA) размером не менее 43 байтов, либо с помощью функции 2Fh получить адрес области передачи данных, созданной DOS. Известно, впрочем, что в качестве DTA DOS использует область PSP от байта 80h до конца. DOS помещает в DTA информацию о найденном файле (атрибуты, время и дата создания, размер и т.д.). В частности, в байтах lEh...2Ah DTA содержится имя и расширение файла в виде строки ASCIIZ .

При поиске файлов по заданному шаблону сначала активизируется функция 4Eh. В регистры DS:DX помещается адрес строки ASCIIZ с путем к

Page 82: Лекции СПОimg0.liveinternet.ru/images/attach/c/1//3740/3740340_Le…  · Web viewЛекция № 1. Введение. Системное ПО – это комплексы

рассматриваемому каталогу, а в регистр СХ - код комбинации атрибутов искомого файла. О обозначает "нормальный" файл, т.е. файл без атрибутов, 1 - только для чтения, 2 - скрытый, 4 - системный, 8 - метка тома, 10h - каталог, 20h - атрибут архивации. Если установлены атрибуты поиска, то ищутся как нормальные файлы, так и файлы с заданными атрибутами. В случае успешного нахождения заданного файла функция возвращает CF=0, а имя и расширение файла в виде строки ASCIIZ помещаются в DTA, в байты lEh...2Ah. Получив имя файла, можно открыть его с помощью функции 3Dh и выполнить далее требуемые операции (чтение, запись и т.д.).

Поиск следующих файлов, удовлетворяющих условиям заданного шаблона, осуществляется с помощью функции 4Fh которая используется так же, как и функция 4Eh поиска первого файла. При необходимости функцию 4Fh можно активизировать многократно, пока CF=1 не покажет, что все файлы, удовлетворяющие условиям заданного шаблона, исчерпаны.

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