> > Ты ее из Паскаля вызываешь? > > Наверное у тебя вся память отведена под heap, отсюда и > > ошибка 8 (Insufficient memory) > > Чтобы пользоваться этой ф-й, надо сократить heap в > > настройках компилятора или поставить в начало проги > > например {$M 16384,0,65536} > > Здесь 65536 - размер хипа, если хип вообще не нужен, > можно > > {$M 16384, 0, 0} > > Ызвиняюсь, 4то не уто4ил: > ...в 4ем прикол,4то прога на асме!? (bx=0 ???) > (а разве эта fun выделяет память в heap'e?если нет,то > можно ли сделать > 4то-то наподобие?)
да да да сорри,прога на асме как вставка...скорее всего так и полу4ается...
но из твоих слов выходит так,4то выделенные блоки находятся вне heap?
... а я думал,4то heap это вся (оставшаяся)свободная память.
так как?
> если я все правильно понял, то для кома выделяется некий > блок размером > во всю ост. память(dos) c на4алом сегмента es(или cs)? > {ее собственно и урезаете} > как-то странно?
Ну да, при старте проге отдается ВСЯ свободная на тот
момент память.
А чего стрнанного ? Вот, допустим, началась программа:
begin:
; Счас вся память занята
call ShowMem ; Show free mem size
; И ты увидишь, что свободной памяти счас нет.
; Free memory - Освободим память, оставив кусок в
; NewProgramSize
mov sp,NewStackOfs ; Set new stack
mov bx,NewProgramSize shr 4
mov ah,4ah
; Действительно, в es:bx будет сказано,
; что память с сегмента es будет теперь иметь другой размер -
; - NewProgramSize
int 21h ; Set new program size
jnc @MemFree
call @Error
jmp @GoDos
@MemFree:
call ShowMem ; Show free mem size
; А вот счас увидишь, что памяти станет резко больше !
[ASM,dos]-нюанс.25.11.01 20:26 Автор: kar Статус: Незарегистрированный пользователь
"mov bx,NewProgramSize shr 4
mov ah,4ah
int 21h ; Set new program size
"
здесь es выступает как "сегмент распределенного блока памяти
" (у тебя он указывает на на4ало сег.кома)
,а на 4то его бросать в exe-файлах, 4то бы сжать(освободить) память?
[ASM,dos]-exe and mem.26.11.01 22:30 Автор: Chingachguk <Chingachguk> Статус: Member Отредактировано 26.11.01 22:34 Количество правок: 1
> "mov bx,NewProgramSize shr 4 > mov ah,4ah > int 21h ; Set new program size > " > здесь es выступает как "сегмент распределенного блока > памяти > " (у тебя он указывает на на4ало сег.кома) > ,а на 4то его бросать в exe-файлах, 4то бы > сжать(освободить) память?
Уфф !... Никогда вот не баловался экзешниками...
Так вот - нижеследующая программа - экзешник -
освобождает себе память.
Сначала я думал, что в es писать сегмент последнего сегмента -
- это у меня сегмент стека MyStack.
Оказалось, нет - нужен сегмент PSP - он в ES по умолчанию сидит.
Почему так ? Я вспомнил, как резидент память свою освобождает -
- видимо, дос из PSP берет инфо о программе, которая ей нужна
для освобождения ...
.286
StackSize equ 128
DataSeg Segment Para 'data'
MyMessage db 'Hello from EXE !!!',13,10,'$'
ErrorMess db 'Error !',13,10,'$'
MemInfo db 'Free mem:0000h',13,10,'$'
TabHex db '0123456789abcdef'
DataSeg Ends
CodeSeg segment Para 'code'
assume cs:CodeSeg,ds:DataSeg,ss:MyStack
My_Pr proc
Main:
mov ax,DataSeg
mov ds,ax
mov dx,offset MyMessage
mov ah,09h
int 21h
call far ptr Stop
call far ptr Far_Pr
; Check for size of Memory
mov ax,DataSeg
mov ds,ax
call ShowMem ; Show free mem size
mov ah,48h
mov bx,0100h
int 21h ; Try to allocate 1000h bytes
jnc @NoError
call @Error ; Error message
@NoError:
; Free memory
mov bx,seg MyStack
add bx,(StackSize shr 4) + 1
mov ah,4ah
int 21h ; Set new program size
jnc @MemFree
call @Error
jmp @GoDos
@MemFree:
call ShowMem ; Show free mem size
; Try again to allocate 1000h bytes
mov ah,48h
mov bx,0100h
int 21h ; Try to allocate 1000h bytes attempt 2
jnc @NoErrorFinal
call @Error ; Error message
@NoErrorFinal:
call ShowMem ; Show free mem size
@GoDos: mov ax,4c00h
int 21h
My_Pr endp
ShowMem proc near
mov ah,48h
mov bx,0ffffh
int 21h ; Try to allocate ffffh bytes
; Error !
mov ax,bx ; Free mem size
mov di,offset MemInfo + 9
call HexChar
mov dx,offset MemInfo
call Message
retn
ShowMem endp
@Error proc near
mov dx,offset ErrorMess
call Message
retn
@Error endp
Message proc near
mov ah,09h
int 21h
retn
Message endp
HexChar proc near
pusha
push es
push ds
pop es
mov cx,4
mov bx,offset TabHex
cld
@GetHex:rol ax,4
push ax
and al,0fh
xlat
stosb
pop ax
loop @GetHex
pop es
popa
retn
HexChar endp
CodeSeg Ends
DataSec Segment Para 'data'
SecMess db 'Called from Sec Segment !!!',13,10,'$'
DataSec Ends
SecSeg segment Para 'code'
assume cs:SecSeg,ds:DataSec,ss:MyStack
Far_Pr proc far
push ds
mov ax,DataSec
mov ds,ax
mov dx,offset SecMess
mov ah,09h
int 21h
call far ptr Stop
pop ds
ret
Far_Pr endp
SecSeg Ends
ThrSeg segment Para 'code'
assume cs:ThrSeg,ds:ThrSeg,ss:MyStack
Stop proc far
pusha
xor ah,ah
int 16h
popa
ret
Stop endp
ThrSeg Ends
MyStack Segment Para stack 'stack'
db StackSize dup(?)
MyStack Ends
End Main
-thank$ all.27.11.01 00:10 Автор: kar Статус: Незарегистрированный пользователь
Ты ее из Паскаля вызываешь?
Наверное у тебя вся память отведена под heap, отсюда и ошибка 8 (Insufficient memory)
Чтобы пользоваться этой ф-й, надо сократить heap в настройках компилятора или поставить в начало проги например {$M 16384,0,65536}
Здесь 65536 - размер хипа, если хип вообще не нужен, можно {$M 16384, 0, 0}
[ASM,dos]-динами4еская память 48-я fun 21h.24.11.01 23:18 Автор: kar Статус: Незарегистрированный пользователь
> Ты ее из Паскаля вызываешь? > Наверное у тебя вся память отведена под heap, отсюда и > ошибка 8 (Insufficient memory) > Чтобы пользоваться этой ф-й, надо сократить heap в > настройках компилятора или поставить в начало проги > например {$M 16384,0,65536} > Здесь 65536 - размер хипа, если хип вообще не нужен, можно > {$M 16384, 0, 0}
Ызвиняюсь, 4то не уто4ил:
...в 4ем прикол,4то прога на асме!? (bx=0 ???)
(а разве эта fun выделяет память в heap'e?если нет,то можно ли сделать
4то-то наподобие?)
[ASM,dos]-4ерт,наврал24.11.01 23:30 Автор: kar Статус: Незарегистрированный пользователь
> > Ты ее из Паскаля вызываешь? > > Наверное у тебя вся память отведена под heap, отсюда и > > ошибка 8 (Insufficient memory) > > Чтобы пользоваться этой ф-й, надо сократить heap в > > настройках компилятора или поставить в начало проги > > например {$M 16384,0,65536} > > Здесь 65536 - размер хипа, если хип вообще не нужен, > можно > > {$M 16384, 0, 0} > > Ызвиняюсь, 4то не уто4ил: > ...в 4ем прикол,4то прога на асме!? (bx=0 ???) > (а разве эта fun выделяет память в heap'e?если нет,то > можно ли сделать > 4то-то наподобие?)
да да да сорри,прога на асме как вставка...скорее всего так и полу4ается...
но из твоих слов выходит так,4то выделенные блоки находятся вне heap?
... а я думал,4то heap это вся (оставшаяся)свободная память.
так как?
> да да да сорри,прога на асме как вставка...скорее всего так > и полу4ается... > но из твоих слов выходит так,4то выделенные блоки находятся > вне heap?
Есть 2 хипа: ДОСовский и Паскалевский.
Ф-я 48h выделяет память из ДОСовского хипа.
Ф-ии New(), GetMem() выделяют память из Паскалеского хипа.
Паскалевский хип (его размер можно регулировать с помощью директивы $M) живет в памяти, кот-ю при запуске проги ДОС выделяет (с помощью ф-и 48h) в соответствии с полями MZ-заголовка e_minalloc и e_maxalloc.
Покопайся в исходных текстах Паскалевской RTL - там много интересного :-)
> ... а я думал,4то heap это вся (оставшаяся)свободная > память. > так как?
Если под Паскалевский хип отдана вся оставшаяся память директивой {$M 16384,0,655360} (это настройка компилятора по умолчанию), то так оно и есть.