Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];

Вниз

Ошибка при вызове ReallocMem в ассемблере   Найти похожие ветки 

 
Mx ©   (2005-07-15 09:50) [0]

Написал две подпрограммы для работы с битами, обе ассемблерные. Первая возвращает значение бита по индексу, вторая - устанавливает, а если надо, и расширяет диапазон. Последнее производится засчет 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

Спасибо.


 
Digitman ©   (2005-07-15 10:06) [1]

пошаговую трассировку с контролем состояния РОН до и после вызова System.@ReallocMem делал ?


 
Amoeba ©   (2005-07-15 10:20) [2]

Не изобретай велосипед! Посмотри как это сделано в бибилотеке QSrtings^

function Q_BitTest(P: Pointer; Index: Integer): Boolean;
asm
       BT      [EAX],EDX
       SETC    AL
end;

function Q_BitSet(P: Pointer; Index: Integer): Boolean;
asm
       BTS     [EAX],EDX
       SETC    AL
end;

function Q_BitReset(P: Pointer; Index: Integer): Boolean;
asm
       BTR     [EAX],EDX
       SETC    AL
end;

function Q_BitToggle(P: Pointer; Index: Integer): Boolean;
asm
       BTC     [EAX],EDX
       SETC    AL
end;


 
Mx ©   (2005-07-15 10:45) [3]


> Digitman ©
> пошаговую трассировку с контролем состояния РОН до и после
> вызова System.@ReallocMem делал ?

Делал. Перед вызовом в EAX адрес Buffer"а. После ReallocMem в EAX уже лежит значение этой переменной. К тому же обнуляется EDX, ввиду чего его приходится POP"ить. Но это мне, к сожалению, ни о чем не говорит.


> Amoeba ©

Такие процедуры всего лишь проверяют бит в пределах одного байта. У меня же бит может иметь индекс свыше 31, плюс автоматически выделяется память. Мне это надо делать в нескольких местах и заниматься выделением памяти и определением индекса байта каждый раз мне не хочется.


 
REA   (2005-07-15 10:50) [4]

А TBits не покатит?


 
Digitman ©   (2005-07-15 11:10) [5]

..
    CALL  System.@ReallocMem
    MOV   ECX,EDX
    POP   EDX
    ADD   EAX,ECX
    SUB   EDX,ECX <- проблема здесь : из номера бита вычитаешь вирт.адрес
    POP   ECX


 
Sha ©   (2005-07-15 11:12) [6]

Вызываемая функция имеет право изменять содержимое eax, edx, ecx.


 
Anatoly Podgoretsky ©   (2005-07-15 11:25) [7]

Испорчен var Buffer [EAX]


 
Mx ©   (2005-07-15 11:26) [8]


> REA   (15.07.05 10:50) [4]
> А TBits не покатит?

Придется хранить сотни экземпляров TBits, а требуется и память экономить (поэтому биты, а не массив Boolean) и время.


> Digitman ©   (15.07.05 11:10) [5]
> SUB   EDX,ECX <- проблема здесь : из номера бита вычитаешь
> вирт.адрес

Оба! Я оставил MOV ECX,EDX после ReallocMem так, как при первом вызове EDX нуль, а потом то нет! Но я не заметил. Пока сваливать надо, вечером отпишусь, что получилось.


 
Mx ©   (2005-07-15 11:27) [9]


> Anatoly Podgoretsky ©   (15.07.05 11:25) [7]
> Испорчен var Buffer [EAX]

Каким образом? Что надо исправить?


 
Digitman ©   (2005-07-15 11:34) [10]

ADD   EAX,ECX <- а здесь ты складываешь неизвестно что с новым адресом нового буфера


 
Anatoly Podgoretsky ©   (2005-07-15 11:37) [11]

Mx ©   (15.07.05 11:27) [9]
Сохранять, остальные ты почему то сохраняешь.


 
DiamondShark ©   (2005-07-15 11:39) [12]


> Каким образом? Что надо исправить?

Сохранять EAX перед вызовом @ReallocMem

Да и дальше фигня полная. EAX содержит не адрес буфера, а адрес адреса буфера.
А ты один уровень косвенности потерял.


 
Digitman ©   (2005-07-15 11:41) [13]


>  а требуется и память экономить


для порядка, равного сотням (и даже тысячам), экономия эта - мизерная


> и время


