● 関数リファレンス
レジスタスタックのセット
void __stdcall floatex_set_regstack(PREGSTACK psrc,int b_clean_exception);
引数
引数名 | 意味 |
psrc | セットする情報を格納した REGSTACK 構造体の実体の先頭アドレス |
b_clean_exception | 例外フラグのクリア |
戻り値
無し
説明
psrc が指す REGSTACK 構造体の内容を、FPU のレジスタスタックにセットします。レジスタスタック関連以外の情報は、現在の状態を維持します。
REGSTACK 構造体については floatex_get_regstack を参照してください。
- メンバ stackfault の内容は無視されます。
- スタックトップ位置は、メンバ stacktop の値と 7 の論理積が設定されます。
- メンバ tag は、stacktop を使って物理レジスタ順に整列されます。ワード値は、最下位が ST(0) 、最上位が ST(7) として設定してください(floatex_get_stacktag の出力と同じフォーマット)。
- メンバ tag のタグワードと、メンバ reg の内容はチェックされません。呼び出し側プログラムは、tag と reg の整合性を取る必要があります。
b_clean_exception は、全例外フラグのクリアを指示します。クリアする場合は 0 以外、クリアしない場合は 0 を指定します。0 以外が指定された場合は、現在のステータスワードに対して 0x7f00 のマスクが掛かります。
この関数は、汎用レジスタの内容を変えません。また、EFLAGS の内容を保存します。
テスト.
#include <stdio.h>
#include <conio.h>
#include "floatex.h"
void print_reg(void); /* 「低水準操作」の「FPU 環境の保護」参照の事 */
void regstack_sort_descending(void);
void __cdecl main(void)
{
floatex_reset();
_asm{
mov ebx,dword ptr fex_const_5
fld tbyte ptr [ebx]
mov ebx,dword ptr fex_const_4
fld tbyte ptr [ebx]
mov ebx,dword ptr fex_const_3
fld tbyte ptr [ebx]
mov ebx,dword ptr fex_const_2
fld tbyte ptr [ebx]
mov ebx,dword ptr fex_const_1
fld tbyte ptr [ebx]
}
print_reg();
getch(); /* コンソール上のキー入力で一時停止を解除 */
regstack_sort_descending(); /* レジスタスタックの内容をソート */
print_reg();
getch();
floatex_stinit(1); /* プッシュした値を始末 */
print_reg();
getch();
floatex_ldstr_term();
floatex_reset();
}
#include <stdlib.h>
int __cdecl comp(const void *p1,const void *p2)
{
/*
floatex.dll の浮動小数点値を扱う関数は、大体がレジスタスタックを使用しま
す(一部例外あり)。比較でもレジスタスタックを使用するので、レジスタスタ
ックをフルに使用している場合は、スタックフォルトに注意してください。
*/
return -floatex_comp((PFLOATEX)p1,(PFLOATEX)p2);
}
/* レジスタスタックの内容を降順に整列する */
void regstack_sort_descending(void)
{
REGSTACK dat;
int cnt;
floatex_get_regstack(&dat); /* レジスタスタックの取得 */
/* 後続の処理でレジスタスタックを使用するので、内容をクリアする */
floatex_stinit(0);
/* 使用範囲を調べる */
cnt = 0;
do{
if (STACKTAG(dat.tag,cnt) == 3)
break;
}while(++cnt < 8);
if (cnt)
qsort(dat.reg,cnt,FLOATEX_SIZE,comp);
floatex_set_regstack(&dat,0); /* レジスタスタックのセット */
}
結果.
スタックトップ:R3
スタックフォルト:normal
ST(7):11 11 11 00 00 00 00 00:ST(0)
----------------------------------------------------
ST(0) : 1
ST(1) : 2
ST(2) : 3
ST(3) : 4
ST(4) : 5
ST(5) : 空
ST(6) : 空
ST(7) : 空
----------------------------------------------------
スタックトップ:R3
スタックフォルト:normal
ST(7):11 11 11 00 00 00 00 00:ST(0)
----------------------------------------------------
ST(0) : 5
ST(1) : 4
ST(2) : 3
ST(3) : 2
ST(4) : 1
ST(5) : 空
ST(6) : 空
ST(7) : 空
----------------------------------------------------
スタックトップ:R0
スタックフォルト:normal
ST(7):11 11 11 11 11 11 11 11:ST(0)
----------------------------------------------------
ST(0) : 空
ST(1) : 空
ST(2) : 空
ST(3) : 空
ST(4) : 空
ST(5) : 空
ST(6) : 空
ST(7) : 空
----------------------------------------------------