![]() |
| ||
|
|
Новости |
Поиск |
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
Спасибо.
Defunct (2005-08-02 22:34:00) [21]> Это у тебя ошибки понимания (учись логике)
Которой логике? Если ты пишешь неграмотно.
"Казнить, нельзя помиловать."
"Казнить нельзя, помиловать."
прочитай теперь свое произведение [45].
> И совсем не значит, что так делать нельзя- и это плохой стиль.
> Еще одно непонимание.
Проблема объясняющего.
>> два месяца назад неумевший нормально создать форму, уже умеет читать асм код.
> Я тебе по секрету скажу - я его еще и писать умею.
голословное утверждение. Тебе что-то сказать - что в лужу плюнуть.
> А ты так до сих пор и не въехал в проблему 2-х месячной давности - сказать тут больше нечего.
Проблема была твоя, причем надуманная. Я же не обязан помнить твои надуманные проблемы по два месяца. Других более важных дел хватает.
Mx (2005-08-02 22:33:00) [22]Гы, прикольно, продолжайте в том же духе! Вот же до чего доводит ошибка в маленькой ассемблерной вставке :)
TProgrammer (2005-08-02 22:14:00) [23]
> Да утверждаю, и ты даже вроде как согласился в [45]. Если
> же нет, тогда у тебя есть ошибки стилистики. (пиши грамотней)
Это у тебя ошибки понимания (учись логике)
Мое мнение - я считаю, что применение ассемблера вообще не слишком оправдано, особенно в свете постепенного продвижения идеи мультиплатформенности в т.ч. и Borland'ом. Но если уж идет применение asm вставок, то вызов из них дельфийских функций, в особенности функций MemoryMenager'а.
> Твоя мысль там процитирована ровно настолько насколько я
> ее понял по расставленным тобой знакам препинания.
Еще одно непонимание.
> Вовсе нет, я правда рад, что человек, два месяца назад неумевший
> нормально создать форму, уже умеет читать асм код.
Я тебе по секрету скажу - я его еще и писать умею. А ты так до сих пор и не въехал в проблему 2-х месячной давности - сказать тут больше нечего.
> Искрене за тебя рад.
Взаимно.
Defunct (2005-08-02 21:21:00) [24]Mx © (02.08.05 16:55) [48]
Если вдруг TProgrammer скажет, что у него классные сиськи, так и начнем их обсуждать, пока он такой возможности мне не предоставил :)
А вообще TProgrammer - "классный пацан" (C) Сара Коннор, нравится мне его манера ответов, вижу в нем свое зеркальное отражение.
TProgrammer (02.08.05 16:45) [47]
Но речь не идет о том использовать асм или нет, а о том, что ты утверждаешь, что использование вызовов дельфийских функций из асма - плохой тон.
Да утверждаю, и ты даже вроде как согласился в [45]. Если же нет, тогда у тебя есть ошибки стилистики. (пиши грамотней)
> чем цитировать фразы не до конца.
Твоя мысль там процитирована ровно настолько насколько я ее понял по расставленным тобой знакам препинания.
> Налицо тут только твой примитивный и убогий сарказм.
Вовсе нет, я правда рад, что человек, два месяца назад неумевший нормально создать форму, уже умеет читать асм код. Искрене за тебя рад.
Mx (2005-08-02 16:55:00) [25]Мда... Когда начнем сиськи обсуждать?
TProgrammer (2005-08-02 16:45:00) [26]
> Ты же моим словам все равно не веришь. Для чего же предлагаешь
> мне сравнивать?
Ты же моим словам не веришь - вот и предлагаю убедиться тебе самому.
> при сравнении ты заметишь как от более ранних версий к более
> поздним количество вызовов (да и самих асм вставок) уменьшалось.
Ну учитывая, что System дельфи 3 был практически полностью написан на ассемблере, трудно возразить. Количество вызов же уменьшалось исключительно пропорционально количеству асм вставок и не более того. Но речь не идет о том использовать асм или нет, а о том, что ты утверждаешь, что использование вызовов дельфийских функций из асма - плохой тон.
> стандартные модули. Ты читай внимательней, говорил я про
> ReallocMem, GetMem не надо приплетат, о нем другой разговор.
Другой разговор ? То есть его вызывать можно, а другие функции нельзя ? Интересная и удобная логика.
> Нет повода верить твоим отмазкам.
Мне вообще плевать во что ты там веришь. Твои отмазки ничуть не лучше.
> Приведи хотя бы одну мою цитату, где я говорил, что так
> делать нельзя. Привести ты ее не сможешь, поэтому иногда
> лучше жевать.
Лучше тебе тоже пожевать, чем цитировать фразы не до конца.
> я очень рад за тебя, что ты на решение этой задачи потратил
> меньше часа. Налицо прогресс.
Налицо тут только твой примитивный и убогий сарказм.
Defunct (2005-08-02 16:14:00) [27]> Если нет - то пойди сравни код System от версии к версии изменяется очень сильно.
Ты же моим словам все равно не веришь. Для чего же предлагаешь мне сравнивать?
Если хочешь убедиться - интереснейшую затею по сравнению кода сделай сам, не получится тогда обращайся за помощью. Кстати, при сравнении ты заметишь как от более ранних версий к более поздним количество вызовов (да и самих асм вставок) уменьшалось.
> Опять ИМХО забываешь ставить - телепат из тебя никакой, прими это к сведению.
Нет повода верить твоим отмазкам.
> Интересные у тебя модули,
стандартные модули. Ты читай внимательней, говорил я про ReallocMem, GetMem не надо приплетат, о нем другой разговор.
> И совсем не значит, что так делать нельзя
Приведи хотя бы одну мою цитату, где я говорил, что так делать нельзя. Привести ты ее не сможешь, поэтому иногда лучше жевать.
> Интуиция и логика у тебя хреновые, если думаешь, что искать ассемблерный вызов в модуле занимает час.
я очень рад за тебя, что ты на решение этой задачи потратил меньше часа. Налицо прогресс.
TProgrammer (2005-08-02 15:48:00) [28]
> RTL, в частности System и SysUtils годами не модифицировались.
Эта типа шутка такая ? Если нет - то пойди сравни код System от версии к версии изменяется очень сильно.
> Первое что попалось на глаза после долгих поисков, будет
> справедливее сказано.
Опять ИМХО забываешь ставить - телепат из тебя никакой, прими это к сведению.
> Не полно, а всего 1 на два приведенных тобой модуля:
> в System - 1 вызов, в SysUtils - 0.
Интересные у тебя модули, у меня в D6 в System 4 вызова GetMem бросились в глаза сразу, считать полное количество мне совсем не хочеться.
> (сделанный кстати не от хорошей жизни, а от того что в System
> аж 4 разных ReallocMem), совсем не значит что надо так делать.
>
И совсем не значит, что так делать нельзя- и это плохой стиль.
> интуиция + логика меня редко подводят, можешь называть это
> телепатией.
Интуиция и логика у тебя хреновые, если думаешь, что искать ассемблерный вызов в модуле занимает час.
Defunct (2005-08-02 15:31:00) [29]TProgrammer (02.08.05 14:53) [43]
> Тогда пойди расскажи свои прописные истины тем программистам Borland'a,
RTL, в частности System и SysUtils годами не модифицировались. И код в них мягко сказать "подгулявший". Не думаю что borland'овцам надо что-то пояснять, они и так это прекрасно знают. Только пользуются еще одной прописной истиной - "лучшее враг хорошего"/"не сломалось - не чини".
> Частный ? Это первое что бросилось в глаза в течении 1 минуты.
Первое что попалось на глаза после долгих поисков, будет справедливее сказано.
> Не нравиться SysUtils - открой System - там полно вызовов именно GetMem / ReallocMem на которые ты наехал, базируясь на своих "прописных истинах
Не полно, а всего 1 на два приведенных тобой модуля:
в System - 1 вызов, в SysUtils - 0.
от того, что этот один вызов имеет место в модуле System(сделанный кстати не от хорошей жизни, а от того что в System аж 4 разных ReallocMem), совсем не значит что надо так делать.
> p.s. Насчет часа поисков - это ты телепатией определил ?
интуиция + логика меня редко подводят, можешь называть это телепатией.
TProgrammer (2005-08-02 14:53:00) [30]
> > И пойди расскажи свои прописные истины программистам Borland'a,
> которые к твоим "истинам" не особо не прислушивались когда
> писали VCL.
Ок. Тогда пойди расскажи свои прописные истины тем программистам Borland'a, которые к твоим "истинам" не особо не прислушивались когда писали RTL.
> Частный случай, где не требуется высокая скорость. Причем
> на поиски которого у тебя ушел почти час
Частный ? Это первое что бросилось в глаза в течении 1 минуты. Не нравиться SysUtils - открой System - там полно вызовов именно GetMem / ReallocMem на которые ты наехал, базируясь на своих "прописных истинах".
p.s. Насчет часа поисков - это ты телепатией определил ? Или ты думаешь, что мне больше делать нечего как только в форуме сидеть ?
Defunct (2005-08-02 12:06:00) [31]TProgrammer (02.08.05 11:54) [41]
> Это что-то меняет ?
Да разумеется, фактически полностью отменяет твое предыдущее высказывание:
> И пойди расскажи свои прописные истины программистам Borland'a, которые к твоим "истинам" не особо не прислушивались когда писали VCL.
> Например функция FormatBuf вызывает дельфийскую FormatError.
Частный случай, где не требуется высокая скорость. Причем на поиски которого у тебя ушел почти час ;>
TProgrammer (2005-08-02 11:54:00) [32]
Правда? А с каких это пор модуль SysUtils стал входить в состав VCL?
Согласен, описался, не VCL - а RTL. Это что-то меняет ?
И второе попробуй найди в модуле SysUtils хотя бы один вызов delphiшной функции, а не ассемблерной вставки.
Легко. Например функция FormatBuf вызывает дельфийскую FormatError.
Defunct (2005-08-02 10:56:00) [33]TProgrammer (02.08.05 02:04) [39]
> Потому как половина функций из модуля SysUtils, используют в ассемблерных вставках вызовы дельфийских функций.
Правда? А с каких это пор модуль SysUtils стал входить в состав VCL? И второе попробуй найди в модуле SysUtils хотя бы один вызов delphiшной функции, а не ассемблерной вставки.
> На ночь не перечитываешь ?
нет, просто злопамятный.
TProgrammer (2005-08-02 02:04:00) [34]
> Нет, не видел. И какое отношение программисты Borland имеют
> к прописным истинам?
Оно и видно, что не видел. Потому как половина функций из модуля SysUtils, используют в ассемблерных вставках вызовы дельфийских функций. Видимо программисты Borland тоже все делают через ж... Как же им не хватает великого мастера Defunct'a который бы показал им путь во тьме.
> Как твой проект?
Спасибо, хорошо. Месяц как сдали.
> Позволю себе напомнить.
> Выдержка из нашего с тобой последнего разговора:
Приятно видеть, что ты бережно хранишь все свои диалоги. На ночь не перечитываешь ?
> меня это нисколько не беспокоит.
Если не беспокоит - то что ж ты тогда полез-то ? Скучно было ?
> ps: заполни анкету.
Уже бегу.
Mx (2005-08-02 01:57:00) [35]Ээээ, а к чему темку-то подняли? Чтоб поругаться?
Defunct (2005-08-02 01:26:00) [36]TProgrammer (01.08.05 16:46) [36]
> Ты же видел хоть раз исходники VCL ?
Нет, не видел. И какое отношение программисты Borland имеют к прописным истинам?
Как твой проект? Позволю себе напомнить.
Выдержка из нашего с тобой последнего разговора:
> 3. Пишу. Большое и серьезное. И со мной это делает 12 человек - поэтому когда мне нужно убрать форму, это значит мне нужно убрать форму - потому как проектированием этого проекта занимаюсь не я.
12 "профи" пишут что-то большое и серьезное, и все 12 "профи" сошлись на выводе, что надо делать через ж...
Конечно я помню, что ты любитель решать все через одно место, и поэтому пусть будет по-твоему. Делай в своих асм вставках вызовы дельфишных процедур, можешь даже вызовы васиковых процедур делать, меня это нисколько не беспокоит. Делай как хочешь. Убирай форму там где ее можно и не создавать. Твое дело.
ps: заполни анкету.
TProgrammer (2005-08-01 16:46:00) [37]
> В моем же посте, я не вижу ни капли бреда, и imho ставить
> на прописные истины не обязан.
Ну если ты его не видишь, это не значит что его там нет. И пойди расскажи свои прописные истины программистам Borland'a, которые к твоим "истинам" не особо не прислушивались когда писали VCL. Ты же видел хоть раз исходники VCL ?
Defunct (2005-08-01 02:28:00) [38]TProgrammer (31.07.05 23:28) [33]
Старый знакомый нарисовался.
Все свои посты применяй сперва к себе.
В моем же посте, я не вижу ни капли бреда, и imho ставить на прописные истины не обязан.
Alex Konshin (2005-08-01 00:10:00) [39]Во-первых, класс для битовых массивов есть в VCL, по-моему называется TBits.
Не помню, чем он мне не понравился и я тоже написал свой. Смотри в юните Arrays у меня на сайте.
TProgrammer (2005-07-31 23:28:00) [40]
> Defunct © (17.07.05 15:52) [32]
> хм.. если на асме требуется сделать вызов какой-то делфишной
> функции, то грош цена такой асмовской встравке.
ИМХО вставлять не забывай, когда бред постишь.