関数について教えて下さい。 投稿者:志穂 投稿日:2002/11/12(Tue) 14:42 No.71 | |
|
.type main,@function <-------- main: pushl %ebp <--------- movl %esp,%ebp <--------- movw $2,x movw $3,y movw x,%ax movw y,%dx movl %eax,%ecx addl %edx,%ecx movw %cx,z .L2: movl %ebp,%esp <------- popl %ebp <------- ret
関数のアセンブリソースを吐き出させるときまって矢印でしめした 命令が記述されています。これらはなんの為にあるんでしょうか? 無意味なことをやってるように思えて仕方ないのですが。
|
| Re: 関数について教えて下... 志穂 - 2002/11/12(Tue) 17:07 No.72 | |
|
|
[@/test]cat main.c int main(void) { int a,b,c; printf("Enter a,b:"); scanf("%d %d",&a,&b); intadd(a,b,&c); printf("Ans=%d\n",c); return 0; }
[@/test]cat intadd.s .file "intadd.s" .text .align 4 .globl intadd .type intadd,@function intadd: pushl %ebp movl %esp,%ebp movl 16(%ebp),%ebx movl 8(%ebp),%edx addl 12(%ebp),%edx movl %edx,(%ebx) movl %ebp,%esp popl %ebp ret [@/test]gcc -o main main.c intadd.s [@/test]./main Enter a,b:2 4 Ans=6 Segmentation fault <-------------------------- [@/test]
上記プログラムを実行すると Segmentation faultが 出力されます。 この警告文って、 読み込みオンリーなテキスト領域に書き込もうと した場合出力されますが。。。 ~ |
| Re: 関数について教えて下... jun - 2002/11/12(Tue) 17:43 No.73 | |
|
|
まず最初の質問について。
関数に引数を渡したり、局所変数を確保したりしない場合は無意味です。
言語処理系(コンパイラ)の仕様に依存すると思いますが、 関数が呼ばれた直後のスタックには、 関数の引数、戻りアドレス、 が積まれます。このときのスタックポインタの値をEBPに保存すると、 EBPを使ってスタック上に積まれている引数にアクセスできます。
普通はこの直後にESPを進めて(値を減じて)局所変数用のメモリを スタック上に確保します。こうするとEBPの上下に引数と局所変数が 存在するため、関数内から引数と局所変数をアクセスすることが容易 になります。また関数内で push/pop を使ってESPが変化しても スタック上の引数と局所変数へのアクセスに影響しません。
o EBPを保存 <------- o ESPをEBPに保存 <-------
o EBPを使って引数や局所変数にアクセス
o ESPをEBPから復帰 <------- o EBPを復帰 <-------
という感じになります。
引数や局所変数を使う関数の関数のアセンブリソースを見てください。 文章ではわかり難いと思いますから、「スタックフレーム」で検索する と図入りの解説がいろいろ見つかると思います。
|
|