Б 4 Получение от DOS значений переменных SwpSeg и GenSeg
Пример Б.4. Получение от DOS значений переменных SwpSeg и GenSeg
dosseg задаем расположение сегментов
.model small выбор модели памяти
.stack 200h задаем стековый сегмент
.data начало сегмента данных
wpOffs dw 0 смещение в буфере обмена
wpSeg dw 0 сегмент буфера обмена
enOffs dw 0 смещение в буфере
enSeg dw 0 сегмент буфера общего назначения
Далее располагаются другие данные, используемые в задаче
.code начало кодового сегмента
.386 набор команд процессора
tart: mov ax, @data ax = код сегмента данных
mov ds, ax ds = ax
mov ax, ss ax = код стекового сегмента
mov bx, es bx = код сегмента, содержащего PSP
sub ах, bx ах = ах — bx
mov bx, sp bx = размер стека в байтах
shr bx, 04 превращаем его в параграфы
add bx, ax bx = bx + ах, размер задачи
mov ax, 4AOOh код запроса на сокращение бЛока
int 2 In DOS сокращает блок задачи
mov bx, lOOOh bx = размер блока в параграфах
mov ax, 480Ch код запроса на выделение блока
int 21h обращение к DOS
mov SwpSeg, ax SwpSeg = код сегмента блока
mov bx, lOOOh bx = размер блока в параграфах
mov ax, 4800h код запроса на выделение блока
int 21h обращение к DOS
mov GenSeg, ax GenSeg = код сегмента блока
; Далее следует продолжение текста программы
END start конец текста программы
ервые две команды примера Б.4 записывают в регистр ds код сегмента шных, который в этом случае имеет имя Sdata. Следующие 6 команд формируют в регистре bx значение tasksize, затем происходит вызов функции OS 4дь для сокращения размера блока задачи. При выполнении этой ункции неиспользуемая память возвращается DOS, и теперь ее можно запрашивать для размещения дополнительных блоков.
В примере Б.4 сначала запрашивается место для размещения буфера обмена, затем буфера общего назначения. В обоих случаях в регистре bx указывает на размер блока в параграфах (юооь), а в регистре ah — код функции 48h iiocate memory) и происходит обращение к DOS. После возврата из DOS код выделенного сегмента сохраняется в переменных SwpSeg или GenSeg. В отличие от примера Б.З размер буфера общего назначения в данном случае ограничен величиной 65 536 байтов.
В примере Б.З перед вычислением значений переменных SwpSeg и GenSeg производилась проверка достаточности объема памяти для выполнения задачи. В данном случае распределением памяти занимается DOS, поэтому указанная проверка выполняется иначе.