Функция 0BH. Функция 0CH. Функция 48H. ; есть символ для ввода . MOV ES, BX ; сегмент блока памяти находится в BX
Функция 0BH Назначение: проверка готовности символа для ввода с клавиатуры. После вызова функции регистр AL содержит 0, если нет очередного символа для ввода с клавиатуры и 0FFH, если имеется очередной символ для ввода с клавиатуры. Пример использования функции 0BH: MOV AH, 0BH INT 21H CMP AL, 0 JE M1 . . . ; есть символ для ввода M1: . . . ; нет символа для ввода
Функция 0CH Назначение: очистка буфера клавиатуры и вызов другой DOS функции ввода. Функция 0CH очищает буфер клавиатуры и вызывает какую-либо из описанных функций ввода с клавиатуры (01H, 06H, 07H, 0AH), номер которой помещен в регистре AL. Пример использования функции 0BH: MOV AH, 0CH MOV AH, 01H ; функция ввода символа INT 21H
Блок памяти в MS-DOS представляет собой структуру данных, состоящую из заголовка и собственно, самого блока памяти, доступного для использования. Заголовок имеет размер 16 байт и определяет размер блока памяти, какому процессу он принадлежит, а также содержит некоторую дополнительную информацию. Для некоторых функций управления памятью требуется указать блок памяти. Блок памяти указывается своим сегментом, т. е. тем сегментом, начиная с которого располагается сам блок памяти, а не заголовок. Все блоки памяти располагаются по нулевому смещению относительно своего сегмента. Размер блока памяти указывается в параграфах и может превышать 64 Кб.
Функция 48H Назначение: выделение блока памяти из пространства доступной памяти DOS. Для выполнения функции в регистр BX заносится размер блока памяти (в параграфах), который необходимо выделить. После вызова функции, если установлен флаг CF, то выделить блок памяти не удалось и регистр BX содержит объем доступной памяти в параграфах. Регистр AX в этом случае содержит код ошибки. Если флаг CF сброшен, то выделение блока памяти прошло успешно и регистр AX содержит сегментный адрес выделенного блока памяти.
Чтобы определить максимально возможный объем блока памяти, нужно в регистр BX занести значение 0FFFFH и вызвать функцию 48H. Блок памяти такого большого объема (65535 параграфов) выделен, конечно, не будет, но регистр BX после вызова функции будет содержать максимально возможный объем блока памяти, который можно выделить. При использовании функции 48H в программе следует обратить внимание на то, что перед передачей управления программе операционная система MS-DOS уже выделяет для нее наибольший возможный блок памяти, который начинается с сегмента префикса программного сегмента. Поэтому в исходном состоянии функцией 48H не удастся выделить блок памяти независимо от его размера. Для решения этой проблемы следует воспользоваться функцией 4AH для изменения размера блока памяти. Пример использования функции 48H: MOV AH, 48H MOV BX, 0100H ; размер блока 256 параграфов INT 21H JC M1 . . . ; блок памяти выделен M1: . . . ; произошла ошибка и блок памяти выделить не удалось Функция 49H Назначение: освобождение ранее выделенного блока памяти. Сегмент выделенного блока памяти указывается в регистре ES. После вызова функции, если произошла ошибка, устанавливается флаг CF, а регистр AX содержит код ошибки. Если блок памяти успешно освобожден, флаг CF сброшен. Функцией 49H можно освобождать только те блоки памяти, которые принадлежат текущей программе – это блок памяти, в котором располагается сама программа и блоки памяти, ранее выделенные программой. Пример использования функции 49H: MOV AH, 49H MOV ES, BX ; сегмент блока памяти находится в BX
INT 21H JC M1 . . . ; блок памяти освобожден M1: . . . ; произошла ошибка и блок памяти ; освободить не удалось
Функция 4AH Назначение: изменение размера ранее выделенного блока памяти. Сегмент выделенного блока памяти указывается в регистре ES. В регистре BX указывается новый объем блока памяти. После вызова функции, если установлен флаг CF, то изменить размер блока памяти не удалось и регистр BX содержит объем доступной памяти в параграфах. Регистр AX в этом случае содержит код ошибки. Если флаг CF сброшен, то изменение размера блока памяти прошло успешно. Причиной ошибки часто бывает ситуация, когда размер блока памяти изменяется в большую сторону и для этого не достаточно памяти. Использование функции 4AH полезно, когда программе требуется выделить блок памяти. Дело в том, что операционная система, перед тем как передать управление программе, выделяет для программы всю доступную память и программа уже не может выделять блоки памяти, не изменив размер блока памяти, выделенного для программы. Чтобы изменить размер блока памяти, выделенного для программы необходимо узнать сегмент префикса программного сегмента, который будет совпадать с сегментом блока памяти программы. Для COM программ сегмент префикса программного сегмента является значением регистра CS. Для EXE программ получить сегмент префикса программного сегмента можно используя функцию DOS 51H (см. далее). При изменении размера блока памяти, выделенного под программу типа COM, следует учесть, что стек программы располагается в конце сегмента COM программы, начиная со смещения 65535 и ниже. Если предполагается, что новый размер блока памяти меньше 64 Кб, необходимо каким-либо образом «сдвинуть» стек вниз. Это можно сделать вычитанием из регистра SP требуемого значения. Пример использования функции 4AH для изменения размера блока памяти, выделенного для COM программы до 64 Кб: CODE SEGMENT ASSUME CS: CODE ORG 100H Start: MOV AH, 4AH PUSH CS POP ES ; в ES – сегмент блока памяти MOV BX, 1000H ; новый размер – 64 Кб INT 21H . . . CODE ENDS END Start
Функции управления процессами позволяют запускать и завершать программы, а также выполнять некоторые операции с префиксом программного сегмента. Наиболее сложной является функция 4BH, которая позволяет не только запускать программы, но и загружать оверлеи, а также загружать программы без их запуска.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|