Программирование на Ассемблере
Функция AllocMem имеет еще и второй параметр (указывается в D1), который
определяет режим резервирования (тип выделяемой памяти). Приведем некоторые
возможные значения D1: D1 Название Режим резервирования
----------------------------------------------------------------
$0 MEMF_ANY Выделить память любого типа
$2 MEMF_CHIP Выделить CHIP-память
$4 MEMF_FAST Выделить FAST-память
$10000 MEMF_CLEAR Очистить память после выделения Рассмотрим пример: ExecBase = 4 ;(6.3.1A)
AllocMem = -$C6 ...
move.l #number,D0 ;количество байт для резервирования
move.l #mode,D1 ;режим резервирования в D1
move.l ExecBase,A6 ;базовый адрес EXEC
jsr AllocMem(A6) ;захватить память
move.l D0,address ;сохранить адрес выделенной области
beq.s error ;ошибка?
... Другой способ резервирования памяти состоит в использовании функции
AllocAbs (смещение -$CC) вместо AllocMem. Эта функция служит для захвата
конкретной области памяти, адрес которой указывается в регистре A1, а
размер - в D0. AllocAbs возвращает ноль (в D0), если заданная область
памяти не может быть выделена (например, если эта область уже используется
какой-либо задачей). ExecBase = 4 ;(6.3.1B)
AllocAbs = -$CC ...
move.l #number,D0 ;количество байт для резервирования
lea address,A1 ;требуемый адрес блока памяти
move.l ExecBase,A6 ;базовый адрес EXEC
jsr AllocAbs(A6) ;попытка резервирования блока памяти
tst.l D0 ;все ОК?
beq.s error ;ошибка!
... Когда память больше не нужна, ее необходимо \"отдать\" системе обратно. Это
можно сделать с помощью функции FreeMem (смещение -$D2).
Параметры у этой функции точно такие же, как и у AllocAbs (A1 - адрес
освобождаемого блока памяти, D0 - его размер).
|