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

Спасибо.


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]
> хм.. если на асме требуется сделать вызов какой-то делфишной
> функции, то грош цена такой асмовской встравке.

ИМХО вставлять не забывай, когда бред постишь.


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

Наверх

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