function asm_strlen(s:string):integer; asm mov eax,dword ptr[eax-4] end;
Алгоритм предельно прост. Так как по умолчанию параметры передаются в регистрах, то указатель на нашу строку попадает в регистр EAX. И теперь мы копируем в EAX двойное слово, которое располагается по адресу EAX-4. Кстати изменить длину строки так же легко:
procedure asm_setlen(s:string;Size:Dword); asm mov dword ptr[eax-4],edx end;
Всё одно и тоже, только теперь мы из регистра записываем в пямять. Такими же методами, мы можем получить или устанавливать количество ссылок на строку, используя -8 смещение. Конечно, мы можем описать вышеприведённые действия и не прибегая к ассемблеру, но конструкции вида:
procedure(...) Dword(Pointer(Dword(Pointer(Str))-4)^) := size; end; ...
Нравятся не всем.
Кстати, таким нехитрым трюком можно брать значение по -8 адресу (кол-во указателей на строку). И даже менять это значение ;)
Комментариев нет:
Отправить комментарий