私はDelphiでインラインアセンブリプログラミングを学ぼうとしていますが、この目的のために、この記事は非常に役に立ちました。
AnsiString
ここで、長い文字列、具体的には(簡単にするために)を返すアセンブリ関数を記述したいと思います。私は書いた
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;
説明:
文字列を返す関数には非表示var result: AnsiString
(この場合)のパラメーターがあるため、関数の先頭でeax
、結果の文字列のアドレスを保持する必要があります。次に、とをそれぞれ3と1252に設定edx
してから、を呼び出します。事実上、私はしますecx
System._LStrSetLength
_LStrSetLength(@result, 3, 1252)
ここで、3は文字列の新しい長さ(文字数=バイト)であり、1252は標準のwindows-1252コードページです。
次に、それが文字列の最初の文字のアドレスであるeax
ことを知って、文字列を「ABC」に設定するだけです。しかし、それは機能しません-それは私にナンセンスなデータまたはEAccessViolationを与えます。何が問題ですか?
アップデート
これで、2つの一見機能している実装がありますmyfunc
。1つはを採用しNewAnsiString
、もう1つはを採用してLStrSetLength
います。Delphiの文字列の内部処理(参照カウント、自動解放など)を台無しにしないという意味で、両方が正しいかどうか疑問に思わざるを得ません。