Функция сборки Delphi, возвращающая длинную строку
Я пытаюсь изучить программирование встроенной сборки в Delphi, и с этой целью я нашелЭта статья очень полезно.
Теперь я хочу написать функцию сборки, возвращающую длинную строку, а именноAnsiString
(для простоты). Я написал
function myfunc: AnsiString;
asm
// eax = @result
mov edx, 3
mov ecx, 1252
call System.@LStrSetLength
mov [eax + 0], ord('A')
mov [eax + 1], ord('B')
mov [eax + 2], ord('C')
end;
Объяснение:
Функция, возвращающая строку, имеет невидимоеvar result: AnsiString
(в данном случае) параметр, поэтому в начале функции,eax
должен содержать адрес полученной строки. Я тогда установилedx
а такжеecx
до 3 и 1252, соответственно, а затем позвонитеSystem._LStrSetLength
, По сути, я делаю
_LStrSetLength(@result, 3, 1252)
где 3 - новая длина строки (в символах = байты), а 1252 - стандартокна-1252 кодовая.
Затем, зная, чтоeax
являетсяадрес первого символа строкиЯ просто установил строку в "ABC". Но это не работает - это дает мне бессмысленные данные или EAccessViolation. В чем проблема?
Теперь у нас есть две, казалось бы, работающие реализацииmyfunc
один нанимаетNewAnsiString
и один используетLStrSetLength
, Я не могу не задаться вопросом, верны ли они оба, в том смысле, что они не портят внутреннюю обработку строк в Delphi (подсчет ссылок, автоматическое освобождение и т. Д.).