основное время в твоем коде и аналогах в TBits так или иначе приходится на выполнение "тяжелых" инструкций BT/BTS/BTR

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


 
Anatoly Podgoretsky ©   (2005-07-15 11:52) [14]

Digitman ©   (15.07.05 11:41) [13]
Смею предположить, что лучше. Приходилось сталкиваться с переводами на АСМ, с виду нормальными, кроме скорости, по сравнению с Паскаль версией.


 
Digitman ©   (2005-07-15 12:17) [15]


> Anatoly Podgoretsky ©   (15.07.05 11:52) [14]


> Смею предположить, что лучше


возможно и лучше


> Mx


вот ты за производительность своего алгоритма заботишься, а сам при этом делаешь заведомо дурной в этом плане ход : при установке бита по делу и без дела вызываешь ReallocMem()


 
Amoeba ©   (2005-07-15 13:02) [16]


> Mx ©   (15.07.05 10:45) [3]
>
> > Amoeba ©
>
> Такие процедуры всего лишь проверяют бит в пределах одного
> байта. У меня же бит может иметь индекс свыше 31, плюс автоматически
> выделяется память. Мне это надо делать в нескольких местах
> и заниматься выделением памяти и определением индекса байта
> каждый раз мне не хочется.


Вы здесь не правы, поверьте моему опыту использования этих процедур. Они работают с байтовыми массивами любой длины. Так что индекс может быть намного большим чем 31. И не надо определять никакие индексы байтов.


 
Mx ©   (2005-07-15 16:54) [17]


> DiamondShark ©   (15.07.05 11:39) [12]
> EAX содержит не адрес буфера, а адрес адреса буфера.

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


> Amoeba ©   (15.07.05 13:02) [16]

Вот читаю из книги про процы, так там второй параметр BTx должен быть в диапазоне 0..31. Следовательно больше Integer"а с ними не поработаешь. Конечно, можно указатель увеличивать, но разницы никакой. Конкретно каждая процедура больше чем в 32-х битах ничего не изменит. Если, конечно, верить книге.


> Digitman ©   (15.07.05 12:17) [15]
> вот ты за производительность своего алгоритма заботишься,
> а сам при этом делаешь заведомо дурной в этом плане ход
> : при установке бита по делу и без дела вызываешь ReallocMem()

Есть альтернатива? Можно, конечно, еще Count запоминать.

Если положиться на компилятор, то как тогда? Через сдвиги? Насчет TBits, каждый раз конструировать его экземпляры, ждать проверки вхождения индекса в диапазон. Если можно этого избежать, то почему бы не воспользоваться.


 
Digitman ©   (2005-07-15 17:03) [18]


> Можно, конечно, еще Count запоминать


почему бы и нет ?


> Если положиться на компилятор, то как тогда? Через сдвиги?


а посмотри внимательно на код, генерируемый компилятором при проверке на вхождение эл-та во множество и модификации множества !

там идет та же работа с битовым массивом и используются те же BT/BTS/BTR


 
begin...end ©   (2005-07-15 17:04) [19]

> Mx ©   (15.07.05 16:54) [17]
> В какой момент? Перед вызовом в нем адрес буфера.

Это же var-параметр...


 
Mx ©   (2005-07-15 17:20) [20]


> Digitman ©   (15.07.05 17:03) [18]
> там идет та же работа с битовым массивом и используются
> те же BT/BTS/BTR

Значит альтернативы нет. Count я думаю все же ввиду.


> begin...end ©   (15.07.05 17:04) [19]
> Это же var-параметр...

Ну. Я не утверждаю обратного, но после вызова ReallocMem в EAX"е лежит значение Buffer"а (значение указателя P в методе TForm1.FormCreate), а не адрес адреса, как написано в [12].

