· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.HEAP —› SomeStringRoutine

Посл.отвђт Сообщенiе


Дата: Окт 7, 2003 11:27:35

может кто знает, что делает следующий кусок кода (Делфи). на входе eax-указатель на строку. очень часто встречается в обработке строк...

CODE:00404248 SomeStringRoutine proc near
CODE:00404248
CODE:00404248 test eax, eax
CODE:0040424A jz short locret_404256
CODE:0040424C mov edx, [eax-8]
CODE:0040424F inc edx
CODE:00404250 jle short locret_404256
CODE:00404252 lock inc dword ptr [eax-8]
CODE:00404256
CODE:00404256 locret_404256:
CODE:00404256
CODE:00404256 retn
CODE:00404256 SomeStringRoutine endp


Дата: Окт 7, 2003 11:33:39

По этому коду видно, что если значение по адресу [eax-8] не положительное, то оно не инкрементируется. А что там за значение - х.з., если бы это была BSTR, то длина там по [eax-4] хранится.


Дата: Окт 7, 2003 11:40:34

вот, собственно, этот вопрос меня и интересует - что там за dword перед длиной лежит...


Дата: Окт 7, 2003 11:52:42

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


Дата: Окт 7, 2003 11:58:40

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


Дата: Окт 7, 2003 11:59:34

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


Дата: Окт 7, 2003 12:01:49

опа... сорри.. нафлудил... связь дерьмовая...


Дата: Окт 7, 2003 12:19:36

Ммм, скорее всего это увеличение счетчика использования (хозяев) строки, как станет нулем, строка будет считаться ничейной и класс строки будет удален.


Дата: Окт 7, 2003 12:33:32

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


Дата: Окт 7, 2003 12:39:29

а зачем проверка на отрицательное значение?
Затем, что 2 (или больше) потока могли одновременно уменьшить счетчик.


Дата: Окт 7, 2003 12:47:29

спасибо за ответы. думаю, разобрались :)))


Дата: Окт 7, 2003 13:00:17

Sickle
// %Delphiroot%\Source\Rtl\Sys\System.pas
...
function _LStrAddRef(var str): Pointer;
{$IFDEF PUREPASCAL}
var
  P: PStrRec;
begin
  P := Pointer(Integer(str) - sizeof(StrRec));
  if P <> nil then
    if P.refcnt >= 0 then
      InterlockedIncrement(P.refcnt);
  Result := Pointer(str);
end;
{$ELSE}
asm
        { ->    EAX     str     }
        TEST    EAX,EAX
        JE      @@exit
        MOV     EDX,[EAX-skew].StrRec.refCnt
        INC     EDX
        JLE     @@exit
   LOCK INC     [EAX-skew].StrRec.refCnt
@@exit:
end;
{$ENDIF}
...


Дата: Окт 7, 2003 13:08:16

н-да... а вот там я и не посмотрел... совсем ленивый стал :)))


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.071