● 関数リファレンス

レジスタスタックのセット

    void __stdcall    floatex_set_regstack(PREGSTACK psrc,int b_clean_exception);

引数

引数名意味
psrcセットする情報を格納した REGSTACK 構造体の実体の先頭アドレス
b_clean_exception例外フラグのクリア

戻り値

無し

説明

psrc が指す REGSTACK 構造体の内容を、FPU のレジスタスタックにセットします。レジスタスタック関連以外の情報は、現在の状態を維持します。

REGSTACK 構造体については floatex_get_regstack を参照してください。


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) : 空
----------------------------------------------------