Сейчас на форуме: asfa, bartolomeo, hgdagon (+6 невидимых)

 eXeL@B —› Программирование —› Как понять эту строки (из Borland RTL)?
Посл.ответ Сообщение

Ранг: 11.4 (новичок)
Активность: 0=0
Статус: Участник

Создано: 07 февраля 2006 10:46
· Личное сообщение · #1

Я в Delphi ноль, поэтому прошу объяснить знающих людей некоторые строки из RTL (System.pas). Для начала чему равны refCnt, length и skew (и что в контексте последующего они вообще означают?)

type
PStrRec = ^StrRec;
StrRec = packed record
refCnt: Longint;
length: Longint;
end;

const
skew = SizeOf(StrRec);
rOff = SizeOf(StrRec); { refCnt offset }
overHead = SizeOf(StrRec) + 1;


и далее реализация функции в которой все это используется:

function InternalUniqueString(var str): Pointer;
asm
{ -> EAX pointer to str }
{ <- EAX pointer to unique copy }
MOV EDX,[EAX]
TEST EDX,EDX
JE @@exit
MOV ECX,[EDX-skew].StrRec.refCnt
DEC ECX
JE @@exit

PUSH EBX
MOV EBX,EAX
MOV EAX,[EDX-skew].StrRec.length
CALL _NewAnsiString
MOV EDX,EAX
MOV EAX,[EBX]
MOV [EBX],EDX
PUSH EAX
MOV ECX,[EAX-skew].StrRec.length
CALL Move
POP EAX
MOV ECX,[EAX-skew].StrRec.refCnt
DEC ECX
JL @@skip
LOCK DEC [EAX-skew].StrRec.refCnt
JNZ @@skip
LEA EAX,[EAX-skew].StrRec.refCnt { if refCnt now zero, deallocate}
CALL _FreeMem
@@skip:
MOV EDX,[EBX]
POP EBX
@@exit:
MOV EAX,EDX
end;


И вот тут возникает главный вопрос, КАК читать и понимать такого рода "конструкции":

MOV ECX,[EAX-skew].StrRec.refCnt

или

LEA EAX,[EAX-skew].StrRec.refCnt

Что это за точечная нотация???!!!!
Объясните пожалуйста!!!



Ранг: 384.1 (мудрец)
Активность: 0.250
Статус: Участник
www.int3.net

Создано: 07 февраля 2006 11:26
· Личное сообщение · #2

hypeartist
Давай думать логически:
skew - это размер нашей записи, значит EAX указывает на конец записи
и вычисляя: EAX-skew мы получаем указатель на начало записи
Тут идет обращение к полю refCnt
MOV ECX,[EAX-skew].StrRec.refCnt
то есть ECX:=StrRec.refCnt;

-----
Подписи - ЗЛО! Нужно убирать!




Ранг: 11.4 (новичок)
Активность: 0=0
Статус: Участник

Создано: 07 февраля 2006 13:42
· Личное сообщение · #3

хм... давай я изложу свое понимание (по крайней мере то что понял):

szTestString db "Test string",0
......
LEA EDX,WORD PTR DS:[szTestString]
MOV EAX,EDX
CALL OurFunction
......
;OurFunction
MOV EDX,[EAX] ;EDX=первые четыре байта (в обратном порядке), т.е: 74736554h
TEST EDX,EDX ;если строка пустая
JE @@exit ;выходим
MOV ECX,[EDX-skew].StrRec.refCnt ;согласно IDA это на самом деле MOV ECX, [EDX-8], т.е. мы что, пытаемся загрузить в ECX значение расположеное по адресу 74736554h-8 ????

Может я чего-то не понимаю? И откуда IDA взяла эту 8-ку? какой из Delphi'ийских переменнных оно соответствует?




Ранг: 199.6 (ветеран), 12thx
Активность: 0.10
Статус: Участник
www.uinc.ru

Создано: 07 февраля 2006 15:17 · Поправил: DrGolova
· Личное сообщение · #4

>Для начала чему равны refCnt, length и skew
Для начала refCnt равен -1, length равен 0 (или длине строки, если она непустая), skew - константа, равна 8

> (и что в контексте последующего они вообще означают?)
refCnt - счетчик ссылок на обьект String, когда становится отрицательным обьект удаляется
length - текущая длина строки
skew - размер служебного заголовка класса, как я уже сказал - константа

> И откуда IDA взяла эту 8-ку?
skew - размер структуры StrRec, т.е. 8 (восемь байт)
.StrRec.refCnt - офсет поля refCnt в структуре StrRec, т.е. 0 (ноль)
если верить школьной математике за второй класс
edx-8+0 = edx-8
тоесть
MOV ECX,[EDX-skew].StrRec.refCnt это mov ecx,[edx-8], что и требовалось доказать



Ранг: 11.4 (новичок)
Активность: 0=0
Статус: Участник

Создано: 08 февраля 2006 12:21
· Личное сообщение · #5

спасибо!!! более или менее разобрался!!! но, блин, как все-таки эти RTL'овские функции заморочены!!!


 eXeL@B —› Программирование —› Как понять эту строки (из Borland RTL)?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати