Сейчас на форуме: asfa, bartolomeo, hgdagon (+6 невидимых) |
eXeL@B —› Программирование —› Как понять эту строки (из Borland RTL)? |
Посл.ответ | Сообщение |
|
Создано: 07 февраля 2006 10:46 · Личное сообщение · #1 Я в Delphi ноль, поэтому прошу объяснить знающих людей некоторые строки из RTL (System.pas). Для начала чему равны refCnt, length и skew (и что в контексте последующего они вообще означают?) type
и далее реализация функции в которой все это используется: function InternalUniqueString(var str): Pointer;
И вот тут возникает главный вопрос, КАК читать и понимать такого рода "конструкции": MOV ECX,[EAX-skew].StrRec.refCnt
или LEA EAX,[EAX-skew].StrRec.refCnt
Что это за точечная нотация???!!!! Объясните пожалуйста!!! |
|
Создано: 07 февраля 2006 11:26 · Личное сообщение · #2 |
|
Создано: 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'ийских переменнных оно соответствует? |
|
Создано: 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], что и требовалось доказать |
|
Создано: 08 февраля 2006 12:21 · Личное сообщение · #5 |
eXeL@B —› Программирование —› Как понять эту строки (из Borland RTL)? |