Функция сборки 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 (подсчет ссылок, автоматическое освобождение и т. Д.).

Ответы на вопрос(2)

Ваш ответ на вопрос