2015-05-19 8 views
-1

Мне нужен свободный сегмент для сохранения данных, какие сегменты могут использовать бесплатно?ASM 8086 свободный сегмент

Я пытаюсь сохранить данные растрового изображения в памяти, размер растровых данных составляет 64 КБ, поэтому я хочу сохранить его в отдельном сегменте.

(я боюсь, что я перекроет на сегмент, который используется)

(DOS, ASM 8086, TASM он это уместность)

+1

Вопрос отсутствует подробности. Как вы думаете, почему сегмент будет использоваться? В каком контексте вам нужен свободный сегмент? – m0skit0

+1

Какая целевая ОС? Если это DOS, вы можете выделить память с помощью «INT 21h/AH = 48h». – Michael

+0

@ m0skit0 я отредактировал мой вопрос –

ответ

0

Вы можете либо выделить статический буфер в исполняемом или динамически выделите буфер, предложенный 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 

(*) на самом деле он выделяет наибольший свободный непрерывный блок памяти, но это обычно означает, что в значительной степени все обычные Память.

+0

Но чтение из фреймбуфера происходит очень медленно, потому что оптимизируется только сжатие записи в фреймбуфере. –

0

Если мы запустим исполняемый файл, то DOS предоставит ему весь свободный баран. Но мы не знаем, какой сегмент действительно свободен или нет. Поэтому, если мы хотим выделить некоторый баран, мы должны вернуть весь RAM, который нам не нужен, прежде чем мы сможем выделить его часть, чтобы убедиться, что сегменты не используются.

  call SETFREE    ; first we have to free the rest of RAM 
      mov  bx, 2000h   ; allocate 128 KB 
      call GETSPACE 
      jc ERROR 
      mov  [NEWSEG], ax  ; store segment address 

;------------------------------------ 
SETFREE: mov  bx, ss   ; calculating the amount of bytes 
      mov  ax, es   ; that our program is needed 
      sub  bx, ax   ; for the code, data and stacksize 
      mov  ax, sp   ; and free the rest 
      add  ax, 0Fh 
      shr  ax, 4 
      add  bx, ax 
      mov  ah, 4Ah 
      int 21h 
      ret 
;------------------------------------ 
GETSPACE: mov  ah, 48h 
      int 21h 
      ret