Tag Archives: gcc

[gcc]CPUID命令を使用して、CPUの情報を取得する

2012年8月13日 (カテゴリ: C:)

IntelのCPUでは、CPUIDというアセンブラの命令を使用することで、CPUの情報を入手する事が出来ます。 ここでいうCPU情報というのは、CPUのシリーズや、対応している命令セット、キャッシュ容量、プロセッサシリアルNoなどが含まれます。 このCPUID命令、C言語で普通にプログラムしていてはコールする事が出来ませんが、インラインアセンブラを使用することで利用する事が可能です。 今回は、gccのインラインアセンブラである”__asm__”命令を使用して、CPUID情報を取得する方法を説明します。 C言語からCPUID命令をコールする まずは、CPUID取得のベース…


続きを読む

gccのアセンブル出力を解析する時は-gオプションが便利

2012年8月5日 (カテゴリ: C:)

アセンブラの勉強のために、gccで-Sオプションを使用してC言語のコードからアセンブラのコードを出力していたのですが、ソースコード中の何行目がどの出力に対応するのか分かり辛く、苦労していました。 もちろん注意深く読めば対応は分かるのですが、本質的でないところに時間が取られてしまい、本来の解析が出来なくなってしまうので非効率です。 と思ってたのですが、コンパイル時に-gオプションをつけ、デバッグ情報を付与させると、ソースとアセンブリの対応が出力される事に最近気づきました。 以下、試してみた結果です。 こちらがテストに使ったコード #include<stdio.h>   in…


続きを読む

[gcc]前置インクリメントと後置インクリメントで生成されるアセンブラコードの違い

2012年7月12日 (カテゴリ: C:, )

今回のお題: 以下の文脈で、前置インクリメントと後置インクリメントを行った。 生成されるアセンブラコードは、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; } 使用した…


続きを読む

[gcc]値を2進数で表記する

2012年7月6日 (カテゴリ: 未分類:)

C言語のプログラムでは”0x”の接頭語で16進数の値を指定可能ですが、gccでは”0b”の接頭語を付けることで2進表記を行うことができます。 プログラム printf( "%d\n", 0x6f ); printf( "%d\n", 0b01101111 ); 実行結果 111 111 ただしこの表記はgccで使用可能なもので、ANSI C標準では規格化されて無いです。 ですので、gcc以外のコンパイラを使用した場合、正しくコンパイルされない場合があり、ポータビリティが損なわ…


続きを読む

[gcc]long long intの値をprintfで表示させる

2012年6月25日 (カテゴリ: C:)

long long intで64bit整数値を格納した際に、その値をprintfで表示させる方法です。 普通に%dや%xで表示させようとしても、下位32bit分しか見てくれないので正しい値を表示させる事が出来ません プログラム #include <stdio.h>   int main() { long long int a = (long long int)1 << 63;   // NG: intとして表示 printf( "case1: %d\n", a ); &nb…


続きを読む

cygwinでgcc開発メモ

2012年6月14日 (カテゴリ: C:)

cygwin環境の確認(win7, x64) $ uname CYGWIN_NT-6.1-WOW64 とりあえずhello world $ cat test01.c #include <stdio.h> main() { printf( "hello world\n" ); } コンパイルしてexeの出力と実行 (cygwinでは、出力ファイル名を省略するとa.outではなくa.exeになる) $ gcc test01.c -o test01.exe $ ./test01.exe hello world アセンブラのコードに変換する $ gcc -S test0…


続きを読む