質問

アセンブリコードでDelphiの手順または機能を作成するときは、保存して手順の最後に元の値に復元する必要がありますか?

(インライン)アセンブリコードから別のDelphi手順または関数を呼び出すとき、他の関数がレジスタで行うことは何を期待できますか?元の値に復元されるレジスタはどれですか?

(明らかに、同じ答えが両方の質問に当てはまるでしょう)

私はと仮定しています デフォルトの呼び出しコンベンション デルフィの。そんなこと知ってる EAX 32ビットの戻り値に使用されます。 sysutils.pasのASMコードを見ると、 EBX, ESIEDI プッシュされて復元されますが、他のものはそうではありません。ただし、これに関するドキュメントは見つかりません。

役に立ちましたか?

解決

関数の3つの最初の議論は EAX, EDX, 、 と ECX, 、 それぞれ。追加の引数がスタックに押し上げられます。オブジェクトの方法の場合、 Self ポインターは常に(目に見えない)最初のパラメーターです。結果は次のとおりです EAX. 。長い文字列を返す関数の場合、(見えない) 過去 関数のパラメーターは、結果の文字列へのポインターです(それ自体が文字列の最初の文字へのポインターです)。

EBX 変更してはなりません(手順/機能の終了前に復元しない限り)。 ESP, EBP, ESI, 、 また EDI また。(1) DelphiインラインASMの優れた紹介は、以前にここにありました: http://www.delphi3000.com/articles/article_3766.asp

他のヒント

ドキュメントが最新かどうかはわかりませんが、 インラインアセンブリコードの使用(Win32のみ) EmbarCarderoWikiで:

引用:

一般に、ASMステートメントでのレジスタ使用のルールは、外部手順または関数の規則と同じです。 ASMステートメントは、EDI、ESI、ESP、EBP、およびEBXレジスタを保存する必要がありますが、EAX、ECX、およびEDXレジスタを自由に変更できます。 ASMステートメントへの入力時に、EBPは現在のスタックフレームを指し、ESPはスタックの上部を指します。 ESPとEBPを除き、ASMステートメントは、ステートメントへのエントリ時に登録コンテンツについて何も想定できません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top