【发布时间】:2015-10-18 11:39:13
【问题描述】:
我需要处理来自旧 Mac 时代(旧摩托罗拉 CPU)的文件。字节是大端的,所以我有一个将 Int64 交换为英特尔小端的功能。该功能是 ASM,适用于 32 位 CPU,但不适用于 64。对于 64 位,我有一个不是 ASM 的不同功能。我想使用 IFDEF 组合这些功能。我可以这样做吗?会不会有问题?
interface
function SwapInt64(Value: Int64): Int64; assembler;
implementation
{$IFDEF CPUx86}
function SwapInt64(Value: Int64): Int64; assembler; { Does not work on 64 bit } {
asm
MOV EDX,[DWORD PTR EBP + 12]
MOV EAX,[DWORD PTR EBP + 8]
BSWAP EAX
XCHG EAX,EDX
BSWAP EAX
end;
{$else}
function SwapInt64 (Value: Int64): Int64;
var P: PInteger;
begin
Result: = (Value shl 32) or (Value shr 32);
P: = @Result;
P ^: = (Swap (P ^) shl 16) or (Swap (P ^ shr 16));
Inc (P);
P ^: = (Swap (P ^) shl 16) or (Swap (P ^ shr 16));
end;
{$ENDIF}
我认为无论一个是 ASM 而另一个是 Pascal,编译器都会正确编译/调用相应的函数。
【问题讨论】:
-
Mac 也使用小端序。您是否真的在寻找网络来托管功能?为什么你觉得有必要重新实现它们?为什么要使用asm?这不是给你带来麻烦的原因吗?如果您使用 Pascal,您会在家干吗?
-
@DavidHeffernan-对不起。我的意思是“老麦克”。大端(sparc)的那个。
-
@DavidHeffernan - 请参阅与数据来源相关的说明(旧 mac)
-
除非性能很重要,否则我会使用 Pascal。
-
@DavidHeffernan-ASM 函数应该更快。对?如果可能的话,我想将 asm 保持在 32 位。文件可能很大(1-40GB)。并且所有数据都需要交换!!!!!!! asm 函数可能会提高一点速度。
标签: delphi assembly pascal inline-assembly