[gcc]前置インクリメントと後置インクリメントで生成されるアセンブラコードの違い
今回のお題: 以下の文脈で、前置インクリメントと後置インクリメントを行った。 生成されるアセンブラコードは、iとjでどう変わるのか? #include <stdio.h> int main() { int i = 0; int j = 0; for ( i = 0, j = 0; i < 5 ; ) { printf( "ptn2 i = %d, j = %d\n", ++i, j++ ); } return 0; }#incl…
続きを読む
[C言語]printfの後の入力待ちで入力バッファがクリアされる理由
C言語の入門者向けに書かれた書籍を見ると、以下のようなプログラムが良く有ります。 #include<stdio.h> int main() { int value; printf( "数字を入力して下さい:" ); scanf( "%d", &value ); printf( "入力値は%dです\n", value ); return 0; }#include<stdio.h> int main() { i…
続きを読む
gdbによるデバッグのチュートリアル その2
前回の続きです。 gdbによるデバッグのチュートリアル その1 今回は、レジスタ値の確認方法と、Intelアーキテクチャにおけるスタックの使用方法をみていきます。 レジスタ一覧はinfo registerで確認できます。 (gdb) info register eax 0x14 20 ecx 0xbffff924 -1073743580 edx 0xbffff8b4 -1073743692 ebx 0x2a8ff4 2789364 esp 0xbffff860 0xbffff860 ebp 0xbffff888 0xbffff888 esi 0x0 0 edi 0x0 0 eip 0x8048…
続きを読む
gdbによるデバッグのチュートリアル その1
gccで作ったC言語のプログラムを、gdbコマンドを使用してデバッグしてみます。 今回の実験環境は以下の通り。 linux環境でテストしてますが、cygwinでも問題なく動作するはずです… $ gcc –version gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 $ gdb –version GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08 $ uname -a Linux linuxmint 3.0.0-12-generic #20-Ubuntu SMP Fri …
続きを読む
[C言語入門]処理の内容をif文で分岐させる
前回までのサンプルで確認したように、C言語のプログラムは基本的に上から書いた順に関数が実行されていく形で動作します。 一連の作業を順に行うだけならこれで構わないのですが、プログラムによっては状況に応じて処理を分岐したい場合も出てきます。 このような場合は、if文による処理分岐を行います。 というわけで、今回のサンプルはこちらです。 点数を入力し、60点以上なら合格、60点未満なら不合格と表示するプログラムです。 #include <stdio.h> int main() { int score; printf( &quo…
続きを読む