gpt4 book ai didi

delphi - 将 ASM 与非 asm 代码组合(或需要 SwapInt64 ASM 函数)

转载 作者:行者123 更新时间:2023-12-03 15:39:47 29 4
gpt4 key购买 nike

我需要处理来自旧 Mac 时代(旧摩托罗拉 CPU)的文件。字节是大端字节序,所以我有一个函数可以将 Int64 交换为英特尔小端字节序。该函数是 ASM,可在 32 位 CPU 上运行,但不能在 64 位 CPU 上运行。对于 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,编译器都会正确编译/调用适当的函数。

最佳答案

您提出的建议完全没问题。这是一个相当合理的做法。

如果你想在 asm 中进行 64 位交换,对于 x64,这非常简单:

function SwapInt64(Value: Int64): Int64;
asm
MOV RAX,RCX
BSWAP RAX
end;

使用条件将其与 32 位版本结合起来,就像您在问题中所做的那样。

function SwapInt64(Value: Int64): Int64;
{$IF Defined(CPUX86)}
asm
MOV EDX,[DWORD PTR EBP + 12]
MOV EAX,[DWORD PTR EBP + 8]
BSWAP EAX
XCHG EAX,EDX
BSWAP EAX
end;
{$ELSEIF Defined(CPUX64)}
asm
MOV RAX,RCX
BSWAP RAX
end;
{$ELSE}
{$Message Fatal 'Unsupported architecture'}
{$ENDIF}

或者在 {$ELSE} block 中包含 Pascal 实现。

关于delphi - 将 ASM 与非 asm 代码组合(或需要 SwapInt64 ASM 函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33197523/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com