![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как выделить область в стеке? [D7, WinXP]
HydraMarat © (2005-02-22 17:32:00)Есть ли какая-нибудь функция типа GetMem для стека? Или это в принципе невозможно? Видел в модуле Grids.pas функцию StackAlloc вроде как "декрементирует" SP, но "глобально" она конечно же не работает, только в пределах одной подпрограммы (ну и видимо без вызовов других). Вот, например, C++ умеет же размещать в стеке объекты. Я понимаю, что это на уровне компилятора, но КАК-то же это делается. Может хоть ссылочку на подобное более детальную инфу дадите?
Спасибо.
Набережных С. (2005-02-22 19:09:00) [41]
> Как это осуществить?
Для начала выучить ассемблер.
Ты так ничего и не понял:( Все, я иссяк...
HydraMarat (2005-02-22 18:59:00) [42]Поясню на примере кода, я уж начинаю думать что вопрос "не из той оперы". Например, юзер написал:
function F(A, B: Integer): Double; lib "Lib" name "Name"
Интерпретатор (который пишется мною) встречает вызов: F(3, 4); Он загружает Lib, находит адрес Name, теперь ей надо передать параметры, и вызвать. Как это осуществить?
Набережных С. (2005-02-22 18:55:00) [43]
> HydraMarat (22.02.05 18:47) [12]
> Как интерпретатор передаст ей параметры?
Зависит от соглашения о передаче параметров. Может через регистры, а может через стек. В последнем случае для размещения параметров в стеке используются инструкции процессора Push.
Видишь ли, очень грубо говоря, разные функции для своих параметров используют одни и те-же ячейки стека, и в том месте, где для одной расположена переменная А: integer, для другой может находиться B: double. Чтобы понимать всю эту кухню нужно представлять устройство процессора хотя-бы в общих чертах.
HydraMarat (2005-02-22 18:47:00) [44]Ну чем оно плохо-то? Представьте что пишется интерпретатор, вот он считывает код, где пользователь вызывает функцию API. Как интерпретатор передаст ей параметры?
Если я чего-то не понимаю объясните!
Набережных С. (2005-02-22 18:43:00) [45]Совсем плохо дело:(
Amoeba (2005-02-22 18:42:00) [46]
> HydraMarat (22.02.05 18:40) [8]
> Мне не нужно ИСПОЛЬЗОВАТЬ "уникальные возможности стека
> по освобождению памяти", мне надо СДЕЛАТЬ их. Для вызова
> системных функций и т.п.
Что-то орехами запахло...
Amoeba (2005-02-22 18:41:00) [47]
> HydraMarat (22.02.05 18:36) [7]
> Набережных С.
>
> Да уж тебе точно возразить нечего... Не понял вопроса -
> не хрен отвечать.
LMD!!!
HydraMarat (2005-02-22 18:40:00) [48]Мне не нужно ИСПОЛЬЗОВАТЬ "уникальные возможности стека по освобождению памяти", мне надо СДЕЛАТЬ их. Для вызова системных функций и т.п.
HydraMarat (2005-02-22 18:36:00) [49]Набережных С.
Да уж тебе точно возразить нечего... Не понял вопроса - не хрен отвечать.
Набережных С. (2005-02-22 18:29:00) [50]
> HydraMarat (22.02.05 18:08) [4]
> В-общем главное в вопросе: аналог GetMem/FreeMem для стека.
Это настолько бред, что даже возразить трудно:). В стеке переменные размещаются как раз для того, чтобы при выходе из функции не заботиться об освобождении памяти под них. Почитал бы какую-нибудь книжку про устройство компьютеров, что-ли...
Amoeba (2005-02-22 18:20:00) [51]А зачем, если сие не есть государственная тайна, это нужно?
HydraMarat (2005-02-22 18:08:00) [52]Упс, про файл проекта я загнался, процедур-то там нет, да и со "статико-динамикой" всё запутал.
В-общем главное в вопросе: аналог GetMem/FreeMem для стека. А может это как-то на asm'е делается?
Anatoly Podgoretsky (2005-02-22 17:59:00) [53]При том, что память будет выделена на стеке и соответствует твоему вопрос, а про статику ты ничего не говорил
HydraMarat (2005-02-22 17:57:00) [54]Причем здесь var? Мне нужно сделать это глобально и иметь над этим контроль. Ну представим что нужно написать частичку C-компилятора. Или Вы имеете ввиду выделить статически в файле проекта большой объем (через var) и использовать его?
Anatoly Podgoretsky (2005-02-22 17:49:00) [55]var внутри процедуры