Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[ASM,dos]-динами4еская память 48-я fun 21h. 24.11.01 18:49
Автор: kar Статус: Незарегистрированный пользователь
|
1?
пытаюсь выделить кусо4ек,на 4то поднимает сf и пихает 8 и 0 в ax и bx
соответственно.
по4ему?
2?
можно ли использовать динами4ескую память наподобее паса(heap)?
|
|
[ASM,dos]-динами4еская память 48-я fun 21h. 24.11.01 21:44
Автор: Chingachguk <Chingachguk> Статус: Member
|
> 1? > пытаюсь выделить кусо4ек,на 4то поднимает сf и пихает 8 и > 0 в ax и bx > соответственно. > по4ему?
При старте программы бывает так, что ей отводиться вся доступная перед
запуском память:
.286
NewProgramSize equ 5000h ; New Program Size = ~20 KBytes
NewStackOfs equ NewProgramSize - 0002h
text segment byte public
assume cs:text,ds:text
org 100h
begin:
; Счас вся память занята
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 - Освободим память, оставив кусок в NewProgramSize
mov sp,NewStackOfs ; Set new stack
mov bx,NewProgramSize shr 4
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
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: mov dx,offset ErrorMess
call Message
retn
Message proc near
mov ah,09h
int 21h
retn
Message endp
HexChar proc near
pusha
mov cx,4
mov bx,offset TabHex
@GetHex:rol ax,4
push ax
and al,0fh
xlat
stosb
pop ax
loop @GetHex
popa
retn
TabHex db '0123456789abcdef'
HexChar endp
ErrorMess db 'Error !',13,10,'$'
MemInfo db 'Free mem:0000h',13,10,'$'
text ends
end begin
|
| |
[ASM,dos]-нюанс. 25.11.01 01:12
Автор: kar Статус: Незарегистрированный пользователь
|
> .286 > NewProgramSize equ 5000h ; New Program Size = ~20 > KBytes > NewStackOfs equ NewProgramSize - 0002h > text segment byte public > assume cs:text,ds:text > org 100h > begin: > > ; Счас вся память занята > > 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 - Освободим память, оставив кусок в > NewProgramSize > mov sp,NewStackOfs ; Set new stack > mov bx,NewProgramSize shr 4 > 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 > 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 ....
если я все правильно понял, то для кома выделяется некий блок размером
во всю ост. память(dos) c на4алом сегмента es(или cs)?
{ее собственно и урезаете}
как-то странно?
|
| | |
[ASM,dos]-нюанс. 25.11.01 19:23
Автор: Chingachguk <Chingachguk> Статус: Member
|
> если я все правильно понял, то для кома выделяется некий > блок размером > во всю ост. память(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 Статус: Незарегистрированный пользователь
|
sm vyshe
|
|
[ASM,dos]-динами4еская память 48-я fun 21h. 24.11.01 21:07
Автор: :-) <:-)> Статус: Elderman
|
Ты ее из Паскаля вызываешь?
Наверное у тебя вся память отведена под 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 это вся (оставшаяся)свободная память.
так как?
|
| | | |
[ASM,dos]-4ерт,наврал 25.11.01 14:38
Автор: :-) <:-)> Статус: Elderman
|
> да да да сорри,прога на асме как вставка...скорее всего так > и полу4ается... > но из твоих слов выходит так,4то выделенные блоки находятся > вне heap?
Есть 2 хипа: ДОСовский и Паскалевский.
Ф-я 48h выделяет память из ДОСовского хипа.
Ф-ии New(), GetMem() выделяют память из Паскалеского хипа.
Паскалевский хип (его размер можно регулировать с помощью директивы $M) живет в памяти, кот-ю при запуске проги ДОС выделяет (с помощью ф-и 48h) в соответствии с полями MZ-заголовка e_minalloc и e_maxalloc.
Покопайся в исходных текстах Паскалевской RTL - там много интересного :-)
> ... а я думал,4то heap это вся (оставшаяся)свободная > память. > так как?
Если под Паскалевский хип отдана вся оставшаяся память директивой {$M 16384,0,655360} (это настройка компилятора по умолчанию), то так оно и есть.
|
|
|