- •354000 «Прикладная информатика»
- •Idiv Деление целых знаковых чисел
- •Imul Умножение целых знаковых чисел
- •In Ввод из порта
- •Inc Инкремент (увеличение на 1)
- •Int Программное прерывание
- •I into Прерывание по переполнению
- •Iret Возврат из программы обработки прерывания
- •Xchg Обмен данными между операндами
- •Xlat Табличная трансляция
- •Xor Логическое исключающее или
- •Загрузка и выполнение программ
- •Составление программы на языке Assembler и её размещение в памяти компьютера. Стандартное распределение памяти под программные сегменты.
- •Оператор Текст
- •Имя Операнд_1 ;
- •Имя Операнд_1
- •Загрузка и выполнение программ
- •Mov dl,10 ;Позиция X
- •In Считать данные из порта.
- •Исследование команд, выполняемых процессором. Программирование операций с помощью отладчика языка Assembler..
- •Исследование операций с памятью компьютера. Программирование на языка Assembler в операционной системе ms-dos. Обычная память
- •Косвенная адресация
- •Адресация по базе со сдвигом
- •Косвенная адресация с масштабированием
- •Адресация по базе с индексированием
- •Программирование прерываний на языке Assembler в операционной системе ms-dos.
- •Исследование механизмов работа с видеопамятью персонального компьютера типа ibm. Тестирование и отладка ассемблерных программ.
Исследование операций с памятью компьютера. Программирование на языка Assembler в операционной системе ms-dos. Обычная память
До сих пор, если требовалось создать массив данных в памяти, мы просто обращались к памяти за концом программы, считая, что там имеется еще хотя бы 64 Кб свободной памяти. Разумеется, как и во всех операционных системах, в DOS есть средства управления распределением памяти - выделение блока (аналог стандартной функции языка С inalloc), изменение его размеров (аналог realloc) и освобождение (free).
Функция DOS 48h: Выделить память
Вход: АН = 48h
ВХ = размер блока в 16-байтных параграфах
Выход: CF = 0, если блок выделен
АХ = сегментный адрес выделенного блока
CF = 1, если произошла ошибка:
АХ =7 - блоки управления памятью разрушены
АХ = 8 - недостаточно памяти:
ВХ = размер максимального доступного блока
Эта функция с большим значением в ВХ (обычно 0FFFFh используется для определения размера самого большого доступного блока памяти.
Функция DOS 49h: Освободить память
Вход: АН = 49h
ES = сегментный адрес освобождаемого блока
Выход: CF = 0, если блок освобожден
CF = 1, АХ = 7, если блоки управления памятью разрушены;
АХ = 9, если в ES содержится неверный адрес
Эта функция не позволит освободить блок памяти, которым текущая программа не владеет, но с помощью функции DOS 50h (AX = 50h, ВХ = сегментный адрес PSP процесса) программа может «притвориться» любым другим процессом.
Функция DOS 4Ah: Изменить размер блока памяти
Вход: АН = 4Ah
ВХ = новый размер в 16-баитных параграфах
ES = сегментный адрес модифицируемого блока
Выход:CF = 1, если при выполнении операции произошла ошибка
АХ = 7, если блоки управления памятью разрушены
АХ = 8, если не хватает намят (при увеличении)
АХ = 9, если ES содержит неверный адрес
ВХ = максимальный размер, доступный для этого блока
Если для увеличения блока не хватило памяти, DOS расширяет его до возможного предела.
При запуске СОМ-программы загрузчик DOS выделяет самый большой доступный блок памяти для этой программы, так что при работе с основной памятью эти функции требуются редко (в основном для того, чтобы сократить выделенный программе блок памяти до минимума перед загрузкой другой программы), но уже в MS DOS 5.0 и далее с помощью этих же функций можно выделять память в областях UMB - неиспользуемых участках памяти выше 640 Кб н ниже 1 Мб, для чего требуется сначала подключить UMB к менеджеру памяти н изменить стратегию выделения памяти с помощью функции DOS 58h.
Область памяти НМА
Область памяти от 0FFFFh:0010h (конец первого мегабайта) до 0FFFFh:0FFFFh (конец адресного пространства в реальном режиме), 65520 байт, может использоваться на компьютерах, начиная с 80286. Доступ к этой области осуществляется с помощью спецификации XMS, причем вся она выделяется целиком одной программе. Обычно, если загружен драйвер HIMEM.SYS и если в файле CONFIG.SYS присутствует строка DOS = HIGH, DOS занимает эту область, освобождая почти 64 Кб в основной памяти. При этом ОС может оставить небольшой участок НМА (16 Кб или меньше) для пользовательских программ, которые обращаются к нему с помощью недокументированной функции мультиплексора 4Ah.
Следует помнить, что область НМА доступна для программ только в том случае, когда адресная линия процессора А20 разблокирована. Если DOS нe занимает НМА, она практически постоянно заблокирована на совместимость с программами, написанными для процессора 8086/8088, которые считают, что адреса 0FFFFh:0010h - 0FFFFh:0FFFFh всегда совпадают с 0000h :0000h - 0000h:0FFEFh. Функции XMS 01-07 позволяют управлять состоянием этой адресной линии.
Интерфейс ЕМS
Расширенная память (EMS) - дополнительная возможность для программ, запускающихся в реальном режиме (или в режиме V86), обращаться к памяти, которая находится за пределами первого мегабайта. EMS позволяет отобразить сегмент памяти, начинающийся обычно с 0D000h, на любые участки памяти, аналогично тому, как осуществляется доступ к видеопамяти в SVGA-режимах. Вызывать функции EMS (прерывание 67h) разрешается, только если в системе присутствует драйвер с именем ЕММХХХХ0. Для проверки его существования можно, например, вызвать функцию 3Dh (открыть файл или устройство). Причем на тот случай, если драйвер EMS отсутствует, а в текущей директории есть файл с именем ЕММХХХХО, следует дополнительно вызвать функцию IOCTL -INT 21h с AX = 4400h и ВХ = идентификатор файла или устройства, полученный от функции 3Dh. Если значение бита 7 в DX после вызова этой функции равно 1, то драйвер EMS наверняка присутствует в системе.
Основные функции EMS:
Спецификация EMS была разработана для компьютеров IBM XT, снабжавшихся особой платой, на которой и находилась расширенная память. С появлением процессора 80286 стало возможным устанавливать больше одного мегабайта памяти на материнской плате, и для работы с ней была введена новая спецификация - XMS. Тогда же были созданы менеджеры памяти, эмулировавшие EMS поверх XMS, для совместимости со старыми программами, причем работа через EMS выполнялась медленнее. Позже, когда в процессорах Intel появился механизм страничной адресации, выяснилось, что теперь уже EMS можно реализовать гораздо быстрее XMS. Большинство программ для DOS, которым требуется дополнительная память, поддерживают обе спецификации.
Интерфейс XMS
Спецификация доступа к дополнительной памяти (XMS) - еще один метод, позволяющий программам, запускающимся под управлением DOS в реальном режиме (или в режиме V86), использовать память, расположенную выше границы первого мегабайта.
Способы адресации
Большинство команд процессора вызываются с аргументами, которые в ассемблере принято называть операндами. Например: команда сложения содержимого регистра с числом требует задания двух операндов - содержимого регистра и числа. Далее рассмотрены все существующие способы задания адреса хранения операндов - способы адресации.
Регистровая адресация
Операнды могут располагаться в любых регистрах общего назначения и сегментных регистрах. Для этого в тексте программы указывается название соответствующего регистра, например: команда, копирующая в регистр АХ содержимое регистра ВХ, записывается как
mov ax,bx
Непосредственная адресация
Некоторые команды (все арифметические, кроме деления) позволяют указывать один из операндов непосредственно в тексте программы. Например:
команда
mov ах,2
помещает в регистр АХ число 2.
Прямая адресация
Если у операнда, располагающегося в памяти, известен адрес, то его можно использовать. Если операнд - слово, находящееся в сегменте, на который указывает ES, со смещением от начала сегмента 0001, то команда
mov ax,es:0001
поместит это слово в регистр АХ. В реальных программах для задания статических переменных обычно используют директивы определения данных, которые позволяют ссылаться на статические переменные не по адресу, а по имени. Тогда, если в сегменте, указанном в ES, была описана переменная word_var размером в слово, можно записать ту же команду как
mov ax,es:word_var
В таком случае ассемблер сам заменит слово word_var на соответствующий адрес. Если селектор сегмента данных находится в DS, то имя сегментного регистра при прямой адресации можно не указывать, DS используется по умолчанию. Прямая адресация иногда называется адресацией по смещению.
Адресация отличается для реального и защищенного режимов. В реальном (так же как и в режиме V86) смещение всегда 16-битное. Это значит, что ни непосредственно указанное смещение, ни результат сложения содержимого разных регистров в более сложных методах адресации не могут превышать границ слова. При работе в Windows, DOS4G, PMODE и в других ситуациях, когда программа будет запускаться в защищенном режиме, смещение не должно превышать границ двойного слова.