アセンブリとプログラミングの基本を理解しています。gccのバージョンが異なる単純なCプログラムのアセンブリコードが異なるのはなぜですか?
Iは
#include <stdio.h>
int main()
{
int a;
int b;
a = 10;
b = 88
return 0;
}
、次のコマンドでコンパイル、Cで簡単なプログラム次のコンパイル
GCC -ggdb -fno-スタックプロテクタtest.cの-o試験
逆アセンブルコードgccバージョン4.4.7の上記プログラムの場合:
5 push %ebp
89 e5 mov %esp,%ebp
83 ec 10 sub $0x10,%esp
c7 45 f8 0a 00 00 00 movl $0xa,-0x8(%ebp)
c7 45 fc 58 00 00 00 movl $0x58,-0x4(%ebp)
b8 00 00 00 00 mov $0x0,%eax
c9 leave
c3 ret
90 nop
ただし、 GCCバージョン4.3.3の同じプログラムのためのmbledコードは:
8d 4c 23 04 lea 0x4(%esp), %ecx
83 e4 f0 and $0xfffffff0, %esp
55 push -0x4(%ecx)
89 e5 mov %esp,%ebp
51 push %ecx
83 ec 10 sub $0x10,%esp
c7 45 f4 0a 00 00 00 00 movl $0xa, -0xc(%ebp)
c7 45 f8 58 00 00 00 00 movl $0x58, -0x8(%ebp)
b8 00 00 00 00 mov $0x0, %eax
83 c4 10 add $0x10,%esp
59 pop %ecx
5d pop %ebp
8d 61 fc lea -0x4(%ecx),%esp
c3 ret
なぜアセンブリコードに違いがありますか?
2番目の組み立てられたコードで分かるように、なぜ%ecxをスタックにプッシュするのですか?
and $0xfffffff0, %esp
の意義は何ですか?
注:OSは
なぜ違いはありませんか? –
2番目のコードは、デバッグバージョン – Asesh
@EugeneShのように見えます。質問の背後にある理由は、同じコードが同じコンパイラ出力を生成しなければならないからです。したがって、これらの実行可能ファイルはまったく同じコードから生成されたものと同じです。オブジェクトファイルがリンクされているライブラリが異なる可能性があるので、実行ファイル_は同じではないかもしれませんが、アセンブリはCから機械語への直接変換でなければなりません。 – ForceBru