Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка при вызове ReallocMem в ассемблере [D7, WinXP]


Страницы:   1 2 3 4

Mx ©   (2005-07-15 09:50:00) 

Написал две подпрограммы для работы с битами, обе ассемблерные. Первая возвращает значение бита по индексу, вторая - устанавливает, а если надо, и расширяет диапазон. Последнее производится засчет ReallocMem, но че то не фурычит. Не могу понять. Интересно, что я протестил код некой _ReallocMem из System.pas (а не из GetMem.inc), так там тоже при вызове MemoryManager.ReallocMem происходит ошибка. А может я указываю адрес не той процедуры?

Исходный текст:

function GetBit(Buffer: Pointer; Index: Integer): Boolean;
asm
     MOV   ECX,EDX
     SAR   ECX,3
     ADD   EAX,ECX
     SUB   EDX,ECX
     BT    [EAX],EDX
     SETC  Result      
end;

procedure SetBit(var Buffer: Pointer; Index: Integer; Value: Boolean);
asm
     PUSH  ECX
     PUSH  EDX
     SAR   EDX,3
     INC   EDX
     CALL  System.@ReallocMem
     MOV   ECX,EDX
     POP   EDX
     ADD   EAX,ECX
     SUB   EDX,ECX
     POP   ECX
     CMP   CL,0
     JE    @@clr
@@set:
     BTS   [EAX],EDX
     RET
@@clr:
     BTC   [EAX],EDX}
end;

procedure TForm1.FormCreate(Sender: TObject);
var
 P: Pointer;
begin
 P := nil;
 try
   SetBit(P, 1, True);
   SetBit(P, 2, True); // ошибка возникает тут, при повторном вызове
   SetBit(P, 8, True);
   SetBit(P, 13, True);
   SetBit(P, 12, True);
 finally
   FreeMem(P);
 end;
end;


Ошибка: "всеми любимый" EAccessViolation

Спасибо.


TProgrammer   (2005-08-03 03:17:00) [1]


> короче [32]. ;>

Кроме пары особых случаев, один ты уже озвучил - от себя добавлю еще случай использования asm'а когда удобно использовать например SSE - тогда приходится пользоваться asm.


Defunct   (2005-08-03 03:00:00) [2]

TProgrammer   (03.08.05 02:27) [70]
> До определенного объема вставки - разница в скорости не заметна. Но мы и не говорим сейчас о чистом ассемблере, а ассемблерная вставка редко превышает пару-тройку страниц кода, опять же, если пишется профессионалом.

Что-то скучновато уже стало.
Тема полностью исчерпана...
итого (в контексте вставок):

1. На асме вообще лучше не писать без крайней потребности.
2. Если и писать, то только ради увеличения производительности кода, старатясь не использовать вызовы процедур написанных на Паскале.
3. Если возникает потребность вызова процедур написанных на паскале и без этого нельзя обойтись тогда goto 1.
4. Особый случай - организация защиты, тут вызовы delphiшных процедур/функций оправданы, но это уже совсем другая тема.

короче [32]. ;>

> Нет и надеюсь не придется :)
прочувствовал бы всю прелесть неалгоритмического языка. ;>
анкетку-то заполни, не уж-то так трудно?


TProgrammer   (2005-08-03 02:27:00) [3]


> Ты хочешь сказать, что профессионализ позволит тебе с одинаковой
> скоростью править программу на алгоритмическом языке и машинном
> языке?

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


> Доводилось ли тебе существенно изменять собственный асм
> код примерно 200k через 3-4 года после внедрения?

Нет и надеюсь не придется :) Все-таки я не системщик - на написание ОС не притендую.


Defunct   (2005-08-03 02:15:00) [4]

> Прозрачность своего кода для самого себя - это и есть признак профессионализма.

Ты хочешь сказать, что профессионализ позволит тебе с одинаковой скоростью править программу на алгоритмическом языке и машинном языке?

