Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2011, 08:03   #1
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
Стрелка Функции для выделения, перераспределения и освобождения памяти

вот нашел в нете такои код, хотел попробывать на практике но не знаю как запустить
создал юнит с етим кодом и добавил его в модули проекта, но он ошибки выдает
статья 2002 года, может за ето время что то поменялось и надо поменять структуру или еще что

Цитата:
Модуль содержит функции для работы с блоками памяти.

AllocateMem - выделяет блок памяти из Count записей по RecSize байт, возвращает
адрес выделенного блока памяти в случае успеха или nil в случае ошибки.

ReallocateMem - устанавливает новый размер блока памяти, выделенного функцией
AllocateMem. В качестве параметра Pointer можт быть использован как
типизированный так и нетипизированный указатель.

DeallocateMem - освобождает память, выделенную функциями AllocateMem или
ReallocateMem. В качестве параметра Pointer можт быть использован как
типизированный так и нетипизированный указатель.

MemSize - возвращает размер блока памяти, выделенного функциями AllocateMem или
ReallocateMem.
Код:
unit MemFuncs;

interface

uses Windows;

function AllocateMem(Count: Integer; RecSize: Integer = 1): Pointer;
procedure ReallocateMem(var Pointer; Count: Integer; RecSize: Integer = 1);
procedure DeallocateMem(var Pointer);
function MemSize(P: Pointer): Integer;

implementation

function LocalHandle: THandel; external kernel32 name 'LocalHandle';

function AllocateMem(Count: Integer; RecSize: Integer = 1): Pointer;
asm
   test eax, eax
   jle @@10
   test edx, edx
   jle @@10
   imul edx
   push eax
   push LHND
   call LocalAlloc
   push eax
   call LocalLock
   ret
@@10:
   xor eax, eax
end;

procedure ReallocateMem(var Pointer; Count: Integer; RecSize: Integer = 1);
asm
   push ebx
   mov ebx, eax
   mov eax, [ebx]
   test eax, eax
   jnz @@10
   mov eax, edx
   mov edx, ecx
   call AllocateMem
   mov [ebx], eax
   pop ebx
   ret
@@10:
   push ecx
   push edx
   push eax
   call LocalHandle
   pop edx
   pop ecx
   test eax, eax
   jnz @@20
   pop ebx
   ret
@@20:
   push eax
   mov eax, edx
   imul ecx
   mov edx, eax
   pop eax
   push LHND
   push edx
   push eax
   call LocalRealloc
   push eax
   call LocalLock
   mov [ebx], eax
   pop ebx
end;

procedure DeallocateMem(var Pointer);
asm
   push ebx
   mov ebx, eax
   mov eax, [ebx]
   test eax, eax
   jz @@10
   push eax
   call LocalHandle
   test eax, eax
   jz @@10
   push eax
   push eax
   call LocalUnlock
   call LocalFree
@@10:
   xor eax, eax
   mov [ebx], eax
   pop ebx
end;

function MemSize(P: Pointer): Integer;
asm
   test eax, eax
   jnz @@10
   ret
@@10:
   push eax
   call LocalHandle
   test eax, eax
   jnz @@20
   ret
@@20:
   push eax
   call LocalSize
end;

end.
VirusN13

Последний раз редактировалось ArtGrek; 13.03.2011 в 19:46.
ArtGrek вне форума Ответить с цитированием
Старый 13.03.2011, 10:49   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

А чем стандартные функции не устрайвают?

Код:
AllocMemCount;
AllocMemSize;
AllocMem();
ReallocMem();
ReallocMemory();
SysReallocMem();
SysAllocMem();
GetMem();
GetMemory();
FreeMemory();
SysFreeMem();
к тому же если уж хочется на асме эти функции, то вытащи их из KOL библиотеки.

К тому же омпилятор всеравно приводит эти функции в ассемблерный вид.
Какой смысл переводить в асм то, что и так в него переходит?

Последний раз редактировалось Человек_Борща; 13.03.2011 в 10:54.
Человек_Борща вне форума Ответить с цитированием
Старый 13.03.2011, 11:10   #3
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Цитата:
Какой смысл переводить в асм то, что и так в него переходит?
учебныи
просто пользуясь функциями доконца не пониаеш что делаеш, хочу разобраца,
а тут код вроди не сложныи, если запустьть пару практических деиствии и будет видно,
а потом ток команды на асме разобрать
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 13.03.2011, 11:30   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

большая часть из привёдённых мною функций и так ещё в коде(не доходя до сборки) переходит в ассемблернай вид.

К тому-же с 200 года много чего могло поменяться, хависиит от того на чём сидишь. Если это d2010, то это просто мусор.

А вообще я бы выврвал функции из kol библиотеки.
Человек_Борща вне форума Ответить с цитированием
Старый 13.03.2011, 11:38   #5
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

работаю на Д7, а так есть, 2009,2010,ХЕ
что я буду лезть куда не знаю, мне надо что б просто подсказали что поменять что б запустить, а я пока рсдн читаю,
как ето разбиру и дочитаю, тогда уже будет видно что дальше делать

добавлено
код исправил, сеичас посмотрим как ето работает
VirusN13

Последний раз редактировалось ArtGrek; 13.03.2011 в 18:21.
ArtGrek вне форума Ответить с цитированием
Старый 13.03.2011, 18:28   #6
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

