ホーム › System.Diagnostics.Debug › XSAVE_FORMAT
XSAVE_FORMAT
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| ControlWord | WORD | 2 | +0 | +0 | x87 FPU制御ワード。 |
| StatusWord | WORD | 2 | +2 | +2 | x87 FPU状態ワード。 |
| TagWord | BYTE | 1 | +4 | +4 | x87 FPUタグワード(短縮形)。 |
| Reserved1 | BYTE | 1 | +5 | +5 | 予約バイト。0が入る。 |
| ErrorOpcode | WORD | 2 | +6 | +6 | 最後のFPU命令のオペコード。 |
| ErrorOffset | DWORD | 4 | +8 | +8 | 最後のFPU命令のオフセット(命令ポインタ)。 |
| ErrorSelector | WORD | 2 | +12 | +12 | 最後のFPU命令のセグメントセレクタ。 |
| Reserved2 | WORD | 2 | +14 | +14 | 予約ワード。 |
| DataOffset | DWORD | 4 | +16 | +16 | 最後のFPUデータオペランドのオフセット。 |
| DataSelector | WORD | 2 | +20 | +20 | 最後のFPUデータオペランドのセレクタ。 |
| Reserved3 | WORD | 2 | +22 | +22 | 予約ワード。 |
| MxCsr | DWORD | 4 | +24 | +24 | SSE制御/状態レジスタ(MXCSR)。 |
| MxCsr_Mask | DWORD | 4 | +28 | +28 | MXCSRの有効ビットを示すマスク。 |
| FloatRegisters | M128A | 128 | +32 | +32 | x87/MMXレジスタ(ST0-ST7)を格納するM128A配列。 |
| XmmRegisters | M128A | 128 | +160 | +160 | XMM0-XMM15レジスタを格納するM128A配列。 |
| Reserved4 | BYTE | 224 | +288 | +288 | 予約バイト配列。 |
各言語での定義
#include <windows.h>
// M128A (x64 16 / x86 16 バイト)
typedef struct M128A {
ULONGLONG Low;
LONGLONG High;
} M128A;
// XSAVE_FORMAT (x64 512 / x86 512 バイト)
typedef struct XSAVE_FORMAT {
WORD ControlWord;
WORD StatusWord;
BYTE TagWord;
BYTE Reserved1;
WORD ErrorOpcode;
DWORD ErrorOffset;
WORD ErrorSelector;
WORD Reserved2;
DWORD DataOffset;
WORD DataSelector;
WORD Reserved3;
DWORD MxCsr;
DWORD MxCsr_Mask;
M128A FloatRegisters[8];
M128A XmmRegisters[8];
BYTE Reserved4[224];
} XSAVE_FORMAT;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct M128A
{
public ulong Low;
public long High;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct XSAVE_FORMAT
{
public ushort ControlWord;
public ushort StatusWord;
public byte TagWord;
public byte Reserved1;
public ushort ErrorOpcode;
public uint ErrorOffset;
public ushort ErrorSelector;
public ushort Reserved2;
public uint DataOffset;
public ushort DataSelector;
public ushort Reserved3;
public uint MxCsr;
public uint MxCsr_Mask;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public M128A[] FloatRegisters;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public M128A[] XmmRegisters;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 224)] public byte[] Reserved4;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure M128A
Public Low As ULong
Public High As Long
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure XSAVE_FORMAT
Public ControlWord As UShort
Public StatusWord As UShort
Public TagWord As Byte
Public Reserved1 As Byte
Public ErrorOpcode As UShort
Public ErrorOffset As UInteger
Public ErrorSelector As UShort
Public Reserved2 As UShort
Public DataOffset As UInteger
Public DataSelector As UShort
Public Reserved3 As UShort
Public MxCsr As UInteger
Public MxCsr_Mask As UInteger
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Public FloatRegisters() As M128A
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Public XmmRegisters() As M128A
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=224)> Public Reserved4() As Byte
End Structureimport ctypes
from ctypes import wintypes
class M128A(ctypes.Structure):
_fields_ = [
("Low", ctypes.c_ulonglong),
("High", ctypes.c_longlong),
]
class XSAVE_FORMAT(ctypes.Structure):
_fields_ = [
("ControlWord", ctypes.c_ushort),
("StatusWord", ctypes.c_ushort),
("TagWord", ctypes.c_ubyte),
("Reserved1", ctypes.c_ubyte),
("ErrorOpcode", ctypes.c_ushort),
("ErrorOffset", wintypes.DWORD),
("ErrorSelector", ctypes.c_ushort),
("Reserved2", ctypes.c_ushort),
("DataOffset", wintypes.DWORD),
("DataSelector", ctypes.c_ushort),
("Reserved3", ctypes.c_ushort),
("MxCsr", wintypes.DWORD),
("MxCsr_Mask", wintypes.DWORD),
("FloatRegisters", M128A * 8),
("XmmRegisters", M128A * 8),
("Reserved4", ctypes.c_ubyte * 224),
]#[repr(C)]
pub struct M128A {
pub Low: u64,
pub High: i64,
}
#[repr(C)]
pub struct XSAVE_FORMAT {
pub ControlWord: u16,
pub StatusWord: u16,
pub TagWord: u8,
pub Reserved1: u8,
pub ErrorOpcode: u16,
pub ErrorOffset: u32,
pub ErrorSelector: u16,
pub Reserved2: u16,
pub DataOffset: u32,
pub DataSelector: u16,
pub Reserved3: u16,
pub MxCsr: u32,
pub MxCsr_Mask: u32,
pub FloatRegisters: [M128A; 8],
pub XmmRegisters: [M128A; 8],
pub Reserved4: [u8; 224],
}import "golang.org/x/sys/windows"
type M128A struct {
Low uint64
High int64
}
type XSAVE_FORMAT struct {
ControlWord uint16
StatusWord uint16
TagWord byte
Reserved1 byte
ErrorOpcode uint16
ErrorOffset uint32
ErrorSelector uint16
Reserved2 uint16
DataOffset uint32
DataSelector uint16
Reserved3 uint16
MxCsr uint32
MxCsr_Mask uint32
FloatRegisters [8]M128A
XmmRegisters [8]M128A
Reserved4 [224]byte
}type
M128A = record
Low: UInt64;
High: Int64;
end;
XSAVE_FORMAT = record
ControlWord: Word;
StatusWord: Word;
TagWord: Byte;
Reserved1: Byte;
ErrorOpcode: Word;
ErrorOffset: DWORD;
ErrorSelector: Word;
Reserved2: Word;
DataOffset: DWORD;
DataSelector: Word;
Reserved3: Word;
MxCsr: DWORD;
MxCsr_Mask: DWORD;
FloatRegisters: array[0..7] of M128A;
XmmRegisters: array[0..7] of M128A;
Reserved4: array[0..223] of Byte;
end;const M128A = extern struct {
Low: u64,
High: i64,
};
const XSAVE_FORMAT = extern struct {
ControlWord: u16,
StatusWord: u16,
TagWord: u8,
Reserved1: u8,
ErrorOpcode: u16,
ErrorOffset: u32,
ErrorSelector: u16,
Reserved2: u16,
DataOffset: u32,
DataSelector: u16,
Reserved3: u16,
MxCsr: u32,
MxCsr_Mask: u32,
FloatRegisters: [8]M128A,
XmmRegisters: [8]M128A,
Reserved4: [224]u8,
};type
M128A {.bycopy.} = object
Low: uint64
High: int64
XSAVE_FORMAT {.bycopy.} = object
ControlWord: uint16
StatusWord: uint16
TagWord: uint8
Reserved1: uint8
ErrorOpcode: uint16
ErrorOffset: uint32
ErrorSelector: uint16
Reserved2: uint16
DataOffset: uint32
DataSelector: uint16
Reserved3: uint16
MxCsr: uint32
MxCsr_Mask: uint32
FloatRegisters: array[8, M128A]
XmmRegisters: array[8, M128A]
Reserved4: array[224, uint8]struct M128A
{
ulong Low;
long High;
}
struct XSAVE_FORMAT
{
ushort ControlWord;
ushort StatusWord;
ubyte TagWord;
ubyte Reserved1;
ushort ErrorOpcode;
uint ErrorOffset;
ushort ErrorSelector;
ushort Reserved2;
uint DataOffset;
ushort DataSelector;
ushort Reserved3;
uint MxCsr;
uint MxCsr_Mask;
M128A[8] FloatRegisters;
M128A[8] XmmRegisters;
ubyte[224] Reserved4;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; XSAVE_FORMAT サイズ: 512 バイト(x64)
dim st, 128 ; 4byte整数×128(構造体サイズ 512 / 4 切り上げ)
; ControlWord : WORD (+0, 2byte) wpoke st,0,値 / 値 = wpeek(st,0)
; StatusWord : WORD (+2, 2byte) wpoke st,2,値 / 値 = wpeek(st,2)
; TagWord : BYTE (+4, 1byte) poke st,4,値 / 値 = peek(st,4)
; Reserved1 : BYTE (+5, 1byte) poke st,5,値 / 値 = peek(st,5)
; ErrorOpcode : WORD (+6, 2byte) wpoke st,6,値 / 値 = wpeek(st,6)
; ErrorOffset : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; ErrorSelector : WORD (+12, 2byte) wpoke st,12,値 / 値 = wpeek(st,12)
; Reserved2 : WORD (+14, 2byte) wpoke st,14,値 / 値 = wpeek(st,14)
; DataOffset : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; DataSelector : WORD (+20, 2byte) wpoke st,20,値 / 値 = wpeek(st,20)
; Reserved3 : WORD (+22, 2byte) wpoke st,22,値 / 値 = wpeek(st,22)
; MxCsr : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; MxCsr_Mask : DWORD (+28, 4byte) st.7 = 値 / 値 = st.7 (lpoke/lpeek も可)
; FloatRegisters : M128A (+32, 128byte) varptr(st)+32 を基点に操作(128byte:入れ子/配列)
; XmmRegisters : M128A (+160, 128byte) varptr(st)+160 を基点に操作(128byte:入れ子/配列)
; Reserved4 : BYTE (+288, 224byte) varptr(st)+288 を基点に操作(224byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global M128A
#field int64 Low
#field int64 High
#endstruct
#defstruct global XSAVE_FORMAT
#field short ControlWord
#field short StatusWord
#field byte TagWord
#field byte Reserved1
#field short ErrorOpcode
#field int ErrorOffset
#field short ErrorSelector
#field short Reserved2
#field int DataOffset
#field short DataSelector
#field short Reserved3
#field int MxCsr
#field int MxCsr_Mask
#field M128A FloatRegisters 8
#field M128A XmmRegisters 8
#field byte Reserved4 224
#endstruct
stdim st, XSAVE_FORMAT ; NSTRUCT 変数を確保
st->ControlWord = 100
mes "ControlWord=" + st->ControlWord