我目前有以下代码来支持从Win32保存在二进制文件中的10字节扩展值,并在其他平台上加载这些扩展值。然而,对于Android (它是ARM而不是INTEL),我需要一些代码来在10字节内存中进行10字节IEEE格式的转换,并在编译器中进行“扩展”类型(实际上是8字节的双精度类型)。
TYPE
TExtended = TExtended80Rec;
{$IFDEF INTEL64 }
PROCEDURE ExtendedToIEEE(VAR D : Extended ; VAR E : TExtended); ASSEMBLER;
ASM
FLD QWORD PTR [RCX]
FSTP TBYTE PTR [RDX]
FWAIT
END;
PROCEDURE IEEEToExtended(CONST E : TExtended ; VAR D : Extended); ASSEMBLER;
ASM
FLD TBYTE PTR [RCX]
FSTP QWORD PTR [RDX]
FWAIT
END;
{$ELSE }
PROCEDURE ExtendedToIEEE(D : Extended ; VAR E : TExtended);
BEGIN
{$IF SizeOf(Extended)=SizeOf(TExtended) }
MOVE(D,E,SizeOf(Extended))
{$ELSE }
!! MISSING !!
{$ENDIF }
END;
PROCEDURE IEEEToExtended(CONST E : TExtended ; VAR D : Extended);
BEGIN
{$IF SizeOf(Extended)=SizeOf(TExtended) }
MOVE(E,D,SizeOf(Extended))
{$ELSE }
!! MISSING !!
{$ENDIF }
END;
{$ENDIF }如果可能的话,我也希望能够从MacOS/Linux转换成16字节的“扩展”类型(除非16字节的大小“仅仅”是一个对齐,即。10字节填充到16)。
发布于 2020-02-03 21:42:56
在David的帮助下,我在上面的评论中提出了这一点,并在这里提供了它以供将来参考:
TYPE
TExtended = TExtended80Rec;
PExtended = ^TExtended;
{$IF SizeOf(Extended)=SizeOf(TExtended) }
PROCEDURE ExtendedToIntel(VAR D : Extended ; VAR E : TExtended); INLINE;
BEGIN
D:=Extended(E)
END;
PROCEDURE IntelToExtended(VAR E : TExtended ; VAR D : Extended); INLINE;
BEGIN
E:=TExtended(D)
END;
{$ELSEIF DEFINED(WIN64) }
PROCEDURE ExtendedToIntel(VAR D : Extended {Double} ; VAR E : TExtended); ASSEMBLER;
ASM
FLD QWORD PTR [RCX]
FSTP TBYTE PTR [RDX]
FWAIT
END;
PROCEDURE IntelToExtended(VAR E : TExtended ; VAR D : Extended {Double} ); ASSEMBLER;
ASM
FLD TBYTE PTR [RCX]
FSTP QWORD PTR [RDX]
FWAIT
END;
{$ELSE }
PROCEDURE ExtendedToIntel(D : Extended ; VAR E : TExtended);
BEGIN
PExtended(@E)^:=TExtended(D)
END;
PROCEDURE IntelToExtended(CONST E : TExtended ; VAR D : Extended);
BEGIN
D:=Double(PExtended(@E)^)
END;
{$ENDIF }
TYPE
TStreamHelper = CLASS HELPER FOR TStream
FUNCTION ReadExtended : Extended;
PROCEDURE WriteExtended(E : Extended);
END;
{$IF SizeOf(Extended)=SizeOf(TExtended) }
FUNCTION TStreamHelper.ReadExtended : Extended;
BEGIN
Read(Result,SizeOf(Extended))
END;
PROCEDURE TStreamHelper.WriteExtended(E : Extended);
BEGIN
Write(E,SizeOf(Extended))
END;
{$ELSE }
FUNCTION TStreamHelper.ReadExtended : Extended;
VAR
EX : TExtended;
BEGIN
Read(EX,SizeOf(TExtended));
IntelToExtended(EX,Result)
END;
PROCEDURE TStreamHelper.WriteExtended(E : Extended);
VAR
EX : TExtended;
BEGIN
ExtendedToIntel(E,EX);
Write(EX,SizeOf(EX))
END;
{$ENDIF }https://stackoverflow.com/questions/59987358
复制相似问题