А я бы не советовал вмешиваться в работу менеджера памяти. Это достаточно тонкий и хорошо оптимизированный (вплоть до "ручного" выравнивания инструкций) механизм, учитывающий многопоточность, утечки, обработку ошибок, разный подход при работе с маленькими и большими блоками, фрагментацию... Ну по крайней мере в делфях старше 7, когда ещё Borland туда воткнули FastMM. Если очень охота поковыряться во внутренностях - Options - Compiler - Debug information+Use debug DCUs, бряк на AllocMem(123) и F7 F7 F7...

И это... подтянуть русский или хотя бы включить проверку орфографии в браузере
Изображения
Тип файла: png Буфер обмена-1.png (31.9 Кб, 53 просмотров)
пыщь

Последний раз редактировалось JTG; 13.03.2011 в 18:30.
JTG вне форума Ответить с цитированием
Старый 13.03.2011, 18:36   #7
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
И это... подтянуть русский или хотя бы включить проверку орфографии в браузере
Это не от незнания. Это идиотский "инетский сленг". От безумной лени. От полного неумения печатать на клавиатуре. От неуважения и наплевательского отношения к тем, кто вынужден потом читать эту абракадабру.
Поэтому проще написать "хоцца" вместо "хочется".
А т.к. буквы "т", "е" и "о" находятся рядом (а шире посмотреть лень - вот еще, искать где-то справа букву "э"), то и пишет "ето" вместо "это"...

З.Ы. Пардон за оффтоп - наболело...

Последний раз редактировалось asmodey1; 13.03.2011 в 18:40.
asmodey1 вне форума Ответить с цитированием
Старый 13.03.2011, 19:33   #8
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Цитата:
А я бы не советовал вмешиваться в работу менеджера памяти
мне на практике понятнее, и я буду осторожно, спасибо

Цитата:
И это... подтянуть русский или хотя бы включить проверку орфографии в браузере
Цитата:
Это не от незнания. Это идиотский "инетский сленг". От безумной лени. От полного неумения печатать на клавиатуре. От неуважения и наплевательского отношения к тем, кто вынужден потом читать эту абракадабру.
Поэтому проще написать "хоцца" вместо "хочется".
А т.к. буквы "т", "е" и "о" находятся рядом (а шире посмотреть лень - вот еще, искать где-то справа букву "э"), то и пишет "ето" вместо "это"...
народ, я вас всех очень уважаю, и мне совсем не лень написать ту букву о которои говорит asmodey1
но у меня ее НЕТ, в смысле я пользуюсь ток англиискими буквами, уже года 4, даже 7, и на форумах раньше не сидел(4 месяца), а писал прямо так
Цитата:
translitom, tak kak R jivy ne v Rossie, menia prekrasno ponimali, no zdes' pravilami eto vrodi zapreweno
вот я и печатаю в QIPe, потом нажимаю сочетания клавиш
Ctrl + T
Ctrl + A
Ctrl + X
Alt + Tab
Ctrl + V
и текст в редакторе форума, готов для отправки, думаю лентяи не стал бы заморачиваца столькими комбинациями клавиш
и к тому же, не так уж и много етих ошибок, которые я стараюсь по возможности не делать
VirusN13

Последний раз редактировалось ArtGrek; 13.03.2011 в 19:49.
ArtGrek вне форума Ответить с цитированием
Старый 13.03.2011, 21:05   #9
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Да про вас я знаю, вы уже объясняли, не к вам претензии, а к тем, у кого все буквы есть, но ему хочется писать "по-пацански".
Самое главное, они убеждены, что это "вау, как круто", хотя на самом деле выглядит такой "етат прыграмист" просто убого. Но ему не дано этого понять так же, как и постичь программирование. Настоящее программирование подразумевает культуру не только самого программирования, но и общения, и жизни в целом...
asmodey1 вне форума Ответить с цитированием
Старый 14.03.2011, 03:08   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от ArtGrek Посмотреть сообщение
учебныи
просто пользуясь функциями доконца не пониаеш что делаеш, хочу разобраца,
а тут код вроди не сложныи, если запустьть пару практических деиствии и будет видно,
а потом ток команды на асме разобрать
Он не сложный по той простой причине, что ничего не делает. Абсолютно. Он просто перенаправляет вызовы системным функциям, не добавляя никакой дополнительной функциональности. Всего делов-то.

Просто из-за того, что какой-то умник написал их на ассемблере, это не так бросается в глаза новичкам.

Если есть желание разобраться с работой менеджера памяти - то смотреть надо именно GetMem.inc (реализация стандартных функций, которые приводил Человек Борща) - только там далеко не так всё просто.

Ну и надо понимать, что в любом случае этот код будет опираться на вызовы функций системного менеджера памяти.

На почитать можно взять это и это.

P.S. Если есть желание вляпаться в это дело посильнее, то можно заглянуть ещё сюда, сюда и сюда (и далее по ссылкам). Но это явно вредно для начинающих. Но на будущее - вполне интересно.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось GunSmoker; 14.03.2011 в 03:13.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процедурой освобождения памяти на assembler t2skler Общие вопросы Delphi 1 10.02.2011 13:52
Определение способа выделения памяти (c++) Александр Елис Помощь студентам 2 31.07.2010 20:28
Проверка успешности выделения памяти под динамический масств(С) Александр Елис Помощь студентам 1 06.11.2009 10:00
Проблема выделения динамической памяти в С++ oxygen90 Помощь студентам 3 14.09.2009 21:47
Динамическая выделения памяти megavolt91 Общие вопросы C/C++ 1 25.05.2009 21:05