ウィキペディアによると、Intel ABIは、関数内でそれらを保存せずにEAX
、を使用することを許可しています。
「IntelABI」の意味がわかりません。これは、Intel CPUを対象とするすべてのコンパイラによって強制/フォローされることを意味しますか?Cコードから呼び出されるアセンブリ関数を書いています。すべてのコンパイラでこれを想定できますか?(現時点ではターゲットにしています)ECX
EDX
x86
2 に答える
Intel ABIは、Intelによって確立された単なる呼び出し規約です。
一般に、関数の呼び出し中にパラメーターがどのように渡され、どのレジスターが保存または破棄されるかは、関数の呼び出し規約によって定義されます。
http://en.wikipedia.org/wiki/Calling_convention
特に__cdecl、__ stdcall、および__fastcallの場合、EAX、ECX、およびEDXが破棄されることを期待し、関数は他のレジスタを保持してEAX(または64ビットリターンの場合はEDX:EAX)に戻る必要があります。
使用すべき呼び出し規約がわからない場合は、アセンブリで記述しないでください。呼び出し規約を台無しにすると、アプリケーションに悪用可能なバグが発生する可能性があります。
Cでは、デフォルトの呼び出し規約は通常__cdeclであり、WindowsでエクスポートされたAPIの場合は通常__stdcallです。
It's the Intel Application Binary Interface, a set of rules dictating things like what registers are available for use without saving, how arguments are pushed on the stack, whether caller or callee cleans up the stack frames and so on.
If you know that the rules are being followed, that's fine. I tend to save everything just in case (other than those things I'm using for returning information of course).
But it's not necessarily enforced for all compilers and you would be unwise to think so unless the compiler specifically states it.