Да, глубоко перед всеми извиняюсь! Название темы не совсем корректно. Ошибка не в вызове ReallocMem, а при установке/сбросе бита (думал в тот момент о Realloc"е, вот и чиркнул машинально). Так что проблема именно в определении его индекса.


 
begin...end ©   (2005-07-15 17:34) [21]

> Mx ©   (15.07.05 16:54) [17]

> Вот читаю из книги про процы, так там второй параметр
> BTx должен быть в диапазоне 0..31. Следовательно
> больше Integer"а с ними не поработаешь.

> Если, конечно, верить книге.

Книге нужно верить.
Если второй параметр будет больше 31, то он будет изменён на остаток от деления на 32. Например, если параметр равен 32 или 64, то будет взведён нулевой бит.


 
DiamondShark ©   (2005-07-15 17:38) [22]


> Ошибка не в вызове ReallocMem, а при установке/сбросе бита

Дык.
У тебя после вызова ReallocMem бред написан, адрес, который ты, якобы, вычислил указывает на деревню дедушке. Соответственно, команда учтановки бита лезет чёрт-те куда.


 
begin...end ©   (2005-07-15 17:38) [23]

> Mx ©   (15.07.05 17:20) [20]
> Ну. Я не утверждаю обратного...

Нет, Вы утверждаете обратное. В [17] Вы пишете: "Перед вызовом в нем адрес буфера". На самом деле это не так.


 
DiamondShark ©   (2005-07-15 17:43) [24]


> begin...end ©   (15.07.05 17:34) [21]

Вообще-то, всё немного не так.

BTS—Bit Test and Set
Description
Selects the bit in a bit string (specified with the first operand, called the bit base) at the bitposition
designated by the bit offset operand (second operand), stores the value of the bit in the
CF flag, and sets the selected bit in the bit string to 1. The bit base operand can be a register or
a memory location; the bit offset operand can be a register or an immediate value. If the bit base
operand specifies a register, the instruction takes the modulo 16 or 32 (depending on the register
size) of the bit offset operand, allowing any bit position to be selected in a 16- or 32-bit register,
respectively (see Figure 3-1). If the bit base operand specifies a memory location, it represents
the address of the byte in memory that contains the bit base (bit 0 of the specified byte) of the
bit string (see Figure 3-2). The offset operand then selects a bit position within the range &#8722;231 to
231 &#8722; 1 for a register offset and 0 to 31 for an immediate offset.

IA-32 Intel® Architecture
Software Developer’s
Manual
Volume 2A:
Instruction Set Reference, A-M


 
Mx ©   (2005-07-15 17:43) [25]


> begin...end ©   (15.07.05 17:38) [23]
> Нет, Вы утверждаете обратное. В [17] Вы пишете: "Перед вызовом
> в нем адрес буфера". На самом деле это не так.

А что же? Перед ReallocMem в EAX лежит адрес переменной Buffer. Об этом я написал еще в [3]. То, что Buffer эквивалентен P подразумевается само собой. Перед первым вызовом SetBit в @P дает тоже число, что и EAX в SetBit. После SetBit, EAX = P.


> DiamondShark ©   (15.07.05 17:38) [22]
> Дык.
> У тебя после вызова ReallocMem бред написан, адрес, который
> ты, якобы, вычислил указывает на деревню дедушке. Соответственно,
> команда учтановки бита лезет чёрт-те куда.

Согласен, исправил, работает.


 
begin...end ©   (2005-07-15 17:53) [26]

> DiamondShark ©   (15.07.05 17:43) [24]

Спасибо.

> Mx ©   (15.07.05 17:43) [25]
> Перед ReallocMem в EAX лежит адрес переменной Buffer.

Если, говоря "адрес буфера", Вы имели в виду адрес переменной Buffer, то Вы правы.
Однако, по-моему, под буфером логичнее понимать область памяти, на которую указывает Buffer.


 
begin...end ©   (2005-07-15 18:24) [27]

> Mx

Обратите внимание на [24]. Автор [16] был прав.


 
Mx ©   (2005-07-15 18:38) [28]

А как быть с диапазоном, превышающим -231 -- 230 ?


 
begin...end ©   (2005-07-15 18:40) [29]

> Mx ©   (15.07.05 18:38) [28]

Это не -231 ... 230. Это -2^31 ... 2^31 - 1.


 
Anatoly Podgoretsky ©   (2005-07-15 19:22) [30]

Mx ©   (15.07.05 16:54) [17]
Ты не книге верь, а документации Интел, этот диапазон 2^31


 
Mx ©   (2005-07-15 19:35) [31]

Да, все работает. Процедурку SetBit я переписал на Delphi"йском, а GetBit сделал как Q_BitTest (thanks Amoeba).

Всем спасибо!


 
Defunct ©   (2005-07-17 15:52) [32]

> Mx

хм.. если на асме требуется сделать вызов какой-то делфишной функции, то грош цена такой асмовской встравке.


 
TProgrammer   (2005-07-31 23:28) [33]


> Defunct ©   (17.07.05 15:52) [32]
> хм.. если на асме требуется сделать вызов какой-то делфишной
> функции, то грош цена такой асмовской встравке.

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


 
Alex Konshin ©   (2005-08-01 00:10) [34]

Во-первых, класс для битовых массивов есть в VCL, по-моему называется TBits.
Не помню, чем он мне не понравился и я тоже написал свой. Смотри в юните Arrays у меня на сайте.


 
Defunct ©   (2005-08-01 02:28) [35]

TProgrammer   (31.07.05 23:28) [33]

Старый знакомый нарисовался.
Все свои посты применяй сперва к себе.

В моем же посте, я не вижу ни капли бреда, и imho ставить на прописные истины не обязан.


 
TProgrammer   (2005-08-01 16:46) [36]


> В моем же посте, я не вижу ни капли бреда, и imho ставить
> на прописные истины не обязан.

Ну если ты его не видишь, это не значит что его там нет. И пойди расскажи свои прописные истины программистам Borland"a, которые к твоим "истинам" не особо не прислушивались когда писали VCL. Ты же видел хоть раз исходники VCL ?


 
Defunct ©   (2005-08-02 01:26) [37]

TProgrammer   (01.08.05 16:46) [36]
> Ты же видел хоть раз исходники VCL ?

Нет, не видел. И какое отношение программисты Borland имеют к прописным истинам?

Как твой проект? Позволю себе напомнить.
Выдержка из нашего с тобой последнего разговора:

> 3. Пишу. Большое и серьезное. И со мной это делает 12 человек - поэтому когда мне нужно убрать форму, это значит мне нужно убрать форму - потому как проектированием этого проекта занимаюсь не я.

12 "профи" пишут что-то большое и серьезное, и все 12 "профи" сошлись на выводе, что надо делать через ж...

Конечно я помню, что ты любитель решать все через одно место, и поэтому пусть будет по-твоему. Делай в своих асм вставках вызовы дельфишных процедур, можешь даже вызовы васиковых процедур делать, меня это нисколько не беспокоит. Делай как хочешь. Убирай форму там где ее можно и не создавать. Твое дело.

ps: заполни анкету.


 
Mx ©   (2005-08-02 01:57) [38]

Ээээ, а к чему темку-то подняли? Чтоб поругаться?


 
TProgrammer   (2005-08-02 02:04) [39]


> Нет, не видел. И какое отношение программисты Borland имеют
> к прописным истинам?

Оно и видно, что не видел. Потому как половина функций из модуля SysUtils, используют в ассемблерных вставках вызовы дельфийских функций. Видимо программисты Borland тоже все делают через ж... Как же им не хватает великого мастера Defunct"a который бы показал им путь во тьме.


> Как твой проект?

Спасибо, хорошо. Месяц как сдали.


> Позволю себе напомнить.
> Выдержка из нашего с тобой последнего разговора:

Приятно видеть, что ты бережно хранишь все свои диалоги. На ночь не перечитываешь ?


> меня это нисколько не беспокоит.

Если не беспокоит - то что ж ты тогда полез-то ? Скучно было ?


> ps: заполни анкету.

Уже бегу.


 
Defunct ©   (2005-08-02 10:56) [40]

TProgrammer   (02.08.05 02:04) [39]
> Потому как половина функций из модуля SysUtils, используют в ассемблерных вставках вызовы дельфийских функций.

Правда? А с каких это пор модуль SysUtils стал входить в состав VCL? И второе попробуй найди в модуле SysUtils хотя бы один вызов delphiшной функции, а не ассемблерной вставки.

> На ночь не перечитываешь ?
нет, просто злопамятный.


 
TProgrammer   (2005-08-02 11:54) [41]


Правда? А с каких это пор модуль SysUtils стал входить в состав VCL?

Согласен, описался, не VCL - а RTL. Это что-то меняет ?

И второе попробуй найди в модуле SysUtils хотя бы один вызов delphiшной функции, а не ассемблерной вставки.
Легко. Например функция FormatBuf вызывает дельфийскую FormatError.


 
Defunct ©   (2005-08-02 12:06) [42]

TProgrammer   (02.08.05 11:54) [41]

> Это что-то меняет ?

Да разумеется, фактически полностью отменяет твое предыдущее высказывание:

> И пойди расскажи свои прописные истины программистам Borland"a, которые к твоим "истинам" не особо не прислушивались когда писали VCL.


> Например функция FormatBuf вызывает дельфийскую FormatError.
Частный случай, где не требуется высокая скорость. Причем на поиски которого у тебя ушел почти час ;>


 
TProgrammer   (2005-08-02 14:53) [43]


> > И пойди расскажи свои прописные истины программистам Borland"a,
> которые к твоим "истинам" не особо не прислушивались когда
> писали VCL.

Ок. Тогда пойди расскажи свои прописные истины тем программистам Borland"a, которые к твоим "истинам" не особо не прислушивались когда писали RTL.


> Частный случай, где не требуется высокая скорость. Причем
> на поиски которого у тебя ушел почти час

Частный ? Это первое что бросилось в глаза в течении 1 минуты. Не нравиться SysUtils - открой System - там полно вызовов именно GetMem / ReallocMem на которые ты наехал, базируясь на своих "прописных истинах".

p.s. Насчет часа поисков - это ты телепатией определил ? Или ты думаешь, что мне больше делать нечего как только в форуме сидеть ?


 
Defunct ©   (2005-08-02 15:31) [44]

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 15:48) [45]


