2012-03-21 11 views
3
push %ebp 
push %esp, %ebp 
push edi 
push esi 
push ebx 

なぜこれらのレジスタがスタックにプッシュされているこれらのレジスタはなぜスタックにプッシュされますか?

(のx86 32ビットLinuxの)?
何らかの理由で移行されました...?
しかし、なぜ 'edi' 'esi' 'ebx'だけがプッシュされますか?

+2

あなたが探しているキーワードは、[ABI](https://en.wikipedia.org/wiki/Application_binary_interface)、特に[呼び出し規約](https://en.wikipedia.org/wiki/Calling_convention)です。 )。 –

答えて

5

これは、x86コードジェネレータのgcc実装の詳細です。驚いたことにそれのための良い文書を見つけることは難しい、私はかなり正確であるthis pageを見つけた。キーパーツ:ret命令の後

%eip contains return address 
%esp points at arguments pushed by caller 
called function may have trashed arguments 
%eax contains return value (or trash if function is void) 
%ecx, %edx may be trashed 
%ebp, %ebx, %esi, %edi must contain contents from time of call 

その関数プロローグに押され、エピローグで再びポップされている理由「コールの時からコンテンツを含んでいなければならない」というフレーズは説明します。

+0

"%eax、%ecx、%edxは"発信者保存 "レジスタ" – mctylr

+0

ありがとうございます! – hk0xwz

関連する問題