Вы можете либо выделить статический буфер в исполняемом или динамически выделите буфер, предложенный Micheal. Чтобы статический выделить буфер 64K вы хотите сделать что-то вроде этого:
BITMAPBUF SEGMENT PARA PRIVATE
DB 0ffffh DUP (?)
BITMAPBUF ENDS
BITMAPBUF2 SEGMENT BYTE PRIVATE
DB ?
BITMAPBUF2 ENDS
BITMAPBUF2
сегмента является немного рубить, чтобы обойти тот факт, что версии TASM и TLINK я использую, кажется, не правильно отрегулируйте сегменты 64K. Поэтому я создаю два сегмента, которые компоновщик будет размещать рядом друг с другом.
Для выделения буфера динамически с помощью MS-DOS вы хотите код что-то вроде этого:
mov ah, 48h
mov bx, 1000h
int 21h
jc failed
mov [bitmapbuf_seg], ax
Обратите внимание, что если вы пытаетесь создать файл .COM оба этих метода подведет. Первый из них, поскольку файлы .COM не может быть больше 64K, а второй, поскольку исполняемые файлы .COM выделяют всю свободную память при их запуске (*), поэтому нет необходимости динамически распределять память. Вы можете решить более позднюю проблему, освободив неиспользуемую память перед использованием INT 21h/AH = 48h, но более простым решением является создание .EXE.
Вот пример кода, который копирует содержимое буфера кадра VGA в A000: 0000 в буфер. Раскомментируем одну из двух линий в начале depeding ли статически или динамически распределяемой буфер:
; mov ax, BITMAPBUF
; mov ax, [bitmapbuf_seg]
mov es, ax
xor di, di
mov ax, 0a000h
mov ds, ax
xor si, si
mov cx, 8000h
rep movsw
(*) на самом деле он выделяет наибольший свободный непрерывный блок памяти, но это обычно означает, что в значительной степени все обычные Память.
Вопрос отсутствует подробности. Как вы думаете, почему сегмент будет использоваться? В каком контексте вам нужен свободный сегмент? – m0skit0
Какая целевая ОС? Если это DOS, вы можете выделить память с помощью «INT 21h/AH = 48h». – Michael
@ m0skit0 я отредактировал мой вопрос –