私はちょうどCでコードサンプルを書いて、それを逆アセンブルしようとしました。コードサンプルは次のとおりです。gcc stack optimization?
void start() {
char phone[100];
strcmp(phone, "12312312313");
char name[100];
strcmp(name, "eQuiNoX");
char contact[100];
strcmp(contact, "PM twitter.com/eQuiNoX__");
}
私はスタート機能を分解するとき、私は以下の取得: -
08048414 <start>:
8048414: 55 push ebp
8048415: 89 e5 mov ebp,esp
8048417: 81 ec 58 01 00 00 sub esp,0x158
804841d: c9 leave
804841e: c3 ret
- 私は最適化のいずれかの種類を有効にしていません。誰かが、スタックに値をプッシュして
strcmp
メソッドを呼び出すアセンブリコードではなく、158
をespから差し引いた理由を説明できますか?ユーザー入力に依存しないからですか? - また、
extended assembly
を生成する方法はありますか(正しいことがわからない場合、スタックに値をプッシュするアセンブリコードとstrcmp関数の呼び出しを見たいだけです)。私はそれを行うことができる方法はありますか? - プロセッサアーキテクチャまたはgccのバージョンに特有のこの種の動作ですか?
この最適化では、この種の惨事は理にかなっていますが、最適化が行われていないと奇妙に見えます。あなたは最適化がないのですか? – BlackBear
とにかく、strcmp()の結果を使用して、それらの配列を初期化してください。 – BlackBear
明示的に-O0を渡しましたか? -fno-builtinを渡しましたか? – Joshua