CPUID命令のIntrinsic関数を使用して、SSEに対応しているか調べるコード

Posted on Sat 06 November 2010 in Windows

↓のコードをIntrinsic関数を使用して書き換えてみます。

CPUID命令を使用して、SSEに対応しているか調べるコード

__cpuid()

CPUID命令のIntrinsic関数は、

void __cpuid(
int CPUInfo[4],
int InfoType
);

です。
InfoTypeで数値を指定して、対応した情報がCPUInfoに入ります。
今回はSSEの対応情報を調べるので、InfoTypeには 1を入れます。

先頭をbit0として、次のように対応情報が格納され、
対応している場合はbitが1になっています。

  • CPUInfo[3] bit23 MMX
  • CPUInfo[3] bit25 SSE
  • CPUInfo[3] bit26 SSE2
  • CPUInfo[2] bit0 SSE3
  • CPUInfo[2] bit19 SSE4.1
  • CPUInfo[2] bit20 SSE4.2 :::

コード

#include <intrin …

Continue reading

ブレークポイントがヒットしない時の対処

Posted on Wed 17 March 2010 in Windows • Tagged with Windows

デバック時、リビルドしたソースにブレークポイントを設定しても、
ブレークポイントは、現在の設定ではヒットしません。ソースコード が元のバージョンと異なります。」
と表示されるときの対処

[「ツール」→「オプション」→「デバッグ」→「全般」を開き、「元のバージョンと完全に一致するソースファイルを必要とする」のチェックをはずす。]

http://www.langedge.jp/blog/?&blogid=1&archive=2006-6-14


C言語、32bit環境と64bit環境の変数のサイズ

Posted on Sat 13 March 2010 in Windows

32bit環境と64bit環境向けにコンパイルしたものを実行して、sizeofでサイズを調べた。

32bit 64bit
char 1 1
short 2 2
int 4 4
long 4 4
long long 8 8
float 8 8
double 8 8
long double 8 8

どうやら、32bit環境と64bit環境で変数サイズに違いは無いみたいだ。


WH_KEYBOARDのフックプロシージャサンプル

Posted on Sun 07 March 2010 in Windows

キーボードが押されてない状態から押された状態へ遷移した時と、押している状態から、押されていない状態へ遷移した時に、押されたキーの仮想コード、shift、ctrl、altのそれぞれの状態を表示するフックプロシージャのコード

WH_KEYBORDのフックプロシージャは、0を返すと他のフックプシージャやウィンドウメッセージを処理するウィンドウへメッセージを渡し、0以外を返すとメッセージを渡さない。

LRESULT KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  if(nCode < 0 || nCode == HC_NOREMOVE)
    return ::CallNextHookEx(m_hHook, nCode, wParam, lParam);

  ::OutputDebugString("keyboard hook! ");
  if((lParam & 0xc0000000) == 0xc0000000){
    UINT optChar = 0;
    //check keyup shift
    if(::GetKeyState(VK_SHIFT) >= 0){
      ::OutputDebugString("shift ");
    }
    //check keyup …

Continue reading

ローカルフック使用時にはスレッドIDが必要

Posted on Thu 11 February 2010 in Windows

ローカルフックを作成するには、
第3引数にNULL、第4引数にスレッドIDを指定する。

対して、グローバルフックの場合は、
第3引数にDLLモジュールのハンドル、第4引数に0を指定する。

//ローカルフックの作成
::SetWindowsHookEx(
  WH_GETMESSAGE,
  (HOOKPROC)hookfunc,
  NULL,
  ::GetCurrentThreadId());

プロセッサ数を求めるコード

Posted on Sat 14 November 2009 in Windows

GetSystemInfoでシステムの情報をSYSTEM_INFO構造体に取得すると、dwNumberOfProcessorsにプロセッサ数が入る。

SYSTEM_INFO si;
GetSystemInfo(&si);
si.dwNumberOfProcessors; //プロセッサ数

参考URL

http://msdn.microsoft.com/ja-jp/library/cc429808.aspx


画面の大きさを取得するWinAPI メモ

Posted on Wed 23 September 2009 in Windows

メイン画面の大きさを取得

int width = ::GetSystemMetrics(SM_CXSCREEN);
int height = ::GetSystemMetrics(SM_CYSCREEN);

マルチディスプレイ環境で全ての画面領域の大きさを取得

int width = ::GetSystemMetrics(SM_CXVIRTUALSCREEN);
int height = ::GetSystemMetrics(SM_CYVIRTUALSCREEN);

参考URL

http://msdn.microsoft.com/ja-jp/library/cc429812.aspx


インラインアセンブラでデバッグ時にレジスタの値を表示させる。

Posted on Sun 13 September 2009 in Windows

Visual Studioレジスタの値を表示させる。

デバッグ中に[デバッグ]→[ウィンドウ]→[レジスタ]で
レジスタウィンドウを開く。

SSEのレジスタなどが表示されていない場合は、レジスタウィンドウを
右クリックして、表示したいアイテムをクリックする。

参考URL

http://msdn.microsoft.com/ja-jp/library/aa290860%28VS.71%29.aspx


CPUID命令を使用して、SSEに対応しているか調べるコード

Posted on Sat 12 September 2009 in Windows

VC++のインラインアセンブラからCPUID命令を使用してSSEに対応しているか調べるコードを書きました。

CPUID命令

EAXレジスタに値を入れてCPUID命令を呼び出すと、
各レジスタにCPUの情報が格納されます。

  • EAX=0 ベンダIDの取得
  • EAX=1 プロセッサ情報とプロセッサの機能
  • EAX=2 キャッシュとTLBディスクリプタ情報
  • EAX=3 プロッセッサ・シリアル・ナンバ
  • EAX=80000000h サポートする最大拡張機能番号の取得
  • EAX=80000001h 拡張プロセッサ情報とプロセッサの機能
  • EAX=80000002h,80000003h,80000004h プロセッサブランド文字列
  • EAX=80000006h 拡張L2キャッシュ情報
  • EAX=80000008h 仮想アドレスと物理アドレスのサイズ

今回はSSEに対応しているか調べたいのでEAXには、1を入れてCPUID命令を呼び出します。

http://www.sandpile.org/ia32/cpuid …


Continue reading

ファイル検索関数サンプル

Posted on Tue 01 September 2009 in Windows

ディレクトリを指定してファイルを検索するWinAPIサンプル

HANDLE hFind;
WIN32_FIND_DATA fd;
char fpath[_MAX_PATH];
wsprintf(fpath, "hogehoge\\*.txt"); //txtファイルを検索
hFind = ::FindFirstFile(fpath, &fd);
if(hFind == INVALID_HANDLE_VALUE){//検索失敗
  ....
}
do{
  //ここでfd.cFileNameに検索結果のファイル名が入る。
  //ファイル名だけなので注意する。
}while(::FindNextFile(hFind, &fd));
::FindClose(hFind);