· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Динамическая память

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Мар 23, 2003 21:34:40

Какая ассемблерная конструкция выделяет место под динамическую переменную? Ну в Паскале например :
a: ^dword;
New(a);
Как в асме?


Дата: Мар 24, 2003 04:16:17 · Поправил: P2M

Как в асме?
Воспользуйтесь функциями для работы с памятью, которые предоставляет ОС.
Под какую ОС пишите?


Дата: Мар 24, 2003 15:39:35

Под win98. Вообще говоря я не пишу, а скорее "ищу" эти конструкции в другой (написаной не мной, и похоже на C++) программе. Предполагаю, что это делает некая функция.


Дата: Мар 24, 2003 17:16:05

Динамические объекты обычно создаются в куче - GetProcessHeap -> HeapAlloc -> HeapFree и т.п.


Дата: Мар 24, 2003 19:42:12

Как узнать расположение кучи ?


Дата: Мар 25, 2003 11:07:09

GetProcessHeap дает стандартную кучу процесса, которую система создает. А все кучи (если > 1), насколько я помню GetProcessHeaps. См. доку - там все прописано.


Дата: Мар 25, 2003 17:36:29

tnks!


Дата: Мар 31, 2003 11:55:57

до 4 кб
mov KudaNibudь, ebp
add esp, -1ffh
...
получаешь дыру в стеке, но учти процессу дается 4кб памяти для стека - превышать нельзя !
до 64 кб
1. GlobalAlloc
2. GlobalLock
3. GlobalUnlock
4. GlobalFree

Свыше 64 кб.
1. HeapCreate
2. HeapLock
3. HeapAlloc
.....
4. и вообще я не гуру, но читайте API


Дата: Мар 31, 2003 12:51:12

[ Аноним: ...но учти процессу дается 4кб памяти для стека - превышать нельзя ! ]

По умолчанию для стека резервируется 1Мб, выделяется действительно по одной странице (4Кб).
Но это совсем не значит, что эту границу нельзя перейти. Снизу, под выделенной памятью всегда болтается еще одна "сторожевая" страница. Если к ней обратиться, то обработчик SEH выделит еще одну страницу, а "сторожеую" переместит вниз. Если же обратиться за "сторожевую", вот только тогда будет кирдык. Все компиляторы ЯВУ, если обьявляется локальная переменная размером >4Кб, генерят дополнительный код, который обращается к "сторожевой" странице, что заставляет систему выделить доп. память. И так пока не выделится достаточно под локальную переменную.

Все Global* и Local* функции являются устаревшими и ими лучше не пользоваться.


Дата: Апр 4, 2003 18:54:11

Вопрос по функции GetProcessHeaps. Какие ее параметры? Не могу понять, что за хэндл там (второй кажись параметр)...:(


Дата: Апр 4, 2003 19:46:36

---
HANDLE arrHandles [256];
DWORD dwHowMany = GetProcessHeaps (256, arrHandles);
---
Только надо на ASM перевести.


Дата: Апр 4, 2003 23:47:33

Спасибо, переведите пожалуйста на паскаль. Просто под рукой нет учебника по си (это на си же?).


Дата: Апр 5, 2003 23:26:14 · Поправил: boozook

А причём тут Паскаль???
я сделал как говорит Four-F
Все компиляторы ЯВУ, если обьявляется локальная переменная размером >4Кб, генерят дополнительный код:

На масме это можно сделать так:
...
.code
start:
needsize=<скока нада байтов>
ressize=4096 ;можно и 8192 поставить
while ressize lt needsize
mov eax,[esp-ressize]
ressize=ressize+4096
endm
...


Дата: Апр 5, 2003 23:52:23

Я говорил про:
HANDLE arrHandles [256];
DWORD dwHowMany = GetProcessHeaps (256, arrHandles);
---
Только надо на паскаль перевести


Дата: Апр 6, 2003 13:35:29 · Поправил: boozook

var
arrHandles: array[0..255] of HANDLE;
dwHowMany: DWORD;

begin
...
dwHowMany := GetProcessHeaps (256, arrHandles);
...

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.062