> RTL, в частности System и SysUtils годами не модифицировались.

Эта типа шутка такая ? Если нет - то пойди сравни код System от версии к версии изменяется очень сильно.


> Первое что попалось на глаза после долгих поисков, будет
> справедливее сказано.

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


> Не полно, а всего 1 на два приведенных тобой модуля:
> в System - 1 вызов, в SysUtils - 0.

Интересные у тебя модули, у меня в D6 в System 4 вызова GetMem бросились в глаза сразу, считать полное количество мне совсем не хочеться.


> (сделанный кстати не от хорошей жизни, а от того что в System
> аж 4 разных ReallocMem), совсем не значит что надо так делать.
>

И совсем не значит, что так делать нельзя - и это плохой стиль.


> интуиция + логика меня редко подводят, можешь называть это
> телепатией.

Интуиция и логика у тебя хреновые, если думаешь, что искать ассемблерный вызов в модуле занимает час.


 
Defunct ©   (2005-08-02 16:14) [46]

> Если нет - то пойди сравни код System от версии к версии изменяется очень сильно.

Ты же моим словам все равно не веришь. Для чего же предлагаешь мне сравнивать?
Если хочешь убедиться - интереснейшую затею по сравнению кода сделай сам, не получится тогда обращайся за помощью. Кстати, при сравнении ты заметишь как от более ранних версий к более поздним количество вызовов (да и самих асм вставок) уменьшалось.

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

