私は、cプログラムから生成されたアセンブリコードの意味を見出そうとしています。ここにはC言語のプログラムがあります:コンパイラは無駄なアセンブリコードを生成できますか?
int* a = &argc;
int b = 8;
a = &b;
ここでは、説明付きで生成されたアセンブリコードを示します。メインの
プロローグ:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $36, %esp
ロード%eaxに中のargcのアドレス:
movl %ecx, %eax
一部私は取得しない:私は理解していない1つの部分があります
movl 4(%eax), %edx
movl %edx, -28(%ebp)
スタックスマッシングプロテクターコード(セットアップ):
aとbでのmovl %gs:20, %ecx
movl %ecx, -12(%ebp)
xorl %ecx, %ecx
負荷値(main.cの中で参照)
leal -20(%ebp), %eax
movl %eax, -16(%ebp)
スタックスマッシングプロテクタコード:
movl %eax, -16(%ebp)
movl $8, -20(%ebp)
は(A = & B)の値を変更します(スタックを確認okです):
movl $0, %eax
movl -12(%ebp), %edx
xorl %gs:20, %edx
je .L7
call __stack_chk_fail
スタックがOKの場合:
.L7:
addl $36, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
は、だから私は-28(%のEBP)の値を変更しているuinderstandていない部分は、アドレスが使用されることはありません。誰かがなぜこの部分が生成されているのか分かっていますか?
最適化せずにコンパイルすると(デフォルト)、コンパイラの出力には、必要ない場合でもすべてのロード/ストアがメモリに格納されます。あなたのコードを取り出し、 'main'以外の関数に入れて、' -O3'の最適化でコンパイルしてください。 –
main()を使わないでください。テスト中のコードを他の関数名にしてください。main()の質問は何度も尋ねられています。 –
最適化フラグを指定しないことで脳を消すようにコンパイラに指示しましたが、今は奇妙なコードが生成されるのでしょうか? – fuz