![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при вызове ReallocMem в ассемблере [D7, WinXP]
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]
> Проблема объясняющего.
Твое непонимание - не моя проблема.
> Тебе что-то сказать - что в лужу плюнуть.
Мне твое мнение как-то вообще пофигу.
> Проблема была твоя, причем надуманная. Я же не обязан помнить
> твои надуманные проблемы по два месяца. Других более важных
> дел хватает.
Сам себе противоречишь. Ты первый об этом вспомнил. На кой вспоминаешь то, что не помнишь и не понял ?