私は、Cコードから呼び出し可能でなければならないx86アセンブリの関数を書いています。呼び出し元に戻る前に復元する必要があるレジスタが不思議です。 現在、私はespとebpを復元していますが、戻り値はeaxです。 私が心配しなければならない他のレジスタはありますか?cでx86関数呼び出し後に復元されるレジスタは何ですか?
答えて
Microsoft's 32 bit ABI,EAX
,EDX
およびECX
をスクラッチレジスタとすると、その他はすべて保存する必要があります。 Windowsでx64の
、Microsoft saysあなただけRBX
、RBP
、RDI
、RSI
、R12
、R13
、R14
、およびR15
を復元する必要があります。
、そのRBP
、RBX
、RSP
、R12
、R13
、R14
、およびR15
(カーネルは、レジスタの1セットを使用し、ユーザランドのコードは、別のセットを使用しているため、彼らはこれがでて設定されている、奇妙に見えますABIドキュメンテーションの付録A)。
32-bit: EBX, ESI, EDI, EBP
64-bit Windows: RBX, RSI, RDI, RBP, R12-R15, XMM6-XMM15
64-bit Linux,BSD,Mac: RBX, RBP, R12-R15
詳しくは、Agner Fogの「Software optimization resources」を参照してください。呼び出し規約については、this pdfに記載されています。
RSP =) –
@StephenCanonとEIP/RIP :) –
忘れずに、私もそれを指摘するつもりでしたが、 'ret'命令があなたのために命令ポインタを処理します。 –
レジスタの状況が不明な場合は、以下の手順で簡単にその日を節約できます。
PUSHA/PUSHAD -- Push all General Registers
POPA/POPAD -- Pop all General Registers
これらの命令は、プッシュおよび特定のために、汎用およびSI/ESI、DI/EDIレジスタをポップ。
PUSHA/PUSHAD命令の順序は次のとおりです。
Opcode Instruction Clocks Description
60 PUSHA 18 Push AX, CX, DX, BX, original SP, BP, SI, and DI
60 PUSHAD 18 Push EAX, ECX, EDX, EBX, original ESP, EBP ESI, and EDI
POPA/POPAD命令の順序は次のとおりです。
Opcode Instruction Clocks Description
61 POPA 24 Pop DI, SI, BP, SP, BX, DX, CX, and AX
61 POPAD 24 Pop EDI, ESI, EBP, ESP(***),EBX, EDX, ECX, and EAX
(逆の順序で)*** ESP値が破棄される代わりのESPにロードされます。
'POPA'と' POPAD'命令は実際に(E)SPレジスタをポップしません!また、 'POPAD'のエラーを修正してください。あなたはEBXレジスタを忘れてしまいました。さらに、あなたは間違ってこれらの命令が*セグメントレジスタ*に触れていると言っています! –
- 1. 呼び出された関数から(元の関数で)javascript関数を呼び出していますか?
- 2. nasm x86-64からc関数を呼び出す
- 3. 呼び出し元(派生)関数は、呼び出し元(基本)関数の変数にC言語でどのようにアクセスできますか?
- 4. 呼び出された後、呼び出された関数はどのように呼び出し元に戻りますか?
- 5. コードがスキップされ、呼び出し元の関数に戻る
- 6. 直後の呼び出し元に再帰関数が返されない
- 7. MIPSアセンブリ言語、$ raレジスタは関数呼び出し後も保持されますか?
- 8. 関数のオーバーロード中に呼び出されるものは何ですか?
- 9. C#フォームがロードされるたびに呼び出す関数
- 10. jquery関数呼び出しを別の関数にラップする背後にある概念は何ですか?
- 11. 呼び出し元に基づくC++関数の内容
- 12. C関数呼び出し
- 13. C++では、参照渡しが呼び出し元ではなく呼び出される側
- 14. C#でOwin Token Authorizationの後に関数ハンドラを呼び出す
- 15. ビューの呼び出し後に関数を呼び出す
- 16. Native Starter Kitの関数呼び出し後のコロンは何ですか?
- 17. このES6構文とは何ですか?関数呼び出し後のコロン
- 18. 関数が返った後のespの値は何ですか? C/x86ので
- 19. 関数は30秒タイマーの後に呼び出されます
- 20. FuncAnimation関数が呼び出される原因は何ですか?
- 21. innerHTMLで呼び出されるJavascript関数でこれを呼び出す
- 22. Dart:関数から呼び出し元インスタンスにアクセスする
- 23. 関数$ openid-> validateの呼び出しは何ですか?
- 24. インライン関数呼び出しのメリットは何ですか?
- 25. 復元nuget:例外が呼び出し
- 26. 別の関数呼び出しで関数を呼び出す
- 27. Cのmain関数の呼び出し規約は何ですか?
- 28. 反復還元mapStateToPropsが2回呼び出されました
- 29. Delete関数を呼び出した後、vtkObjectのメンバー関数を呼び出すことは安全ですか?
- 30. vi/vimのCコードで関数の呼び出し元と呼び出し先を見つけるにはどうすればよいですか?
一般的な規則はありません。期待していることを確認するには、Cコンパイラのドキュメントを参照する必要があります。 –
私はJerryが正しいと確信しています。それは呼び出し規約に依存します。メモリが使えば、Windows、Posixなどでは「標準」の規約が異なります。どのコンパイラを使用していますか? –
gcc。私はこの検索http://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions(終了シーケンスを参照してください)が見つかりましたが、レジスタについては何も言わず、呼び出し元が予期していた状態に復元する必要があります。 – bobbaluba