информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаВсе любят медГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Google заблокировала 2 с лишним... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[ASM,dos]-динами4еская память 48-я fun 21h. 24.11.01 21:44  Число просмотров: 1023
Автор: 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
<programming>
[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: 0 s   Design: Vadim Derkach