アカウント名:
パスワード:
movl $5, %eax movl %eax, 4(%esp) movl $.LC0, (%esp) call printf
*n に入るべき値を %eax に代入しなおして、そっちを printf() に渡しているだけで。 実はその前の1行:
movl $5, (%eax)
が死ぬほどやばい。%eax は main() 関数に入ってきて以来、初期化されていない。その「どこを指しているんだかよく判らないもの」が指している所にドガンッと5を書いちゃってる
movl -8(%ebp), %eax movl $5, (%eax)
何処のアドレスを入れているのか興味を持ったので調べてみました。 ちなみに環境は,openbsd+gcc version 3.3.5 (propolice)です。 gcc -g -O test.cでコンパイルした場合。 nは初期化されず,textセグメント内の__finiを指し示していたので,当然Segmentation fault.で落ちました。
(gdb) b 6 Breakpoint 1 at 0x1c0005e1: file test.c, line 6. (gdb) r Starting program: /home/fooooooooo/a.out Breakpoint 1, main () at
オプティマイズされていないコードでは,5を代入する前にnの値を初期化しています。movl -8(%ebp), %eax movl $5, (%eax)
オプティマイズされていないコードでは,5を代入する前にnの値を初期化しています。
バーカ -8(%ebp) が n だっつーの。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
あと、僕は馬鹿なことをするのは嫌いですよ (わざとやるとき以外は)。-- Larry Wall
オプティマイザの魔法? (スコア:1)
もしかして無意識にオプティマイザに助けられていて意識するのを忘れていたとか?
-- やさいはけんこうにいちば〜ん!
Re: (スコア:3, 参考になる)
*n に入るべき値を %eax に代入しなおして、そっちを printf() に渡しているだけで。
実はその前の1行:
が死ぬほどやばい。
%eax は main() 関数に入ってきて以来、初期化されていない。
その「どこを指しているんだかよく判らないもの」が指している所にドガンッと5を書いちゃってる
fjの教祖様
Re: (スコア:0)
Re: (スコア:1, 興味深い)
何処のアドレスを入れているのか興味を持ったので調べてみました。
ちなみに環境は,openbsd+gcc version 3.3.5 (propolice)です。
gcc -g -O test.cでコンパイルした場合。
nは初期化されず,textセグメント内の__finiを指し示していたので,当然Segmentation fault.で落ちました。
Re: (スコア:0)
バーカ -8(%ebp) が n だっつーの。
Re:オプティマイザの魔法? (スコア:0)
両方とも,レジスタに割り付けられているものと,勘違いしてました。
出直してきます.... orz.