K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
>>intの10要素の配列を3つほど宣言し、先頭アドレスを表示させてみたところ、 >>たしかに、あとから宣言したものほど、低いアドレスに置かれていますね… >> (linux x86_64, gcc 14.2.1) >>不思議… なんでなのでしょう? > >これはCの問題でもOSの問題でもなく、CPUの問題です。 >たいていのCPUにはサブルーチンコールのためのCALL命令があり、戻り先をスタックに >積みます。これは機械語レベルの命令なのですが、この時、スタックはアドレスが小さい方に >向けて伸びるCPUが多いと思います。たとえば、おっさんプログラマならだれでも知っている >大昔の8ビットCPU Z80(1976年発表)でも、CALLすると、スタックの先頭を指しているレジスタで >あるSPの値は減ります。 > >http://www.yamamo10.jp/yamamoto/comp/Z80/instructions/index.php#CALL_RETURN > >スタックがどちら向きに伸びるのかは、どっちでもよいようなものではありますが、 >限られたメモリの中でプログラムを書く場合、プログラマが管理する領域は上から下に、 >スタックは下から上に伸ばすようにしていけば、最後までメモリを使い切れる、という >事情はあったのではないかと思います。 >今のCPU/言語でも、ポインタ完全制覇のFig2-3にあるように、malloc()で伸びる領域と >スタックの領域の間には広大な空間があるわけです。 > >Wikipediaを見てみたら、以下の記述がありました。 >| 昔のコンピュータで、ヒープ領域をアドレスの小さいほうから大きいほうへ伸ばし、 >| スタックを大きいほうから小さいほうへ伸ばす(そのようにすると、メモリが足りない場合は >| どちらを伸ばす余裕もなく、完全にメモリを使い切って計算続行不可能となる)という >| 設計にした名残りから、アドレスの大きいほうから小さいほうへ伸びるものが多いが、 >| PA-RISCは逆である。 > >逆のものもあるようですね。 > >もっとも、Cの場合、スタックを「アドレスの小さい方へ」伸ばすようにした結果、 >バッファオーバーフロー脆弱性がずいぶんと狙いやすくなった、という実害が出ていますが…… >
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!