Нет повода верить твоим отмазкам.

> Интересные у тебя модули,
стандартные модули. Ты читай внимательней, говорил я про ReallocMem, GetMem не надо приплетат, о нем другой разговор.

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

> Интуиция и логика у тебя хреновые, если думаешь, что искать ассемблерный вызов в модуле занимает час.

я очень рад за тебя, что ты на решение этой задачи потратил меньше часа. Налицо прогресс.


 
TProgrammer   (2005-08-02 16:45) [47]


> Ты же моим словам все равно не веришь. Для чего же предлагаешь
> мне сравнивать?

Ты же моим словам не веришь - вот и предлагаю убедиться тебе самому.


> при сравнении ты заметишь как от более ранних версий к более
> поздним количество вызовов (да и самих асм вставок) уменьшалось.

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


> стандартные модули. Ты читай внимательней, говорил я про
> ReallocMem, GetMem не надо приплетат, о нем другой разговор.

Другой разговор ? То есть его вызывать можно, а другие функции нельзя ? Интересная и удобная логика.


> Нет повода верить твоим отмазкам.

Мне вообще плевать во что ты там веришь. Твои отмазки ничуть не лучше.


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

Лучше тебе тоже пожевать, чем цитировать фразы не до конца.


> я очень рад за тебя, что ты на решение этой задачи потратил
> меньше часа. Налицо прогресс.

Налицо тут только твой примитивный и убогий сарказм.


 
Mx ©   (2005-08-02 16:55) [48]

Мда... Когда начнем сиськи обсуждать?


 
Defunct ©   (2005-08-02 21:21) [49]

Mx ©   (02.08.05 16:55) [48]

