FromNandの日記

自分的備忘録

「C言語がどんなアセンブリに変換されるのか?」シリーズ

配列を持った構造体を値渡し・ポインタ渡ししてみる

ポインタ渡し #include<stdio.h> typedef struct { int a; int array[100]; } STR; void func(STR* str){ printf("%d, %d, %d\n", str->a, str->array[0], str->array[30]); return; } int main(void){ STR str; func(&str); return 0; } 結果のアセンブリはこちら 00</stdio.h>…

【C言語】配列にアクセスするコードをアセンブラレベルで覗いてみる

プリミティブなデータ型の一次配列の初期化・代入・参照を確認する #include<stdio.h> int main(void){ int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; array[1] = 5; printf("%d\n", array[8]); return 0; } このコードを逆アセンブルすると次のようになる。 内</stdio.h>…

【main関数の前の世界】スタートアップ関数を自作してみた!

はじめに main関数の前にはスタートアップ関数という物があり、スタートアップ関数ではアプリケーションの実行のための準備がされている。 かといって、スタートアップ関数は特別なプログラムではなく、実際にアプリケーションプログラマが自作することも可…

構造体をポインタ渡し・値渡し・ポインタ返し・値返しする場合のアセンブラ出力について

ポインタ渡しとポインタ返しについては、普通の配列などと同様のコードが生成される。値渡しについては、引数の部分に構造体のサイズ分のメモリが大胆に確保される。 つまり、4byteの変数と200byteのサイズの構造体を値渡しする場合、引数のサイズはなんと20…

戻り値がvoid型である関数で「return;」を書いた場合と書かない場合の違いについて

さて、前回の「main関数の「return 0;」について逆アセンブルして考察してみた - FromNandの日記」に続いて、今回はタイトルの通りの実験を行います。 まずは、「return;」を書いた場合のソースはこちらになります。 void func(void){ return; } このプログ…

main関数の「return 0;」について逆アセンブルして考察してみた

main関数の「return 0;」は、OSにプログラムが安全に終了したことを伝えるという意味合いを持つ。 しかし実際には、main関数の「return 0;」を書いていない人もしばしば見かける。 ということで、今回は「return 0;」を書くのと書かないのとではどのような違…

【C言語・アセンブリ】多次元配列のアクセスをアセンブラで見てみる

次のプログラムをアセンブルするといい。配列の各次元の要素数を変えてみると、プログラムが興味深く変化する。 #include<stdio.h> int main(void){ int i = 1, j = 2, k = 3; char a[10], b[10][10], c[10][10][10]; a[i] = 0xff; b[i][j] = 0xff; c[i][j][k] = 0xff</stdio.h>…