Posted on 2019/04/25, 9:44 PM By admin22
アセンブリ言語で、C言語の戻り値がどのように記述されているか、調べてみました。理由は、最近returnを書き忘れるミスをしてしまったのに、プログラムが正常に動いていることに驚いたからです。
環境: Ubuntu 18.04
1 2 3 4 5 6 7 8 9 10 11 12 |
#include<stdio.h> int func() { int a = 3; int b = 5; int c = a + b; } int main() { printf("ret:%d\n", func()); } |
このプログラム、func関数の最後に” return c; “の記述が必要になりますが、これがあるときのアセンブラが左、ないときが右になります。
(cc -S test.c でアセンブラを出力できます)
コードを見ていくと、演算する数値をスタックに積んで、レジスタに移動してから演算をし、その結果をレジスタに書き込みます。関数から抜ける前にレジスタに演算結果を書き込むか書き込まないかの違いのみあります。演算結果を書き込まなくても、func関数の結果を利用するときたまたま同じレジスタに値があるので、結果が同じになった、ということのようです。
1 2 3 4 5 6 7 8 9 10 |
#include<stdio.h> int func() { int c = 8; } int main() { printf("ret:%d\n", func()); } |
当然ですが、上のような例では下のようなコードになり、値が正しく表示されません。
Rubyのような言語では、最後に演算した結果が戻り値になりますが、Cも? と一瞬戸惑いました。
長年プログラマをやってきましたが、こんな基本的なことに戸惑うとは・・まだまだです。
アセンブラを久しぶりに見る機会になったのはよかったかも。。
関連記事
Categories: 未分類 タグ: Assembly