Если вдруг TProgrammer скажет, что у него классные сиськи, так и начнем их обсуждать, пока он такой возможности мне не предоставил :)

А вообще TProgrammer - "классный пацан" (C) Сара Коннор, нравится мне его манера ответов, вижу в нем свое зеркальное отражение.

TProgrammer   (02.08.05 16:45) [47]
Но речь не идет о том использовать асм или нет, а о том, что ты утверждаешь, что использование вызовов дельфийских функций из асма - плохой тон.


Да утверждаю, и ты даже вроде как согласился в [45]. Если же нет, тогда у тебя есть ошибки стилистики. (пиши грамотней)

> чем цитировать фразы не до конца.
Твоя мысль там процитирована ровно настолько насколько я ее понял по расставленным тобой знакам препинания.

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


 
TProgrammer   (2005-08-02 22:14) [50]


> Да утверждаю, и ты даже вроде как согласился в [45]. Если
> же нет, тогда у тебя есть ошибки стилистики. (пиши грамотней)

Это у тебя ошибки понимания (учись логике)

Мое мнение - я считаю, что применение ассемблера вообще не слишком оправдано, особенно в свете постепенного продвижения идеи мультиплатформенности в т.ч. и Borland"ом. Но если уж идет применение asm вставок, то вызов из них дельфийских функций, в особенности функций MemoryMenager"а.


> Твоя мысль там процитирована ровно настолько насколько я
> ее понял по расставленным тобой знакам препинания.

Еще одно непонимание.


> Вовсе нет, я правда рад, что человек, два месяца назад неумевший
> нормально создать форму, уже умеет читать асм код.

Я тебе по секрету скажу - я его еще и писать умею. А ты так до сих пор и не въехал в проблему 2-х месячной давности - сказать тут больше нечего.


> Искрене за тебя рад.

Взаимно.


 
Mx ©   (2005-08-02 22:33) [51]

Гы, прикольно, продолжайте в том же духе! Вот же до чего доводит ошибка в маленькой ассемблерной вставке :)


 
Defunct ©   (2005-08-02 22:34) [52]

> Это у тебя ошибки понимания (учись логике)
Которой логике? Если ты пишешь неграмотно.
"Казнить, нельзя помиловать."
"Казнить нельзя, помиловать."
прочитай теперь свое произведение [45].
> И совсем не значит, что так делать нельзя - и это плохой стиль.

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

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

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

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


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


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

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


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

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


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

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


 
Defunct ©   (2005-08-02 23:12) [54]

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

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

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

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


 
Defunct ©   (2005-08-02 23:24) [55]

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

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

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


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


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

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


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

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


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

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


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


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

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


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

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


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

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


 
Mx ©   (2005-08-02 23:57) [58]


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

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


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

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


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

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

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

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

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

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

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

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

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

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


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


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

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

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


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


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

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


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

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


> см [32].

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


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


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

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


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

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


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

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

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

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

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

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

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

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

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


 
Defunct ©   (2005-08-03 01:05) [64]

Mx ©   (03.08.05 00:41) [62]

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

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

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


 
Mx ©   (2005-08-03 01:14) [65]


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

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


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


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

Тут все зависит от профессиональности программиста, который эти вставки делает. Можно и на асме написать так, что работать будет тормознее, чем на делфи. А можно написать и с вызовом 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 ? Вот это я называю писать через ж...


 
Defunct ©   (2005-08-03 01:48) [67]

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:54) [68]


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

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


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

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


 
Defunct ©   (2005-08-03 02:15) [69]

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

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

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

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

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


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


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

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


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

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


 
Defunct ©   (2005-08-03 03:00) [71]

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

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

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

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

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


 
TProgrammer   (2005-08-03 03:17) [72]


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

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



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.71 MB
Время: 0.031 c
1-1122673855
murtix
2005-07-30 01:50
2005.08.21
Иконки в ListView


14-1122561701
Kerk
2005-07-28 18:41
2005.08.21
Скажем "НЕТ!" политике.


4-1119704859
vlk2005
2005-06-25 17:07
2005.08.21
Информация об установленное оборудование на компьютерах в ЛВС ?


14-1122694770
Vlad Oshin
2005-07-30 07:39
2005.08.21
наше дело правое Мы победим иеще г.СталинИВ изображен


14-1122292959
Fin
2005-07-25 16:02
2005.08.21
Мой самый первый компьютер...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский