Win32 API 日本語リファレンス
ホームSystem.Kernel › FLOATING_SAVE_AREA

FLOATING_SAVE_AREA

構造体
サイズx64: 112 バイト / x86: 112 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
ControlWordDWORD4+0+0x87 FPU制御ワード。
StatusWordDWORD4+4+4x87 FPUステータスワード。
TagWordDWORD4+8+8x87 FPUタグワード。レジスタの使用状況を示す。
ErrorOffsetDWORD4+12+12最後の浮動小数点命令のエラーオフセット。
ErrorSelectorDWORD4+16+16最後の浮動小数点命令のエラーセレクタ。
DataOffsetDWORD4+20+20オペランドのデータオフセット。
DataSelectorDWORD4+24+24オペランドのデータセレクタ。
RegisterAreaBYTE80+28+28x87 FPUレジスタ内容を格納する80バイト配列の先頭。
Spare0DWORD4+108+108

各言語での定義

#include <windows.h>

// FLOATING_SAVE_AREA  (x64 112 / x86 112 バイト)
typedef struct FLOATING_SAVE_AREA {
    DWORD ControlWord;
    DWORD StatusWord;
    DWORD TagWord;
    DWORD ErrorOffset;
    DWORD ErrorSelector;
    DWORD DataOffset;
    DWORD DataSelector;
    BYTE RegisterArea[80];
    DWORD Spare0;
} FLOATING_SAVE_AREA;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct FLOATING_SAVE_AREA
{
    public uint ControlWord;
    public uint StatusWord;
    public uint TagWord;
    public uint ErrorOffset;
    public uint ErrorSelector;
    public uint DataOffset;
    public uint DataSelector;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)] public byte[] RegisterArea;
    public uint Spare0;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure FLOATING_SAVE_AREA
    Public ControlWord As UInteger
    Public StatusWord As UInteger
    Public TagWord As UInteger
    Public ErrorOffset As UInteger
    Public ErrorSelector As UInteger
    Public DataOffset As UInteger
    Public DataSelector As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=80)> Public RegisterArea() As Byte
    Public Spare0 As UInteger
End Structure
import ctypes
from ctypes import wintypes

class FLOATING_SAVE_AREA(ctypes.Structure):
    _fields_ = [
        ("ControlWord", wintypes.DWORD),
        ("StatusWord", wintypes.DWORD),
        ("TagWord", wintypes.DWORD),
        ("ErrorOffset", wintypes.DWORD),
        ("ErrorSelector", wintypes.DWORD),
        ("DataOffset", wintypes.DWORD),
        ("DataSelector", wintypes.DWORD),
        ("RegisterArea", ctypes.c_ubyte * 80),
        ("Spare0", wintypes.DWORD),
    ]
#[repr(C)]
pub struct FLOATING_SAVE_AREA {
    pub ControlWord: u32,
    pub StatusWord: u32,
    pub TagWord: u32,
    pub ErrorOffset: u32,
    pub ErrorSelector: u32,
    pub DataOffset: u32,
    pub DataSelector: u32,
    pub RegisterArea: [u8; 80],
    pub Spare0: u32,
}
import "golang.org/x/sys/windows"

type FLOATING_SAVE_AREA struct {
	ControlWord uint32
	StatusWord uint32
	TagWord uint32
	ErrorOffset uint32
	ErrorSelector uint32
	DataOffset uint32
	DataSelector uint32
	RegisterArea [80]byte
	Spare0 uint32
}
type
  FLOATING_SAVE_AREA = record
    ControlWord: DWORD;
    StatusWord: DWORD;
    TagWord: DWORD;
    ErrorOffset: DWORD;
    ErrorSelector: DWORD;
    DataOffset: DWORD;
    DataSelector: DWORD;
    RegisterArea: array[0..79] of Byte;
    Spare0: DWORD;
  end;
const FLOATING_SAVE_AREA = extern struct {
    ControlWord: u32,
    StatusWord: u32,
    TagWord: u32,
    ErrorOffset: u32,
    ErrorSelector: u32,
    DataOffset: u32,
    DataSelector: u32,
    RegisterArea: [80]u8,
    Spare0: u32,
};
type
  FLOATING_SAVE_AREA {.bycopy.} = object
    ControlWord: uint32
    StatusWord: uint32
    TagWord: uint32
    ErrorOffset: uint32
    ErrorSelector: uint32
    DataOffset: uint32
    DataSelector: uint32
    RegisterArea: array[80, uint8]
    Spare0: uint32
struct FLOATING_SAVE_AREA
{
    uint ControlWord;
    uint StatusWord;
    uint TagWord;
    uint ErrorOffset;
    uint ErrorSelector;
    uint DataOffset;
    uint DataSelector;
    ubyte[80] RegisterArea;
    uint Spare0;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; FLOATING_SAVE_AREA サイズ: 112 バイト(x64)
dim st, 28    ; 4byte整数×28(構造体サイズ 112 / 4 切り上げ)
; ControlWord : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; StatusWord : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; TagWord : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; ErrorOffset : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; ErrorSelector : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; DataOffset : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; DataSelector : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; RegisterArea : BYTE (+28, 80byte)  varptr(st)+28 を基点に操作(80byte:入れ子/配列)
; Spare0 : DWORD (+108, 4byte)  st.27 = 値  /  値 = st.27   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global FLOATING_SAVE_AREA
    #field int ControlWord
    #field int StatusWord
    #field int TagWord
    #field int ErrorOffset
    #field int ErrorSelector
    #field int DataOffset
    #field int DataSelector
    #field byte RegisterArea 80
    #field int Spare0
#endstruct

stdim st, FLOATING_SAVE_AREA        ; NSTRUCT 変数を確保
st->ControlWord = 100
mes "ControlWord=" + st->ControlWord