Delphi Assembly-Funktion, die einen langen String zurückgibt
Ich versuche, Inline-Assembly-Programmierung in Delphi zu lernen, und zu diesem Zweck habe ich gefundenDieser Artike sehr hilfreich.
etzt möchte ich eine Assembly-Funktion schreiben, die eine lange Zeichenfolge zurückgibt, insbesondere einAnsiString
(der Einfachheit halber). Ich habe geschriebe
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;
Erläuterung
Eine Funktion, die einen String zurückgibt, hat ein unsichtbaresvar result: AnsiString
(in diesem Fall) Parameter, also am Anfang der Funktion,eax
sollte die Adresse des resultierenden Strings enthalten. Dann setze ichedx
undecx
bis 3 bzw. 1252, und rufen Sie dannSystem._LStrSetLength
. In der Tat mache ich
_LStrSetLength(@result, 3, 1252)
wo 3 ist die neue Länge des Strings (in Zeichen = Bytes) und 1252 ist der Standard windows-1252 Codepage
Then, zu wissen, dasseax
ist die Adresse des ersten Zeichens der Zeichenfolge, Ich setze einfach den String auf "ABC". Aber es funktioniert nicht - es gibt mir Unsinnsdaten oder EAccessViolation. Worin besteht das Problem
etzt haben wir zwei scheinbar funktionierende Implementierungen vonmyfunc
, einer mitNewAnsiString
und eine BeschäftigungLStrSetLength
. Ich frage mich, ob beide korrekt sind, in dem Sinne, dass sie Delphis internen Umgang mit Strings (Referenzzählung, automatisches Freigeben usw.) Nicht stören.