|
|
| Посл.отвђт | Сообщен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 |