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

Aktualisiere

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.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage