【问题标题】:GetThreadID in assembly汇编中的GetThreadID
【发布时间】:2023-03-24 05:54:02
【问题描述】:

看了FastMM4的源码,注意到了这个有趣的功能

function GetThreadID: Cardinal;
{$ifdef 32Bit}
asm
  mov eax, FS:[$24]
end;
{$else}
begin
  Result := GetCurrentThreadID;
end;
{$endif}

我已经对其进行了测试,并且它有效,所以我的问题是任何解释为什么它有效?

【问题讨论】:

  • 在 TEB 上还有另一个 must see linkMS documentation 对这个主题没用。
  • 相反,MS 文档非常好。由于这是私有实现,因此私有实现细节的正确文档策略是保持私有。
  • @DoctorLai,我很好奇,你为什么把用magic位移读取记忆称为“高效”?
  • @David Heffernan,有道理,但只有在这些私人细节公布之前。从什么时候开始,它就变成了记录不充分的细节。
  • @Doctor 你可以进入 winapi 调用。当然它使用 TEB。

标签: delphi x86 inline-assembly fastmm


【解决方案1】:

x86 寄存器 FS 在 Windows 中指向Thread Information Block。 TIB 中地址 FS+0x24 的值包含当前线程的 ID。通过将值移动到用于传递函数返回值的eax,GetThreadID返回当前线程ID。

【讨论】:

  • 它的效率可能稍微高一些,但我在这里告诉你,获取 PID 和 TID 并不是你程序的瓶颈。
  • @David,阅读 OP 的其他帖子,我认为 OP 根本没有瓶颈。他更喜欢极端优化之类的东西......也许:)
  • @kobik 这里有趣的是,GetCurrentThreadId 的实现只是读取了 TEB。我的意思是,它还能做什么?我不会接受问题中的代码到我的代码库中。
  • @doctorlai:如果你看看 winapi 是如何实现这一点的,它确实做了同样的事情......related stuff
  • @DoctorLai 为什么要节省函数调用开销?为什么不想要易于维护的简单代码?
【解决方案2】:

此方法使用Thread Environment Block中存储的信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2021-04-14
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多