push %ebp
push %esp, %ebp
push edi
push esi
push ebx
なぜこれらのレジスタがスタックにプッシュされているこれらのレジスタはなぜスタックにプッシュされますか?
(のx86 32ビットLinuxの)?
何らかの理由で移行されました...?
しかし、なぜ 'edi' 'esi' 'ebx'だけがプッシュされますか?
push %ebp
push %esp, %ebp
push edi
push esi
push ebx
なぜこれらのレジスタがスタックにプッシュされているこれらのレジスタはなぜスタックにプッシュされますか?
(のx86 32ビットLinuxの)?
何らかの理由で移行されました...?
しかし、なぜ 'edi' 'esi' 'ebx'だけがプッシュされますか?
これは、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
その関数プロローグに押され、エピローグで再びポップされている理由「コールの時からコンテンツを含んでいなければならない」というフレーズは説明します。
あなたが探しているキーワードは、[ABI](https://en.wikipedia.org/wiki/Application_binary_interface)、特に[呼び出し規約](https://en.wikipedia.org/wiki/Calling_convention)です。 )。 –