13

Delphiプロシージャまたは関数をアセンブリコードで記述する場合、プロシージャの最後にどのレジスタを保存して元の値に復元する必要がありますか?

(インライン)アセンブリコードから別のDelphiプロシージャまたは関数を呼び出す場合、他の関数がレジスタを処理することを期待できますか?どのレジスタが元の値に復元され、どのレジスタが復元されない可能性がありますか?

(明らかに、同じ答えが両方の質問に当てはまります)

Delphiのデフォルトの呼び出し規約を想定しています。私はそれEAXが32ビットの戻り値に使用されていることを知っています。また、SysUtils.pasのasmコードを見ると、、がプッシュおよび復元されているように見えますEBXESIEDI他のコードはそうではありません。ただし、これに関するドキュメントは見つかりません。

4

2 に答える 2

11

関数の最初の3つの引数は、それぞれ、、、およびで与えEAXられEDXますECX。追加の引数がスタックにプッシュされます。オブジェクトのメソッドの場合、Selfポインターは常に(非表示の)最初のパラメーターです。結果はになりEAXます。長い文字列を返す関数の場合、関数の(非表示の)最後のパラメーターは、結果の文字列へのポインターです(これ自体が文字列の最初の文字へのポインターです)。

EBX(プロシージャ/関数の終了前に復元しない限り)変更してはなりませんESP。したがって、、、、、またはそのいずれかEBPを変更してはなりません。(1) DelphiインラインASMの優れた紹介は、以前はここにありました:http ://www.delphi3000.com/articles/article_3766.aspESIEDI

于 2010-08-24T14:41:52.177 に答える
4

ドキュメントが最新かどうかはわかりませんが、Embarcardero Wikiでインラインアセンブリコードの使用(Win32のみ)を確認する必要があります。

引用:

一般に、asmステートメントでのレジスタの使用規則は、外部プロシージャまたは関数の規則と同じです。asmステートメントは、EDI、ESI、ESP、EBP、およびEBXレジスターを保持する必要がありますが、EAX、ECX、およびEDXレジスターを自由に変更できます。asmステートメントに入ると、EBPは現在のスタックフレームを指し、ESPはスタックの最上位を指します。ESPとEBPを除いて、asmステートメントは、ステートメントへのエントリ時にレジスタの内容について何も想定できません。

于 2010-08-24T14:36:09.833 に答える