Función de ensamblaje de Delphi que devuelve una cadena larga

Estoy tratando de aprender programación de ensamblaje en línea en Delphi, y con este fin he encontradoEste artículo Muy útil.

Ahora deseo escribir una función de ensamblaje que devuelva una cadena larga, específicamente unAnsiString (por simplicidad). he escrito

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;

Explicación:

Una función que devuelve una cadena tiene un invisiblevar result: AnsiString (en este caso) parámetro, entonces, al comienzo de la función,eax debe contener la dirección de la cadena resultante. Entonces puseedx yecx a 3 y 1252, respectivamente, y luego llamarSystem._LStrSetLength. En efecto, lo hago

  _LStrSetLength(@result, 3, 1252)

donde 3 es la nueva longitud de la cadena (en caracteres = bytes) y 1252 es el estándarwindows-1252 página de código.

Entonces, sabiendo queeax esla dirección del primer caracter de la cadena, Simplemente configuro la cadena en "ABC". Pero no funciona, me da datos sin sentido o EAccessViolation. ¿Cuál es el problema?

Actualizar

Ahora tenemos dos implementaciones aparentemente funcionales demyfunc, uno que empleaNewAnsiString y uno que empleaLStrSetLength. No puedo evitar preguntarme si ambos son correctos, en el sentido de que no estropean el manejo interno de cadenas de Delphi (conteo de referencias, liberación automática, etc.).