gpt4 book ai didi

delphi - 为什么在优化构建下有两次顺序移动到 EAX?

转载 作者:行者123 更新时间:2023-12-03 14:59:16 35 4
gpt4 key购买 nike

我查看了所有优化都打开的发布版本的 ASM 代码,这是我遇到的内联函数之一:

0061F854 mov eax,[$00630bec]
0061F859 mov eax,[$00630e3c]
0061F85E mov edx,$00000001
0061F863 mov eax,[eax+edx*4]
0061F866 cmp byte ptr [eax],$01
0061F869 jnz $0061fa83

代码非常容易理解,它在表中构建一个偏移量 (1),将其中的字节值与 1 进行比较,如果 NZ 则跳转。我知道指向我的表的指针存储在 $00630e3c 中,但我不知道 $00630bec 来自哪里。

为什么要一前一后地进行两次移动?第一个不是被第二个覆盖了吗?这可能是缓存优化的问题,还是我错过了一些令人难以置信的明显/模糊的东西?

上述ASM的Delphi代码如下:

if( TGameSignals.IsSet( EmitParticleSignal ) = True ) then [...]

IsSet()是一个内联类函数,调用TSignalManager的内联IsSet()函数:

class function TGameSignals.IsSet(Signal: PBucketSignal): Boolean;
begin
Result := FSignalManagerInstance.IsSet( Signal );
end;

信号管理器的最终IsSet是这样的:

function TSignalManagerInstance.IsSet( Signal: PBucketSignal ): Boolean;
begin
Result := Signal.Pending;
end;

最佳答案

我最好的猜测是 $00630bec 是对 TGameSignals 类的引用。您可以通过执行

来检查它
ShowMessage(IntToHex(NativeInt(TGameSignals), 8))

预优化代码可能是这样的

0061F854 mov eax,[$00630bec] //Move reference to class TGameSignals in EAX
0061F859 mov eax,[eax + $250] //Move Reference to FSignalManagerInstance at offset $250 in class TGameSignals in EAX

编译器将 [eax + $250] 优化为 [$00630e3c],但没有意识到之前的 MOV 不是必需的不再了。

我不是代码生成方面的专家,所以对此持保留态度......

顺便说一句,在delphi中,我们通常这样写<​​/p>

if TGameSignals.IsSet( EmitParticleSignal ) then

因为以下 IF 可能为真

var vBool : Boolean
[...]
vBool := Boolean(10);
if vBool and (vBool <> True) then

当然,这不是一个好的做法,但与 TRUE 进行比较也没有意义。

编辑:正如 Ped7g 所指出的,我错了。指令是

0061F854 mov eax,[$00630bec] 

而不是

0061F854 mov eax,$00630bec

所以我写的根本没有意义......第一条 MOV 指令用于传递“self”引用以调用 TGameSignals.IsSet。现在,如果该函数不是内联的,它将如下所示:

mov eax,[$00630bec]
call TGameSignals.IsSet

然后

*TGameSignals.IsSet
mov eax,[$00630e3c]
[...]

第一个 mov 仍然毫无意义,因为在 TGameSignals.IsSet 中没有使用“Self”,但仍然需要将“self”传递给函数。当例程被内联时,它确实看起来更愚蠢。

就像 Arnaud Bouchez 提到的那样,使 TGameSignals.IsSet 静态删除隐式 Self 参数,从而删除第一个 MOV 操作。

关于delphi - 为什么在优化构建下有两次顺序移动到 EAX?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45332786/

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