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?
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.).