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?
Agora, temos duas implementações aparentemente funcionais domyfunc
um 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.).