● 関数リファレンス
FPU に例外を発生させる
void __stdcall floatex_raise_exception(int flags,int cflags);
引数
引数名 | 意味 |
flags | 対象の例外フラグ |
cflags | 条件コード C0 〜 C3 |
戻り値
無し
説明
FPU に浮動小数点例外を発生させます。
- flags には floatex_exceptionflags で指定する値と同じものを使用します。値は単独、または OR 接合で指定します。
- cflags には、各種例外に付随する情報を指定します。値は FEX_STAT_C0 〜 FEX_STAT_C3 を単独、または OR 接合で指定します。0 を指定した場合、条件コードは全てゼロになります。
- floatex_raise_exception を実行する直前の例外フラグはクリアされます。flags に 0 を指定すると、例外フラグをクリアした事と同じになります。
- 対象の例外がマスクされている場合は、例外処理へ移りません。
- スタックフォルトを指定した場合、無効操作例外も同時に設定されます。
- ラスト命令ポインタ等、最後に実行された命令に関する情報を使用する場合は、floatex_raise_exception の前で非制御型の命令を成功させてください(見かけ上、例外を発生した事にする処理。具体例は floatex_get_lastcmd のプログラム例参照の事)。
この関数は、汎用レジスタの内容を変えません。また、EFLAGS の内容を保存します。
テスト.
#include <stdio.h>
#include "floatex.h"
void except_info(void)
{
char **pptbl;
int flags;
FPU_STATUS_DW sw;
static char *tbl[] = {
"無効操作", "デノーマル", "ゼロ除算", "オーバーフロー",
"アンダーフロー", "不正確結果", "スタックフォルト", 0
};
sw.dword = floatex_get_status();
floatex_clear87();
flags = sw.dword & FEX_STAT_EXCEPTION;
pptbl = tbl;
do{
if (flags & 1)
printf("%s ",*pptbl);
pptbl++;
}while((flags >>= 1) != 0);
printf("\n");
printf("C0:%d C1:%d C2:%d C3:%d\n",
sw.bits.C0,sw.bits.C1,sw.bits.C2,sw.bits.C3);
}
#include <excpt.h>
void __cdecl main(void)
{
floatex_clear87();
floatex_loadcw(FEX_PC_64 | FEX_RC_NEAR);
__try{
floatex_raise_exception(FEX_STAT_IE,0);
}
__except(EXCEPTION_EXECUTE_HANDLER){
except_info();
}
floatex_reset();
}