IT-Блог о программировании и операционных системах

Доступ к -4 смещению дельфовой строки

Часто слышишь о том, что по смещению -4 от начала строки находится двойное слово с её длиной и количеством ссылок по смещению -8. Но обычная конструкция вида string[-4]{[-8]} компилироваться категорически отказывается, тыкая мессагой про какие то там границы диапозонов… Но как так? Если в делфи строке там лежит длина, то почему её нельзя взять или изменить? На самом деле можно, и ещё как… Хотя компилятор и отказывается нас туда пускать, мы пойдём обходным путём, прибегнув к ассемблерным вставкам:
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 адресу (кол-во указателей на строку). И даже менять это значение ;)

Комментариев нет:

Отправить комментарий