Доводилось ли тебе существенно изменять собственный асм код примерно 200k через 3-4 года после внедрения?

> Как ты там говорил ? "Нет повода верить твоим отмазкам. "

Я тебя и не заставляю.
можешь считать что здесь ты выиграл, а мне позор за такой код.


TProgrammer   (2005-08-03 01:54:00) [5]


> Нет не от этого, много зависит от того, что даже собственный
> асм код не настолько прозрачен как код на Pascal

Прозрачность своего кода для самого себя - это и есть признак профессионализма.


> разумеется в этои коде - нигде.
> "отрыл в рабочем проекте" - это совсем не значит, что
> 1. код написан мой. ...

Как ты там говорил ? "Нет повода верить твоим отмазкам. " (С) ;)


Defunct   (2005-08-03 01:48:00) [6]

Mx ©   (03.08.05 01:14) [65]
> А когда каждый байт на счету, когда количество битов заранее неизвестно, когда этих элементов тысячи, а то и миллионы?

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

TProgrammer   (03.08.05 01:14) [66]
> Тут все зависит от профессиональности программиста, который эти вставки делает.

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

> И где у тебя разрушается созданный экземпляр TISPProgrammerForm ?

разумеется в этои коде - нигде.
"отрыл в рабочем проекте" - это совсем не значит, что
1. код написан мой.
2. код выложен в том виде как и в проекте.
в самом проекте после ShowModal идет куча лабуды где возвращается результат формы за ним и free.


TProgrammer   (2005-08-03 01:14:00) [7]


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

Тут все зависит от профессиональности программиста, который эти вставки делает. Можно и на асме написать так, что работать будет тормознее, чем на делфи. А можно написать и с вызовом GetMem'а, и работать будет быстрее, чем тоже но на делфи. Если уж писать процедуру на асме, то всю - и если при этом требуется выделить память, то почему не вызвать GetMem или ReallocMem ? Вопросы глючности и трудночитаемости кода - это вопросы профессионализма программиста, а не применяемой технологии.

А что касается твоего профессионализма, то тут есть сомнения. Вот увидел в форуме твой кусок кода из рабочего(!) проекта - прямо удивился - и этот человек учил меня формы создавать:

Defunct ©   (30.07.05 21:55) [13]

Вот отрыл в рабочемпроекте:

procedure UploadFileThroughISP( ACallingProcessHandle : DWord;
                                FileName: ShortString );stdcall;
begin
 if ACallingProcessHandle <> 0 then
    Application.Handle := ACallingProcessHandle;

 with TISPProgrammerForm.Create( nil ) do
 begin
    fFileName := FileName;
    L_FName.Caption := ExtractFileName( FileName );
    ShowModal;
 end
end;


И где у тебя разрушается созданный экземпляр TISPProgrammerForm ? Вот это я называю писать через ж...


Mx   (2005-08-03 01:14:00) [8]


> Defunct ©   (03.08.05 01:05) [64]
> для битовых полей не надо было даже и память выделять

А когда каждый байт на счету, когда количество битов заранее неизвестно, когда этих элементов тысячи, а то и миллионы?


Defunct   (2005-08-03 01:05:00) [9]

Mx ©   (03.08.05 00:41) [62]

Доступ к биту лучше всего делать по заранее подготовленным маскам. Создаете 64 маски (32 на Or и 32 на And) и все - задача решена.

> Память я никак не смогу выделить на "чистом" ассемблере, к тому же вызов ReallocMem впоследствии производился по-условию.

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


Defunct   (2005-08-03 00:58:00) [10]

> Видимо это ты говоришь об асмах. Я же продолжаю говорить о делфи и асмовких вставках в дельфийском коде.

Понимаешь ли, когда ты заговорил о многоплатформенности, мне ничего не оставалось как говорить об асм(ах) вообще. Хочешь говорить о вставках - не вопрос, но тогда мы не выходим за рамки IA32/Win32/Delphi

> Я пропустил то место где я утверждал, что я это применяю ?
Ты нигде не говорил, что применяешь, то что приветствуешь и оправдываешь. Я сделал такой вывод лишь потому, что:
1. Чел оспаривает [32].
2. Чел говорит, что пишет на асме.
3. Чел говорит, что вызовы Delphiшных функций из асм вставок оправданы.
Логично предположить раз он так уверенно об этом говорит, значит он "собаку съел" в этом вопросе. Следовательно у него есть примеры, собственного кода, где без таких вызовов либо нельзя было обойтись, либо отказ от таких вызовов значительно усложнил бы код.

> Мне подобные конструкции нужны не были, но если бы понадобились, то применил бы.

Слишком много "бы". Я же в отличие от тебя имел дело с такими "конструкциями", и зачастую они ни к чему хорошему не приводят. Ни выигрыша в производительности, ни экономии времени при написании программы, лиш только добавляют сложности и глюков при модификации программы. Поэтому я утверждаю [32].

> Зато я тебе привел примеры применения этого в коде RTL.
RTL это не показатель. Это написанная библиотека сотнями разных программистов, которые дописывали определенные куски в разное время. Кому-то было удобнее сделать вызов в асм вставке, кому-то - написать на Delphi, в итоге получилось то, что есть. Главное что оно работает, поэтому его и не трогают.

> См. модуль System. Или ему тоже грош цена.
Да - написан кривовато, да - не подходит в качестве эталона для программистов. Но он работает, отлажен и вылизанв этом его ценность.

> Ты видимо считаешь, что написал бы лучше.
Знаю одно писал бы долго, с перерывами, после перерывов стиль бы изменялся и появлялась бы кривизна. И знаю другое - никогда бы не взялся его переписывать - макачий труд.
Забесплатно его переписывать не будет никто. Платить за переделываение System.pas тоже никто не будет. Поэтому тут даже и говорить не о чем, используем уж какой есть.


Mx   (2005-08-03 00:41:00) [11]


> Defunct ©   (03.08.05 00:07) [60]
> Половина функций kernel все остальное на Delphi

Это не говорит о том, что MM написан не на Delphi. Да, он юзает ядро, но! Во-первых, а как иначе в защищенной ОС? Во-вторых, по такой логике ВСЕ проги под Windows написаны на C.


> ни одной асмовской вставки

Послушай, я использовал ассемблер только с целью избежать различных shl/shr, так как там много всякой фигни. Доступ к биту думаю проще реализовать в виде простой BT, чем в виде Result := (N and M = M), где M еще надо подсчитать. Память я никак не смогу выделить на "чистом" ассемблере, к тому же вызов ReallocMem впоследствии производился по-условию.


TProgrammer   (2005-08-03 00:18:00) [12]


> Уже об асм(ах) как таковых.

Видимо это ты говоришь об асмах. Я же продолжаю говорить о делфи и асмовких вставках в дельфийском коде.


> На что идет вполне обоснованная желание взглянуть на твой
> код, где ты выполняешь такие оправданные вызовы, чисто делфишных
> процедур. Приведешь или у тебя нечего привести?

Я пропустил то место где я утверждал, что я это применяю ? Мне подобные конструкции нужны не были, но если бы понадобились, то применил бы. Зато я тебе привел примеры применения этого в коде RTL.


> см [32].

См. модуль System. Или ему тоже грош цена. Ты видимо считаешь, что написал бы лучше.


Defunct   (2005-08-03 00:07:00) [13]

Mx ©   (02.08.05 23:57) [58]
> Стоп. А если заглянуть в GetMem.inc?

Половина функций kernel все остальное на Delphi. Кстати, хороший пример, ни одной асмовской вставки и ни одного вызова Delphiшной процедуры из асм вставки.


Defunct   (2005-08-02 23:59:00) [14]

> А я и не знал, что у меня есть проблема с твоим пониманием, спасибо, что просветил.

У тебя проблема с изложением мысли, а не с моим пониманием.

> Чтобы другие не воспринимали тебя всерьез.
:)

> Чтобы испортить мне настроение нужно больше, чем один неудачный клоун. Меня все это просто развлекает - это вторая причина, почему я спорю :)

Представляешь, это и моя причина по которой я с тобой общаюсь ;)

> Кто-то пишет ОС на Delphi ? Или мы уже говорим о всех языках программирования ?

Уже об асм(ах) как таковых.

> Упс. Заканчиваю - вызовы MM оправданы, равно как и вызовы чисто дельфийских процедур.

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


> Однако ты прицепился именно к ReallocMem.
см [32].


Mx   (2005-08-02 23:57:00) [15]


> TProgrammer   (02.08.05 23:41) [57]
> Однако ты прицепился именно к ReallocMem.

Ну это хотя бы по теме :)


> Defunct ©   (02.08.05 23:12) [54]
> При этом ты говоришь о самом MM так, как-будто
> он написан на Delphi

Стоп. А если заглянуть в GetMem.inc?


TProgrammer   (2005-08-02 23:41:00) [16]


> смотря для каких задач. Кто-то же пишет ОС и не под каждую
> платформу можно найти такую ОС как нужно по приемлемой цене.

Кто-то пишет ОС на Delphi ? Или мы уже говорим о всех языках программирования ?


> Ты не закончил свою мысль.

Упс. Заканчиваю - вызовы MM оправданы, равно как и вызовы чисто дельфийских процедур.


> Загляни в ту же реализацию ReallocMem

Однако ты прицепился именно к ReallocMem.


TProgrammer   (2005-08-02 23:36:00) [17]


> В этом случае только твоя.

А я и не знал, что у меня есть проблема с твоим пониманием, спасибо, что просветил.


> так зачем тогда споришь?

Чтобы другие не воспринимали тебя всерьез.


> чтобы испортить тебе настроение.

Чтобы испортить мне настроение нужно больше, чем один неудачный клоун. Меня все это просто развлекает - это вторая причина, почему я спорю :)


Defunct   (2005-08-02 23:24:00) [18]

> Твое непонимание - не моя проблема.
В этом случае только твоя.
Если бы я лез к тебе с вопросам, тогда это мое непонимание. А если ты пишешь о чем-то неоднозначно, то это уже только твоя проблема.

> Мне твое мнение как-то вообще пофигу.
так зачем тогда споришь?

> На кой вспоминаешь то
чтобы испортить тебе настроение.


Defunct   (2005-08-02 23:12:00) [19]

> Мое мнение - я считаю, что применение ассемблера вообще не слишком оправдано, особенно в свете постепенного продвижения идеи мультиплатформенности в т.ч. и Borland'ом.

смотря для каких задач. Кто-то же пишет ОС и не под каждую платформу можно найти такую ОС как нужно по приемлемой цене.

Но если уж идет применение asm вставок, то вызов из них дельфийских функций, в особенности функций MemoryMenager'а.

1. MemoryManager.
2. Ты не закончил свою мысль. (то ли вызов функций MM оправдан, то ли наоборот). При этом ты говоришь о самом MM так, как-будто он написан на Delphi. Загляни в ту же реализацию ReallocMem;external;cdecl и _ReallocMem().


TProgrammer   (2005-08-02 23:07:00) [20]


> Проблема объясняющего.

Твое непонимание - не моя проблема.


> Тебе что-то сказать - что в лужу плюнуть.

Мне твое мнение как-то вообще пофигу.


> Проблема была твоя, причем надуманная. Я же не обязан помнить
> твои надуманные проблемы по два месяца. Других более важных
> дел хватает.

Сам себе противоречишь. Ты первый об этом вспомнил. На кой вспоминаешь то, что не помнишь и не понял ?


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо