информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetЗа кого нас держат?Spanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Tailscale окончательно забанила... 
 Прекращение работы антивируса Касперского... 
 Microsoft Authenticator теряет... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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} (это настройка компилятора по умолчанию), то так оно и есть.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach