Função Delphi Assembly retornando uma string longa

Eu estou tentando aprender a programação de montagem em linha no Delphi, e para esse fim eu encontreiEste artigo altamente útil.

Agora, desejo escrever uma função de montagem retornando uma cadeia longa, especificamente umaAnsiString (Pela simplicidade). Eu tenho 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;

Explicação:

Uma função retornando uma string tem um valor invisívelvar result: AnsiString (neste caso), portanto, no início da função,eax deve conter o endereço da sequência resultante. Então eu colocoedx eecx para 3 e 1252, respectivamente, e depois chameSystem._LStrSetLength. Com efeito, eu faço

  _LStrSetLength(@result, 3, 1252)

onde 3 é o novo comprimento da sequência (em caracteres = bytes) e 1252 é o padrãowindows-1252 página de código.

Então, sabendo queeax éo endereço do primeiro caractere da sequência, Basta definir a string para "ABC". Mas isso não funciona - fornece dados sem sentido ou EAccessViolation. Qual é o problema?

Atualizar

Agora, temos duas implementações aparentemente funcionais domyfuncum empregandoNewAnsiString e um empregandoLStrSetLength. Não posso deixar de pensar se os dois estão corretos, no sentido de que eles não atrapalham o manuseio interno de strings do Delphi (contagem de referência, liberação automática, etc.).

questionAnswers(2)

yourAnswerToTheQuestion